2017-07-18 5 views
1

Ich versuche, MXNet zu verwenden, um eine beschränkte Optimierung durchzuführen, die nicht Backpropogation in einem Feedforward-Netzwerk ist, aber ähnliche Berechnungen, Produkte von großen Arrays, einige Gradientabstieg, etc ...Gradientenabstieg mit MXNet NDArray

um zum Beispiel der Spur von M-2 * Id zu minimieren, wie M die Menge von orthogonalen Matrizen variiert, ich numpy und scipy verwenden könnte, dies zu tun, indem die Matrizen Vektorisierung, wie in dem folgenden:

import numpy as np 
from scipy.optimize import minimize 

# make matrix to vector and vector to matrix functions 
def toVector(m): 
    return np.hstack(m.flatten()) 
def toMatrix(vec): 
    return vec[:4*4].reshape(4,4) 

# Define objective function to minimize 
def f(x): 
    matM=toMatrix(x) 
    return(np.trace(matM-2*np.identity(4))) 

# Define the constraint that X be orthogonal, i.e. X X^t = I 
cons = ({'type': 'eq', 
    ... 'fun' : lambda x: np.array(np.linalg.norm(
    ... np.dot(toMatrix(x),np.transpose(toMatrix(x)))-np.eye(4))) 
    ... }) 

# Define an initial point randomly 
m0=np.random.rand(4,4) 

# And minimize 
result = minimize(f, toVector(m0), constraints=cons, 
    ... method='SLSQP', options={'disp': True}) 
toMatrix(result.x) 

Angenommen, ich mache diese Art von Berechnung für NxN-Matrizen, wobei N groß ist, und ich möchte die Berechnung mehrmals wiederholen, indem ich einige Par-Werte aktualisiere Verbesserungen. Gibt es eine gute Möglichkeit, diese eingeschränkte Optimierung mithilfe von MXNet zu verwenden, um GPU-Kerne zu bearbeiten, Einschränkungsgradienten usw. zu berechnen, ohne die Eingabe zu vektorisieren und eine in simple-gradient-descent-using-mxnet beschriebene Feedforward-Netzwerkumgehung zu verwenden.

Antwort

1

Sie müssen kein neuronales Netz Teil von MxNet verwenden, um GPU zu verwenden. Sie können auch die Vektorisierung vermeiden, aber Ihr Code wird aufgrund der Synchronisation zwischen CPU und GPU langsamer.

Verwenden von Mxnet für benutzerdefinierte Mathematik auf GPU ist einfach. Sie beschränken nur Ihre Berechnungen mit Operationen auf NDArray. Diese Datenstruktur ist der NumPy sehr ähnlich, unterstützt jedoch die Ausführung auf CPU-, GPU- und Multiple-GPUs.

Das bedeutet, dass, solange Sie Funktionen von mx.nd. * und bieten mx.gpu() als Ausführungskontext, würde Ihre Mathematik auf GPU ausgeführt werden. Das bedeutet auch, dass Sie nichts von NumPy verwenden können, da NumPy nur auf der CPU ausgeführt wird. Sie können nach wie vor „für“ und verwenden „wenn“ Aussagen Vektorisierung zu vermeiden, aber da der Steuerablauf auf der CPU durchgeführt, und es wird hin und her zu GPU für die Synchronisation gehen.

Bitte lesen Sie diesen Abschnitt der Beispiele https://mxnet.apache.org/tutorials/basic/ndarray.html#advanced-topics, um zu sehen, wie man mit GPU mit NDArray rechnen kann.