上一篇以实现logistic regression为例讲解了theano的基础用法。本篇以MLP的示例进一步讲解theano里更高级的用法,以及一般的模型写法。详情见代码中的注释。
#encoding:GBK
###########################################
#
# multi-layers perceptron
#
###########################################
import theano
import numpy
import theano.tensor as T
from logistic_sgd import load_data
##########################################################
# 对于模型中的特殊层,一般单独定义一个类,以方便模块化管理和复用
##########################################################
class HiddenLayer(object):
#每一层的初始化中,在__init__的输入参数中,最重要定义的几个元素是,input,n_in,n_out,initial parameters。部分依赖随机值做初始化的还需要定义rng,以保证全局随机性。
#每一层初始化后,自身的成员变量里一般会有以下几项:self.input, self.out, self.parameters(a list)
def __init__(self,
rng, #don't forget this
input,
n_in,
n_out,
W=None,
b=None,
activation=None):
self.input = input
if W is None:
#不了解这样给W赋初始值的规矩,另一份代码中,当activation为sigmoid时,W = 4 * 以下赋值。值得注意的是,如果这里初始值全赋0程序基本不动,必须要非零的初始化方式。此处留疑。
W_value = numpy.asarray(
rng.uniform(
low=-numpy.sqrt(6. / (n_in + n_out)),
high=numpy.sqrt(6. / (n_in + n_out)),
size=(n_in, n_out)
),
dtype=theano.config.floatX
)
W = theano.shared(value=W_value, name='W', borrow=True) #don't forget set borrow=True
self.W = W
if b is None:
b_value = numpy.zeros((n_out,), dtype=theano.config.floatX)
b = theano.shared(value=b_value, name='b', borrow&