Deep learning 在keras中使用backprop调整输入功能

Deep learning 在keras中使用backprop调整输入功能,deep-learning,keras,backpropagation,Deep Learning,Keras,Backpropagation,我正在尝试在Keras中实现判别条件码,如中所建议的 薛少飞,等,“基于深度神经网络的快速自适应” 关于语音识别的鉴别码。” 其主要思想是将每个条件编码为输入参数,并让网络了解条件和特征标签映射之间的依赖关系。在新的数据集上,您只需使用backprop调整这些权重,而不是调整整个网络。例如,假设我的网络看起来像这样 X ---->|----| |DNN |----> Y Z --- >|----| X:

我正在尝试在Keras中实现判别条件码,如中所建议的

薛少飞,等,“基于深度神经网络的快速自适应” 关于语音识别的鉴别码。”

其主要思想是将每个条件编码为输入参数,并让网络了解条件和特征标签映射之间的依赖关系。在新的数据集上,您只需使用backprop调整这些权重,而不是调整整个网络。例如,假设我的网络看起来像这样

          X ---->|----|
                 |DNN |----> Y
          Z --- >|----|
X
:功能
Y
:标签
Z
:条件代码

现在,在一个新数据集上给定一个预训练的DNN和
X'
Y'
,我试图使用backprop来估计
Z'
,这将使
Y'
上的预测误差最小化。数学似乎很简单,除了我不知道如何在没有访问backprop本身的情况下在keras中实现这一点

例如,我可以添加一个Input()层,该层的trainable=True,而所有其他层都设置为trainable=False。keras中的backprop是否可以更新的不仅仅是层权重?或者有没有办法破解keras层来做到这一点

欢迎任何建议。
谢谢

假设
Z
的大小是
mxn
。然后您可以首先定义一个大小为
m*nx1
的输入层。输入将是1的
m*n x 1
向量。您可以定义包含
m*n
神经元的密集层,并为其设置
trainable=True
。该层的响应将为您提供一个扁平版的
Z
。对其进行适当的重塑,并将其作为输入提供给网络的其他部分,这些部分可以在此之前追加


请记住,如果
Z
的大小太大,则网络可能无法学习由那么多神经元组成的密集层。在这种情况下,可能需要添加额外的约束或查看卷积层。然而,卷积层将对
Z
施加一些限制。我通过查看
fchollet
的帖子,找到了在Keras中如何(准确地)做到这一点的方法

使用keras后端,我能够直接计算我的损失w.r.t到
Z
的梯度,并使用它来驱动更新

代码如下:

import keras.backend as K
import numpy as np

model.summary() #Pretrained model
loss = K.categorical_crossentropy(Y, Y_out)
grads = K.gradients(loss, Z)
grads /= (K.sqrt(K.mean(K.square(grads)))+ 1e-5)

iterate = K.function([X,Z],[loss,grads])

step = 0.1

Z_adapt = Z_in.copy()

for i in range(100):
     loss_val, grads_val = iterate([X_in,Z_adapt])
     Z_adapt -= grads_val[0] * step
     print "iter:",i,np.mean(loss_value)

print "Before:"
print model.evaluate([X_in, Z_in],Y_out)


print "After:"
print model.evaluate([X_in, Z_adapt],Y_out)

X、Y、Z
是模型图中的节点
Z_in
Z'
的初始值。我将其设置为火车组的平均值
Z_adapt
经过100次梯度下降迭代后,应该会给你一个更好的结果。

所以当你有
X',Y'
和一个预先训练过的模型(即你的图中的
DNN
)时,你会冻结一切,只为
Z
训练吗?是的,所有其他权重都会冻结,我只想估计在给定X的情况下,使Y上的误差最小的Z。有些论文有时会更新将Z'连接到网络其余部分的权重,但不会更新任何其他内容。
Z
通常是大小
k
编码条件的1-hot向量。因此,如果我正确理解您的建议,我应该在顶部添加一个密集层,其中包含
k^2+k
参数,该参数将把一个向量(I)转换为所需的
Z
。按照这种逻辑,我想知道,如果只使用单个1作为输入,并使用线性权重将其转换为
Z
,是否有意义。在这种情况下,至少密集层权重是可以直接解释的,也可能导致较少的多余参数。我假设您计划使用密集层
k
神经元(如果错误,请纠正我)。现在,如果您有一个热编码,那么我建议将它们转换为整数(例如,
[0 0 1 0 0]
2
)。现在您需要学习一个标量。您可以使用两个密集层,因为我怀疑包含一个神经元的单个密集层是否能够获得
z
的良好近似值。你可以使用10个一的向量作为输入,然后说10个(或者100个,取决于你的数据量)隐藏神经元层,然后是一个神经元输出层,基本上就是
Z
。再次将此转换为一个热编码。我不明白您关于使用单个1作为输入并将其转换为
Z
的观点。如果你考虑一个1作为输入,然后k神经元层产生一个热编码的
Z
,我认为这是行不通的。我在上面提到了将其转换为标量的策略,这里还有一个。有k-神经元,但阈值激活产生一个热向量(activn>=0.5,或者我认为我现在找到了确切的解决方案(见我的答案)。我希望稍后尝试您的答案并进行更新。我希望了解在这种情况下输入表示法的意义。谢谢。我认为您的方法会更好,因为它直接更新
Z