dot
を使用すると、1つのまたは複数のnumpyのアレイを使用していると言われます。だから私はみます:1件の評価から次へと渡された中間値u
は、リストの内包がトリッキーになりこと
In [32]: functools.reduce(lambda u, wb: np.maximum(0,
u.dot(wb[0])+wb[1]), zip(ws, bs), x)
Out[32]:
array([[ 2577, 3321, 4065],
[ 7599, 9801, 12003],
[12621, 16281, 19941]])
:
In [28]: b=np.array([1,2,3])
In [29]: x=np.arange(9).reshape(3,3)
In [30]: ws=[x,x,x]
In [31]: forward_pass(x,ws,bs)
Out[31]:
[array([[ 16, 19, 22],
[ 43, 55, 67],
[ 70, 91, 112]]),
array([[ 191, 248, 305],
[ 569, 734, 899],
[ 947, 1220, 1493]]),
array([[ 2577, 3321, 4065],
[ 7599, 9801, 12003],
[12621, 16281, 19941]])]
PY3では、私はとしてreduce
ソリューションを記述する必要があります。
accumulate
は最初の項目を先頭に使用します。私はその後、私はws
とbs
に余分開始値を追加する必要が
def foo(u, wb):
if u[0] is None: u=x # x from global
return np.maximum(0, u.dot(wb[0])+wb[1])
のような機能を持つことを回避することができます。
In [56]: list(itertools.accumulate(zip([None,x,x,x], np.array([0,1,2,3])), foo))
Out[56]:
[(None, 0),
array([[ 16, 19, 22],
[ 43, 55, 67],
[ 70, 91, 112]]),
array([[ 191, 248, 305],
[ 569, 734, 899],
[ 947, 1220, 1493]]),
array([[ 2577, 3321, 4065],
[ 7599, 9801, 12003],
[12621, 16281, 19941]])]
ここでは、外部u
を使用して、リスト内包バージョンです:
In [66]: u=x.copy()
In [67]: def foo1(wb):
...: v = np.maximum(0, u.dot(wb[0])+wb[1])
...: u[:]=v
...: return v
...:
In [68]: [foo1(wb) for wb in zip(ws,bs)]
Out[68]:
[array([[ 16, 19, 22],
[ 43, 55, 67],
[ 70, 91, 112]]),
array([[ 191, 248, 305],
[ 569, 734, 899],
[ 947, 1220, 1493]]),
array([[ 2577, 3321, 4065],
[ 7599, 9801, 12003],
[12621, 16281, 19941]])]
元のループよりも実質的な利点はありません。append
です。
numpy.ufunc
はaccumulate
メソッドを持っていますが、これはカスタムPython関数では使いにくいものです。したがって、np.maximum.accumulate
がありますが、私はこのケースでどのように使用できるかわかりません。 (またnp.cumsum
はnp.add.accumulate
である)。
そして、あなたが維持したいあなた '中間values'はどれですか? – Divakar
'x'、' ws'、 'bs'、特にそれらの寸法について教えてください。多分、サンプルセットでさえ、出力あります。 – hpaulj
'(w、b)'は私に構文エラーを与えています(Py3) – hpaulj