Проблема с подачей значения в тензор заполнителя для sessions.run()

Я хочу получить значение промежуточного тензора в сверточной нейронной сети для определенного входа. Я знаю, как это сделать в keras, и хотя я обучил модель с помощью keras, я собираюсь перейти к построению и обучению модели, используя только тензорный поток. Поэтому я хочу отойти от чего-то вродеK.function(input_layer, output_layer)что довольно просто, и вместо этого используется тензорный поток. Я считаю, что мне следует использовать значения-заполнители, например, следующий подход:

with tf.compat.v1.Session(graph=tf.Graph()) as sess:
    loaded_model = tf.keras.models.load_model(filepath)
    graph = tf.compat.v1.get_default_graph()  
    images = tf.compat.v1.placeholder(tf.float32, shape=(None, 28, 28, 1)) # To specify input at MNIST images
    output_tensor = graph.get_tensor_by_name(tensor_name) # tensor_name is 'dense_1/MatMul:0'
    output = sess.run([output_tensor], feed_dict={images: x_test[0:1]}) # x_test[0:1] is of shape (1, 28, 28, 1)
    print(output)

Однако я получаю следующее сообщение об ошибке для sess.run() линия: Invalid argument: You must feed a value for placeholder tensor 'conv2d_2_input' with dtype float and shape [?,28,28,1]. Я не уверен, почему я получаю это сообщение, потому что изображение, используемое дляfeed_dictимеет тип float, и я считаю, что это правильная форма. Будет предложена любая помощь.

1 ответ

Решение

Вы должны использовать входной тензор из модели Keras, а не создавать свой собственный новый заполнитель, который будет отключен от остальной модели:

with tf.Graph().as_default(), tf.compat.v1.Session() as sess:
    # Load model
    loaded_model = tf.keras.models.load_model(filepath)
    # Take model input tensor
    images = loaded_model.input
    # Take output of the second layer (index 1)
    output_tensor = loaded_model.layers[1].output
    # Evaluate
    output = sess.run(output_tensor, feed_dict={images: x_test[0:1]})
    print(output)
Другие вопросы по тегам