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