2017-11-27 12 views
0

私はmnielsenのオンラインbookに従っています。私は彼のコードherehereと定義された運動量の更新を実装しようとしています。全体的な考え方は、運動量の更新の場合、負の勾配の重みベクトルを直接変更しないということです。パラメータはvelocityで、最初にゼロに設定してから、ハイパーパラメータのmuを通常0.9に設定します。ニューラルネットワークの運動量の更新を実装する

# Momentum update 
v = mu * v - learning_rate * dx # integrate velocity 
x += v # integrate position 

は、だから私は、重みwを持っているし、次のコードスニペットにnebla_wとして重量の変更:更新最後の2行でとても

def update_mini_batch(self, mini_batch, eta): 
     """Update the network's weights and biases by applying 
     gradient descent using backpropagation to a single mini batch. 
     The ``mini_batch`` is a list of tuples ``(x, y)``, and ``eta`` 
     is the learning rate.""" 
     nabla_b = [np.zeros(b.shape) for b in self.biases] 
     nabla_w = [np.zeros(w.shape) for w in self.weights] 
     for x, y in mini_batch: 
      delta_nabla_b, delta_nabla_w = self.backprop(x, y) 
      nabla_b = [nb+dnb for nb, dnb in zip(nabla_b, delta_nabla_b)] 
      nabla_w = [nw+dnw for nw, dnw in zip(nabla_w, delta_nabla_w)] 
     self.weights = [w-(eta/len(mini_batch))*nw 
         for w, nw in zip(self.weights, nabla_w)] 
     self.biases = [b-(eta/len(mini_batch))*nb 
         for b, nb in zip(self.biases, nabla_b)] 

self.weight勢いのため

self.weights = [w-(eta/len(mini_batch))*nw 
       for w, nw in zip(self.weights, nabla_w)] 

として私は次のようにしています:

更新のため

TypeError: can't multiply sequence by non-int of type 'float' 

しかし、私は次のエラーを取得しています。私のetaは、float関数で再びラップしていますが、すでにハイパーパラメータはfloatです。私もlen(mini_batch)をフロートで包みました。私もnw.astype(float)してみましたが、私はまだエラーが発生します。なぜ私は分からない。 nabla_wは、浮動小数点数の配列がnumpyです。

+0

'TypeError:両方の配列がnumpyの場合、 'float'型の非int型配列を掛けることはできません。何かは、リスト、タプルまたは他のシーケンスであり、numpyの配列ではありません。乗算される変数ごとに 'type(variable)'を表示すると、何かがnumpyの配列ではないことがわかります。あなたは 'momentum_mu'と' momentum_v'の定義を表示していませんでした。おそらく彼らは犯罪者ですか?例えば、同じエラーから私の答えを今日見て[ここ](https://stackoverflow.com/questions/47520890/error-cant-multiply-sequence-by-non-int-of-type-float/47521032#47521032)参照してくださいメッセージ。 –

+0

また、 'float'を使用しているべきであることを伝えるエラーはありません。あなたが' float'を使用していることを伝えているので、 'float'として束縛することはできませんこの問題を解決するのに役立ちます。タプルやリストに浮動小数点数を掛けているところ。 –

+0

@AlexanderReynolds私はそれを今見ます!私はmomentum_vを間違った方法で初期化していました。どうもありがとうございます。あなたは答えのセクションに書くことができます、そして、私はあなたの答えを受け入れることができます。 –

答えて

0

コメントで説明したように、ここでは何も配列がありません。上記のエラー

TypeError: can't multiply sequence by non-int of type 'float' 

は、シーケンスタイプ(リスト、タプルなど)に対してPythonが発行したエラーです。エラーメッセージは、シーケンスを非intで乗算できないことを意味します。彼らフロートを掛けることは意味がありませんそれだけでシーケンスを繰り返し--- int型で乗算することができますが、これは値を変更しない、このフレームではすなわち、

>>> [1, 0] * 3 
[1, 0, 1, 0, 1, 0] 

そしてもちろん、 :

>>> [1, 0] * 3.14 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: can't multiply sequence by non-int of type 'float' 

ここにも同じエラーメッセージが表示されます。ですから、あなたが乗算している変数の1つは実際には配列の数が少なく、ジェネリック配列型の1つです。問題のある変数の周りのnp.array()の単純なキャストはそれを修正するか、もちろん定義を配列に変更するだけで済みます。

関連する問題