Home Articles

修改Tensorflow,Keras或PyTorch中的图层

Asked
Viewed 1029 times
0

我希望修改tensorFlow中每一层的输出,然后以标准深度神经网络的格式传递到下一层(不一定是CNN):

假设这是在任何修改之前的前向传播期间的层的伪代码,并且X是输入特征矩阵:

Prior Modification:
Step 0: l0 = X
Step 1: l1 = nonlin(np.dot(l0,syn0)) and
Step 2: l2 = nonlin(np.dot(l1,syn1))
Step 3: get error, back propagate and modify weights syn0 and syn1.

因此每层的输出在l1和l2中,其中nonlin是S形激活函数(或者像ReLU那样) . Syn0和Syn1是相应的权重,它们最初被随机化,然后通过反向传播使用丢失函数(如交叉熵或l2误差等)进行修改 . 到目前为止,所有这些都很标准 . 当然,张量流允许标准意义上的偏差项等,以及时期,批次,学习率,辍学/正规化的变化以及其他花哨的特征等 .

我想要做的是在前向传播步骤中对该伪代码的以下修改:

After Modification:
    l0 = M0 %*% X
    l1 = nonlin(np.dot(M1 %*% l0, syn0)) and
    l2 = nonlin(np.dot(M2 %*% l1, syn1))
    get error, back propagate and modify weights syn0 and syn1.

如果你注意到我用对应的矩阵乘法(用%*%表示)分别用矩阵M0,M1,M2更新了l0,l1和l2,我们可以在这个伪代码中将其称为YoYoMats . 所有YoYoMats都是方形和对称的,并提供数据集X和响应或标签列 .

如何在Keras或TensorFlow中实现?理想情况下,在RKeras或RtensorFlow中 . 如果没有Python版本或Pytorch等也没关系!我可以通过在Python中从零开始实现vanilla NN来实现这个更改,但我想在TensorFlow或Keras中使用这个更改以及这些成熟工具提供的所有其他supercool功能,我不熟练创建自己的TensorFlow从头开始:) . 因此,这个在TensorFlow或Keras代码等中实现这个问题 .

请注意,在层l1之前修改很容易,因为修改后的版本与以下内容相同:

After Modification:
        l0 = M1 %*% M0 %*% X
        l1 = nonlin(np.dot(l0, syn0)) and
        l2 = nonlin(np.dot(M2 %*% l1, syn1))
        get error, back propagate and modify weights syn0 and syn1.

因此,它很容易按照以下方式修改l0并以通常的方式在l1中使用它 . 直到这里没有任何变化 . 很简单 . 如果我们在用M2实现乘法或使用M3,M4等时有更多的层,那么棘手的部分只来自第12层及以后 . 我是否需要修改tf.contrib.layers.fully_connected的输出才能完成这项工作?如果是这样的话?如果没有,替代方式?警告 - 如果上面的伪代码被修改用于训练 . 我需要使用相应的YoYoMats修改预测函数以及测试/样本外预测目的 .

1 Answer

  • 0

    尝试类似下面的内容(假设您的yoyos数量与样本相同)

    from keras.models import Model
    from keras.layers import Input, Lambda, Dense, Activation
    
    dataInput = Input(shapeOfOneDataSample)
    M0 = Input(shapeOfOneYoyoForLayer1)
    M1 = Input(shapeOfOneYoyoForLayer2)
    M2 = Input(shapeOfOneYoyoForLayer3)
    
    #l0
    out = Lambda(lambda x: K.batch_dot(x[0], x[1]))([M0, dataInput])
    
    #l1
    out = Lambda(lambda x: K.batch_dot(x[0], x[1]))([M1, out])
    out = Dense(someUnits, activation='simgoid')(out)
    
    #l2
    out = Lambda(lambda x: K.batch_dot(x[0], x[1]))([M2, out])
    out = Dense(someOtherUnits)(out)
    out = Activation('sigmoid')(out) 
    
    model = Model(inputs=[dataInput, M0, M1, M2], outputs = out)
    

    使用选择的优化器和损失函数编译此模型:

    from keras.optimizers import <someOptimizerIfYouNeed>
    model.compile(optimizer = 'adam', loss='mse') #just for instance
    

    适合此模型传递数据和yoyos作为输入:

    model.fit([numpyData, numpyM0s, numpyM1s, numpyM2s], expectedOutputs, .....)
    

    警告: batch_dot 函数可能以奇怪的方式工作,我建议您彻底检查它 . (或者你可以使用一些 tf 矩阵乘法,如果你已经习惯了它们) .

Related