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

来源:互联网 发布:sqlserver 卸载 编辑:程序博客网 时间:2024/05/01 10:31

深度学习框架也用过几个了,一直比较喜欢的是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] 。
     
    这点一定要注意,否则很容易出现传送变量错误,但是代报错信息却不会提示,只会在导入数据到模型中出错而提示具体的表面上的错误。

0 0