修改Tensorflow,Keras或PyTorch中的图层

时间:2018-07-24 22:52:48

标签: tensorflow keras pytorch

在标准深度神经网络(不一定是CNN)以这种格式传递到下一层之前,我想修改tensorFlow中每一层的输出:

假设这是在进行任何修改之前进行正向传播期间的层伪代码,并且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中执行此更改以将这些更改与这些成熟工具提供的所有其他超酷功能一起使用,我不擅长创建自己的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中使用它。直到这里什么都没有改变。很简单。棘手的部分仅从l2层开始,如果我们在实现与M2的乘法时有更多的层,或者说M3,M4等,则需要更多层。我是否需要修改tf.contrib.layers.fully_connected的输出才能完成此操作?如果可以,怎么办?如果没有,替代方法?注意:如果上述伪代码被修改用于训练。我还需要使用相应的YoYoMats修改预测功能,以用于测试/样本外预测。

1 个答案:

答案 0 :(得分:0)

尝试类似以下的方法(假设您的悠悠球数量与样本数相同)

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

通过传递数据和yoyo作为输入来拟合此模型:

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

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