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.