您的位置:首页 > 理论基础 > 计算机网络

深度学习框架Lasagne的一些总结和技巧

2016-09-21 11:02 405 查看
深度学习框架也用过几个了,一直比较喜欢的是Lasagne,因为其设计哲学是不回避底层(theano),而且封装得比较灵活,不像Keras那样完全一套自己的逻辑,底层借口暴露的太少,导致想做自己的模型的时候用keras非常费力。

从某种意义上说,个人觉得Lasagne其实不太能称得上是一个神经网络的框架,而是theano的一个非常好的toolbox,其整个设计都是把theano变得更好使用。

由于学习时间的多变,导致有时候会集中时间写一段时间的代码,有时候会集中时间看paper,所以经常忘掉 lasagne里的一些逻辑和规则,这次在这里我就不定期总结一些,当做给自己的一个tips. 所以其实很多技巧和经验是theano的经验,一并写一下。

声明网络输入变量的时候,需要提前设计好属性(vector或者matrix或者4d等等),如下:

c = T.imatrix()

q = T.ivector()

y = T.imatrix()

c_pe = T.tensor4()

q_pe = T.tensor4()


属性的确定,是需要考虑到batch这个维度的,所以,单个输入是一个向量的话,声明的时候就是matrix,

另外,网络输出目标 y 是一个[batch_size,n_classes]的矩阵。

label的转换问题,通常情况下,对于label都需要转换成为one-hot的向量,

 有一个方便的工具 

from sklearn.preprocessing import LabelBinarizer,label_binarize


举例:

>>> label_binarize([1, 6], classes=[1, 6, 4, 2])
array([[1, 0, 0, 0],
[0, 1, 0, 0]])


 

  另外统计错误率的一个简单语句是 

numpy.count_nonzero(y_true-y_predict)


关于theano建模过程中的输入样本的问题

theano中建模的通常形式是,用x=T.matrix(),y=T.tensor()这种,这种变量的类型是:theanoTensor.

这就要求我们在建模过程中,接触不到实际数据,而是用一个变量抽象代替它。

实际上,theano的function中的输入形式是很多样的,典型的有:

(1)

train_model=theano.function([x,y],cost,updates=updates)

cost=train_model(x_batch,y_batch)


(2)

givens = {

x: x_shared,

y: y_shared,

}

train_model=theano.function([],cost,givens=givens,updates=updates)

x_shared.set_value(x_batch)

y_shared.set_value(y_batch)

cost=train_model()


第一种没有太多的技巧而言,第二种来说其实我们可以不用声明变量,直接用theanoSharedTensor变量直接代替它。

例如:

可初始化y_shared=theano.shared(np.zeros((batch_size,1),dtype=np.int32),borrow=True),

而在建模过程中需要用y的地方用y_shared代替。

这样的好处是更直观。而且不用有givens={x:x_shared,y:y_shared}的过程。

关于对theano.function的使用需要注意的地方

theano.function在建立模型的时候,输入是一个列表,即便没有输入。

例如 cc= theano.function(Inputs=[aa,bb],outputs=[cost])

但是在调用的时候,是不用用列表的形式传送的。

 

 dd=cc(a1,b1)[0] 。

 

这点一定要注意,否则很容易出现传送变量错误,但是代报错信息却不会提示,只会在导入数据到模型中出错而提示具体的表面上的错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息