Предварительно обученная модель keras заполняет новый входной заполнитель - PullRequest
1 голос
/ 24 октября 2019

У меня есть модель, которая была обучена. вот так

model_inceptionv3_conv = InceptionV3(weights='imagenet', include_top=False)
for layer in model_inceptionv3_conv.layers:
    layer.trainable = False
x = model_inceptionv3_conv.output
x = GlobalAveragePooling2D()(x)
predictions = Dense(NB_CLASSES, activation='sigmoid', name='predictions')(x)
my_model = Model(inputs=model_inceptionv3_conv.input, outputs=predictions)
my_model.fit(...)

Теперь я не буду кормить местозаполнителем для этой модели, но получилось, что какое-то значение неинициализировано. Этот код preds = model (x) сгенерирует новый график?

x = tf.placeholder(tf.float32, shape=(None, 299, 299,
                                          3))
preds = model(x)
sess.run(preds, feed_dict={x: x_val})

error FailedPreconditionError: Попытка использовать неинициализированное значение batch_normalization_86 / moving_mean ......

Ответы [ 4 ]

1 голос
/ 24 октября 2019

Если вы хотите добавить новый заполнитель на график, вам необходимо выполнить следующие шаги: -

  • Сохранить вес вашей модели в одном файле, используя my_model.save() function
  • построить график снова с добавлением заполнителя и загрузкой весов вашей модели

Вот рабочий пример -

input_layer = tf.placeholder(tf.float32, shape=(None, 299, 299,3))
model_inceptionv3_conv = InceptionV3(weights='imagenet', include_top=False, input_tensor=input_layer)
for layer in model_inceptionv3_conv.layers:
    layer.trainable = False
x = model_inceptionv3_conv.output
x = GlobalAveragePooling2D()(x)
predictions = Dense(NB_CLASSES, activation='sigmoid', name='predictions')(x)
my_model = Model(inputs=input_layer, outputs=predictions)

my_model.load_weights('model.h5')

теперь вы можете использовать my_model.predict () илиsess.run () для прогнозирования, например -

sess.run(predictions, feed_dict={input_layer: x_val})

или

my_model.predict(x_val)

, вы также можете обратиться к моей записной книжке GitHub jupyter, чтобы узнать, как добавить шаги предварительной обработки к вашей модели Keras- https://github.com/CS-savvy/keras-preprocessing-inject/blob/master/keras%20inject.ipynb

1 голос
/ 24 октября 2019

ваша ошибка здесь:

preds = my_model(x)

она должна быть:

preds = my_model.predict(x)

вот рабочий пример:

NB_CLASSES = 2
model_inceptionv3_conv = InceptionV3(weights='imagenet', include_top=False)
for layer in model_inceptionv3_conv.layers:
    layer.trainable = False
x = model_inceptionv3_conv.output
x = GlobalAveragePooling2D()(x)
predictions = Dense(NB_CLASSES, activation='softmax', name='predictions')(x)
my_model = Model(inputs=model_inceptionv3_conv.input, outputs=predictions)
test_img = np.random.rand(1,299,299,3)
preds = my_model.predict(test_img)

Веселитесь!

0 голосов
/ 25 октября 2019

Я обнаружил, что есть проблема с моим собственным кодом. Я использую неправильную мысль. Я использую набор tenorsflow.keras ранее, но мой исходный код основан только на keras, а не tenorflow.keras.

До

import tensorflow as tf
tf.keras.backend.set_session(sess)

После

import keras
keras.backend.set_session(sess)

Затем можно выполнить следующий код. Неинициализированные значения исчезли.

x = tf.placeholder(tf.float32, shape=(None, 299, 299,
                                          3))
preds = model(x)
sess.run(preds, feed_dict={x: x_val})
0 голосов
/ 24 октября 2019

Если вы хотите получить градиент d (preds) / d (x), вы можете использовать K.gradients и заключить в K.function.

from tensorflow.keras import backend as K

grad = K.gradients(my_model.output, my_model.input)
get_grad = K.function(my_model.input, grad)

test_data = np.random.rand(1,299,299,3)
res_grad = get_grad(test_img)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...