Keras:输出w.r.t.的渐变输入作为分类器的输入

时间:2019-07-09 12:51:13

标签: python tensorflow keras

我正在做研究,为了进行实验,我想使用网络中特定层相对于网络输入(类似于引导反向传播)的渐变作为另一个网络(分类器)的输入。目标是根据分类器“强迫”网络改变“注意力”,因此应同时训练这两个网络。

我以这种方式实现它:

input_tensor = model.input
output_tensor = model.layers[-2].output
grad_calc = keras.layers.Lambda(lambda x:K.gradients(x,input_tensor)[0],output_shape=(256,256,3),trainable=False)(output_tensor)
pred = classifier(grad_calc)
out_model = Model(input_tensor,pred)

out_model.compile(loss ='mse',optimizer = keras.optimizers.Adam(0.0001),metrics = ['accuracy'])

然后,当我尝试训练模型

out_model.train_on_batch(imgs,np.zeros((imgs.shape[0],2)))

它不起作用。似乎卡住了,什么也没发生(没有错误或其他消息)。

我不确定实施此方法的正确方法,因此如果有更多经验的人可以看一下并给我建议,我将非常感激。

1 个答案:

答案 0 :(得分:0)

如果我想实现这一目标,我会屈服于简单的Tensorflow和类似的东西:

#build model
input = tf.placeholder()
net   = tf.layesr.conv2d(input, 12)
loss  = tf.nn.l2_loss(net)
step  = tf.train.AdamOptimizer().minimize(loss)

# now inspect your graph and select the gradient tensor you are looking for
for op in tf.get_default_graph.get_operations():
    print(op.name)
grad = tf.get_default_graph().get_operation_by_name("enqueue")

with tf.Session as sess:
    _, grad, input = sess.run([step, grad, input], ...)
    # feed your grad and input into another network