Tensorflow Keras,计算LSTM上输入的损失梯度

Tensorflow Keras,计算LSTM上输入的损失梯度,tensorflow,keras,gradient,Tensorflow,Keras,Gradient,我对机器学习还很陌生,我一直在胡乱地使用一些敌对的例子。 我试图愚弄一个二进制字符级别的LSTM文本分类器。 因此,我需要输入损耗的梯度 尽管梯度函数返回None 我已经试着得到梯度了,比如 或者,但是梯度函数仍然返回None 编辑:我想做一些与git回购类似的事情 我想问题可能是它是一个LSTM分类器。 在这一点上我不确定。但我认为即使是从LSTM分类器中也应该可以得到这些梯度,对吗 这是我的密码: 将numpy导入为np 从keras.preprocessing导入序列 从keras.mod

我对机器学习还很陌生,我一直在胡乱地使用一些敌对的例子。 我试图愚弄一个二进制字符级别的LSTM文本分类器。 因此,我需要输入损耗的梯度

尽管梯度函数返回
None

我已经试着得到梯度了,比如 或者,但是梯度函数仍然返回
None

编辑:我想做一些与git回购类似的事情

我想问题可能是它是一个LSTM分类器。 在这一点上我不确定。但我认为即使是从LSTM分类器中也应该可以得到这些梯度,对吗

这是我的密码:

将numpy导入为np
从keras.preprocessing导入序列
从keras.models导入负载_模型
导入数据
进口泡菜
将keras.backend作为K导入
def敌手():
模型,有效字符=loadModel()
model.summary()
#加载数据
十、 y、maxlen、max、max特征,indata=准备数据(有效字符)
目标=y[0]
#通过输入得到损耗和损耗梯度
target=np.asarray(target).astype('float32')。重塑(-1,1))
损耗=K.二进制\交叉熵(目标、模型、输出)
打印(目标)
打印(型号输出)
打印(模型输入)
打印(丢失)
梯度=K.梯度(损失、模型输入)
#f=K.函数([模型输入],[损耗,梯度])
#打印(f(X[1:2]))
打印(模型预测(X[0:1]))
印刷(毕业生)
输出如下所示:

Layer (type)                 Output Shape              Param #   
=================================================================
embedding_1 (Embedding)      (None, 74, 128)           5120      
_________________________________________________________________
lstm_1 (LSTM)                (None, 128)               131584    
_________________________________________________________________
dropout_1 (Dropout)          (None, 128)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 129       
_________________________________________________________________
activation_1 (Activation)    (None, 1)                 0         
=================================================================
Total params: 136,833
Trainable params: 136,833
Non-trainable params: 0
_________________________________________________________________
Maxlen: 74
Data preparing finished
[[0.]]
Tensor("activation_1/Sigmoid:0", shape=(?, 1), dtype=float32)
Tensor("embedding_1_input:0", shape=(?, 74), dtype=float32)
Tensor("logistic_loss_1:0", shape=(?, 1), dtype=float32)
[[1.1397913e-13]]
[None]
我希望得到输入数据中丢失的w.r.t.的梯度,看看哪个字符对输出的影响最大。 因此,我可以通过修改各自的字符来愚弄分类器。 这可能吗?如果是,我的方法有什么问题


谢谢您的时间。

只能为“可训练”张量计算梯度,因此您可能需要将输入包装到tf.Variable()中

只要你想使用梯度,我建议你使用tensorflow,它很好地集成了Keras。下面是我的示例,请注意,它在急切执行模式下工作(tensorflow 2.0中默认)


梯度只能为“可训练”张量计算,因此您可能希望将输入包装到tf.Variable()中

只要你想使用梯度,我建议你使用tensorflow,它很好地集成了Keras。下面是我的示例,请注意,它在急切执行模式下工作(tensorflow 2.0中默认)

我刚找到。 梯度函数返回
None
,因为嵌入层不可微

嵌入层被实现为K.gather,它是不可微的,因此没有梯度

我刚找到。 梯度函数返回
None
,因为嵌入层不可微

嵌入层被实现为K.gather,它是不可微的,因此没有梯度


谢谢你的回答。不过我对tensorflow不是很熟悉。很遗憾,我看不出如何将您提供的代码集成到我的程序中。你能为我提供一个好的资源,让我可以阅读这个主题吗?官方文档是一个很好的开始:,谢谢你的回答。不过我对tensorflow不是很熟悉。很遗憾,我看不出如何将您提供的代码集成到我的程序中。你能为我提供一个很好的资源,让我可以阅读这个主题吗?官方文档是一个很好的开始:,
def train_actor(self, sars):
    obs1, actions, rewards, obs2 = sars


    with tf.GradientTape() as tape:
        would_do_actions = self.compute_actions(obs1)
        score = tf.reduce_mean(self.critic(observations=obs1, actions=would_do_actions))
        loss = - score

    grads = tape.gradient(loss, self.actor.trainable_weights)
    self.optimizer.apply_gradients(zip(grads, self.actor.trainable_weights))