Keras: градиенты выходных данных в качестве входных данных для классификатора - PullRequest
0 голосов
/ 09 июля 2019

Я занимаюсь исследованиями и для эксперимента хочу использовать градиенты определенного слоя в сети по отношению к входу сети (аналогично управляемому backprop) в качестве входа в другую сеть (классификатор).Цель состоит в том, чтобы «заставить» сеть изменить «внимание» в соответствии с классификатором, поэтому эти две сети должны обучаться одновременно.

Я реализовал это следующим образом:

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 = ['precision'])

Затем, когда я пытаюсь обучить модель

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

это не работает.Кажется, что он застрял там, ничего не происходит (ни ошибки, ни другого сообщения).

Я не уверен, что это правильный способ реализовать это, поэтому я был бы очень благодарен, если кто-то с большим опытом может взятьпосмотри и дай мне совет.

1 Ответ

0 голосов
/ 09 июля 2019

Если бы я пытался добиться этого, я бы просто обратился к 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...