2016-09-15 9 views
0

私は彼のgithubからロジスティック回帰のためにNewmu tutorialを使用していました。モデルに隠れたレイヤーを1つ追加したいので、変数weightsを2つの配列h_wとo_wに分割しました。 問題がある - 私は、リスト上で動作するように更新が不可能にしようとしているとき(= W [h_w、o_w])Theano - SGD with hidden layer 1

"File "C:/Users/Dis/PycharmProjects/untitled/MNISTnet.py", 
line 32, in <module> 
    **update = [[w, w - gradient * 0.05]] TypeError: can't multiply sequence by non-int of type 'float'**" 

私はtheanoとnumpyの初心者とtheanoのドキュメントが「couldnよ私を助けてください。

Traceback (most recent call last): 
    File "C:\Users\Dis\PycharmProjects\untitled\MNISTnet.py", line 35, in <module> 
    gradient = T.grad(cost=cost, wrt=w) 
    File "C:\Program Files\Anaconda2\lib\site-packages\theano-0.9.0.dev1-py2.7.egg\theano\gradient.py", line 533, in grad 
    handle_disconnected(elem) 
    File "C:\Program Files\Anaconda2\lib\site-packages\theano-0.9.0.dev1-py2.7.egg\theano\gradient.py", line 520, in handle_disconnected 
    raise DisconnectedInputError(message) 
theano.gradient.DisconnectedInputError: 
Backtrace when that variable is created: 

    File "C:\Users\Dis\PycharmProjects\untitled\MNISTnet.py", line 30, in <module> 
    w = T.stack([h_w, o_w], axis=1) 

だから、私の質問は:どのように私は[<TensorType(float64, matrix)>, <TensorType(float64, matrix)>]変数<TensorType(float64, matrix)>にそのリストを変換することができ、私は、スタック()関数を見つけましたが、w = T.stack([h_w, o_w], axis=1) theanoを組み合わせたときに私にエラーを与えてきましたか?

以下の私の完全なコード:

import theano 
from theano import tensor as T 
import numpy as np 
from load import mnist 

def floatX(X): 
    return np.asarray(X, dtype=theano.config.floatX) 

def init_weights(shape): 
    return theano.shared(floatX(np.random.randn(*shape) * 0.01)) 

def model(X, o_w, h_w): 
    hid = T.nnet.sigmoid(T.dot(X, h_w)) 
    out = T.nnet.softmax(T.dot(hid, o_w)) 
    return out 

trX, teX, trY, teY = mnist(onehot=True) 

X = T.fmatrix() 
Y = T.fmatrix() 

h_w = init_weights((784, 625)) 
o_w = init_weights((625, 10)) 

py_x = model(X, o_w, h_w) 
y_pred = T.argmax(py_x, axis=1) 
w = [o_w, h_w] 

cost = T.mean(T.nnet.categorical_crossentropy(py_x, Y)) 
gradient = T.grad(cost=cost, wrt=w) 
print type(gradient) 
update = [[w, w - gradient * 0.05]] 

答えて

1

T.grad(..)各パラメータに戻りgradient w.r.tに、あなたが[w, w - gradient * 0.05]を行うことはできませんので、あなたが参照しているグラデーション[*]パラメータを指定する必要があります。また、複数のパラメータにスタックを使用するのは良い考えではありません。シンプルリストは十分ですが、これはtutorialにチェックしてください。 これは動作するはずです:私は始めるためにTheano tutorialsを通過することをお勧め

import theano 
from theano import tensor as T 
import numpy as np 
from load import mnist 

def floatX(X): 
    return np.asarray(X, dtype=theano.config.floatX) 

def init_weights(shape): 
    return theano.shared(floatX(np.random.randn(*shape) * 0.01)) 

def model(X, o_w, h_w): 
    hid = T.nnet.sigmoid(T.dot(X, h_w)) 
    out = T.nnet.softmax(T.dot(hid, o_w)) 
    return out 

trX, teX, trY, teY = mnist(onehot=True) 

X = T.fmatrix() 
Y = T.fmatrix() 

h_w = init_weights((784, 625)) 
o_w = init_weights((625, 10)) 

py_x = model(X, o_w, h_w) 
y_pred = T.argmax(py_x, axis=1) 
w = [o_w, h_w] 

cost = T.mean(T.nnet.categorical_crossentropy(py_x, Y)) 
gradient = T.grad(cost=cost, wrt=w) 
print type(gradient) 
update = [[o_w, o_w - gradient[0] * 0.05], 
      [h_w, h_w - gradient[1] * 0.05]]