Keras,根据LSTM

时间:2019-05-17 13:53:45

标签: tensorflow keras gradients

我对机器学习还很陌生,并且在搞一些对抗性例子。 我正在尝试愚弄二进制字符级LSTM文本分类器。 因此我需要损失w.r.t.输入。

尽管梯度函数返回None

我已经尝试获取渐变,例如在this post中 或this post,但渐变函数仍返回None

编辑:我想做的事情与this git repo中的事情类似。

我当时在想问题可能是它是LSTM分类器。 我现在不确定。但是我认为即使从LSTM分类器中也可以获得这些梯度吗?

这是我的代码:

import numpy as np
from keras.preprocessing import sequence
from keras.models import load_model
import data
import pickle
import keras.backend as K

def adversary():
    model, valid_chars = loadModel()    
    model.summary()

    #load data
    X, y, maxlen, _ , max_features, indata = prepare_data(valid_chars)

    target = y[0]

    # Get the loss and gradient of the loss wrt the inputs  
    target = np.asarray(target).astype('float32').reshape((-1,1))
    loss = K.binary_crossentropy(target, model.output)
    print(target)
    print(model.output)
    print(model.input)
    print(loss)
    grads = K.gradients(loss, model.input)

    #f = K.function([model.input], [loss, grads])

    #print(f(X[1:2]))
    print(model.predict(X[0:1]))

    print(grads)

输出看起来像这样:

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.在输入数据中查看哪个字符对输出影响最大。 因此,我可以通过修改各个字符来欺骗分类器。 这可能吗?如果是,我的方法有什么问题?

谢谢您的时间。

2 个答案:

答案 0 :(得分:0)

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

一旦您想使用渐变,我建议您使用与Keras很好地集成的tensorflow进行处理。下面是我这样做的示例,请注意它可以在急切的执行模式下工作(tensorflow 2.0中的默认设置)。

date_groups <- expand.grid(Datetime= seq(min(df$Datetime), max(df$Datetime), "min"), 
                           Group = c(1:3))

date_groups <- merge(date_groups, df, all.x = TRUE)
date_groups[is.na(date_groups)] <- 0

答案 1 :(得分:0)

我刚发现this thread。 梯度函数返回None,因为嵌入层不可微分。

  

嵌入层被实现为不可区分的K.gather,因此没有渐变。