ちょっとしたコンテキスト:私は、Cifar-10データセットの画像分類のために3層のニューラルネットワーク(1つの隠れたレイヤー)を実装しようとしています。私はバックプロパゲーションを実装していましたが、もともと勾配降下を使用してネットワークを訓練しましたが、私のコストは約40程度でした(事実上無意味な推測の同じ速度で新しいイメージを効果的に分類します)。神経ネットワークの最適化が失敗する(Scipy fmin_cgを使用)
次に、scipy.optimize.fmin_cg
機能を使用してネットワークをトレーニングしようとしました。私は展開された重みを関数に渡し、関数backpropagationは、関数の入力要件を満たす勾配に対して同じサイズのベクトルを返します。
機能の私の実装は次のようになります。
fit
と
fit_slim
機能は以下の通りです
scipy.optimize.fmin_cg(cost, iw, fprime=fit_slim)
:
def fit(X, Y, w, l, predict=False, x=None):
w_grad = ([np.mat(np.zeros(np.shape(w[i])))
for i in range(len(w))])
for i in range(len(X)):
x = x if predict else X[i]
y = Y[i]
# forward propagate
a = x
a_s = []
for j in range(len(w)):
a = np.mat(np.append(1, a)).T
a_s.append(a)
z = w[j] * a
a = sigmoid(z)
if predict: return a
# backpropagate
delta = a - y.T
w_grad[-1] += delta * a_s[-1].T
for j in reversed(range(1, len(w))):
delta = delta[1:] if j != len(w)-1 else delta
delta = np.multiply(w[j].T*delta, s_prime(a_s[j]))
w_grad[j-1] += (delta[1:] * a_s[j-1].T)
# regularization
for i in range(len(w)):
w_grad[i] /= len(X)
w_grad[i][:,1:] += (l/len(X)) * w[i][:,1:]
return flatten(w_grad).T
def fit_slim(iw):
iw = shape_back(iw)
return fit(X, Y, iw, l)
そしてcost
機能は次のとおりです。
def cost(iw):
J = 0
m = len(X)
iw = shape_back(iw)
for i in range(m):
h = fit(X, Y, iw, l, True, X[i])
J += ((1.0/m)*(np.sum((np.multiply(-Y[i],np.log(h))-
np.multiply((1-Y[i]),np.log(1-h))).flatten())))
for i in range(len(w)):
J += np.sum(((l/(2.0*m))*np.power(w[i],2)).flatten())
return J
変数は、長いベクトルへの展開された重みであり、shape_back
関数は、fit
とcost
関数で使用するために、iw
を元の行列形状に単純に再形成します。
私が直面する最初の問題は、私のfit
関数が1回の繰り返しを永遠に実行するのにかかるという事実です。そして永遠に、私は非常に遅く思われる1分を意味します。それにもかかわらず、私は言及したように、約40時のコストプラトーまでそれを稼働させたが、これは依然として非常に高いコストである。つまり、別の最適化手法を実装することは私にとっては妥当と思われ、fmin_cg関数を解決しました。
私はそれを実行すると、私は次のエラーが表示されます
File "image_net.py", line 143, in <module>
print scipy.optimize.fmin_cg(cost, iw, fprime=fit_slim, maxiter=2, callback=callback)
File "/Users/samgriesemer/anaconda/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 1092, in fmin_cg
res = _minimize_cg(f, x0, args, fprime, callback=callback, **opts)
File "/Users/samgriesemer/anaconda/lib/python2.7/site-packages/scipy/optimize/optimize.py", line 1156, in _minimize_cg
deltak = numpy.dot(gfk, gfk)
ValueError: shapes (616610,1) and (616610,1) not aligned: 1 (dim 1) != 616610 (dim 0)
機能が同じベクトルの内積を取るしようとしているように私には思われるが、私にはどんな意味がありません。 。
私の質問を要約すると、私は2つの問題があります。
1)私のfit
の機能をよりよく最適化するためにできることはありますか?私のデータセットには10,000例があるので、すべてをループするのに時間がかかることは理解していますが、何度も繰り返してもコストが非常に高い理由はわかりません。
2)fmin_cg
機能を実行しているときにエラーが発生するのはなぜですか?関数に渡す引数は同じサイズのベクトルです。私は、関数内で同じサイズのベクトルの内積を取ろうとする理由を理解していません。
これらの問題や誤解を明らかにすることができる人に感謝します。
これは私には分かりませんでした。 – Sam