>>> import numpy
>>> import theano
>>> import theano.tensor as T
>>> rng = numpy.random
>>> N = 400
>>> feats = 784
>>> D = (rng.randn(N, feats), rng.randint(size=N, low=0, high=2))
>>> training_steps = 10000
>>> x = T.dmatrix("x")
>>> y = T.dvector("y")
>>> w = theano.shared(rng.randn(feats), name="w")
>>> b = theano.shared(0., name="b")
>>> print("Initial model:")
>>> print(w.get_value())
>>> print(b.get_value())
>>> p_1 = 1 / (1 + T.exp(-T.dot(x, w) - b))
>>> prediction = p_1 > 0.5
>>> xent = -y * T.log(p_1) - (1-y) * T.log(1-p_1)
>>> cost = xent.mean() + 0.01 * (w ** 2).sum()
>>> gw, gb = T.grad(cost, [w, b])
'''train是一个函数,它的输入是x和y,输出是分类预测prediction和xent,注意updates参数,因为w和b试共享变量,早就定义好了,
所以不用放到输入列表中。每次调用train函数之后都会更新w<-w-0.1*gw, b<-b-0.1*gb'''
>>> train = theano.function(
inputs=[x,y],
outputs=[prediction, xent],
updates=((w, w - 0.1 * gw), (b, b - 0.1 * gb)))
>>> predict = theano.function(inputs=[x], outputs=prediction)
'''也就算调用train函数,train函数会使用当前的w和b“前向”计算出prediction和xent,同时也计算出cost对w和b的梯度。
然后再根据updates参数更新w和b'''
>>> for i in range(training_steps):
pred, err = train(D[0], D[1])
>>> print("Final model:")
>>> print(w.get_value())
>>> print(b.get_value())
>>> print("target values for D:")
>>> print(D[1])
>>> print("prediction on D:")
>>> print(predict(D[0]))
我们可以看到,在Theano里,我们实现一个模型非常简单,我们需要如下步骤:
1. 把输入和输出定义成符号变量【有时为了加速我们可能也会把它定义成共享变量从而让它放到gpu的显存里】
2. 把模型的参数定义成共享变量
3. 然后写出loss函数的公式,同时定义loss对参数的梯度
4. 定义一个训练函数train,输入是模型的输入变量,输出是loss【或者prediction,这样我们可以在训练的时候打印出预测的准确率】,updates用来更新模型参数
5. 写有一个for循环不停的调用train
当然这是全量的梯度下降,如果是batch的随机梯度下降,只需要每次循环传入一个batch的输入和输出就行。