我正在做研究,为了进行实验,我想使用网络中特定层相对于网络输入(类似于引导反向传播)的渐变作为另一个网络(分类器)的输入。目标是根据分类器“强迫”网络改变“注意力”,因此应同时训练这两个网络。
我以这种方式实现它:
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)))
它不起作用。似乎卡住了,什么也没发生(没有错误或其他消息)。
我不确定实施此方法的正确方法,因此如果有更多经验的人可以看一下并给我建议,我将非常感激。
答案 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