2016-04-06 5 views
1

ちょっとしたコンテキスト:私は、Cifar-10データセットの画像分類のために3層のニューラルネットワーク(1つの隠れたレイヤー)を実装しようとしています。私はバックプロパゲーションを実装していましたが、もともと勾配降下を使用してネットワークを訓練しましたが、私のコストは約40程度でした(事実上無意味な推測の同じ速度で新しいイメージを効果的に分類します)。神経ネットワークの最適化が失敗する(Scipy fmin_cgを使用)

次に、scipy.optimize.fmin_cg機能を使用してネットワークをトレーニングしようとしました。私は展開された重みを関数に渡し、関数backpropagationは、関数の入力要件を満たす勾配に対して同じサイズのベクトルを返します。

機能の私の実装は次のようになります。

fitfit_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関数は、fitcost関数で使用するために、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機能を実行しているときにエラーが発生するのはなぜですか?関数に渡す引数は同じサイズのベクトルです。私は、関数内で同じサイズのベクトルの内積を取ろうとする理由を理解していません。

これらの問題や誤解を明らかにすることができる人に感謝します。

答えて

1

It seems to me that the function is attempting to take the dot product of the same vector, which doesn't make any sense to me.

これはどのようにnumpy.dotの動作ではありません。この問題は、エラーメッセージに示されているとおりです。行列の乗算を実行しようとしますが、次元が一致しないために失敗します。最初の一つはnumpyのため一次元であり、そしてそれはとして解釈ないだ:numpyのは形状(n,)(n, 1)(1, n)区別し、一方は「一次元」として考えることができアレイのこと

お知らせ行または列ベクトル。

>>> a = np.ones(3)  # a 1D array 
>>> np.dot(a, a) 
3.0 
>>> b = a.reshape(-1, 1) # a column vector 
>>> b 
array([[ 1.], 
     [ 1.], 
     [ 1.]]) 
>>> np.dot(b, b)   # column times column, fails 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: shapes (3,1) and (3,1) not aligned: 1 (dim 1) != 3 (dim 0) 
>>> np.dot(b, b.T)  # column times row, i.e. an outer product 
array([[ 1., 1., 1.], 
     [ 1., 1., 1.], 
     [ 1., 1., 1.]]) 
>>> np.dot(b.T, b)  # row times column, but notice the dimensions 
array([[ 3.]])    
+0

これは私には分かりませんでした。 – Sam

関連する問題