keras预训练模型提供了一个新的输入占位符

时间:2019-10-24 15:11:04

标签: python tensorflow keras

我有一个经过训练的模型。像这样

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})

错误 FailedPreconditionError:尝试使用未初始化的值batch_normalization_86 / moving_mean ......

4 个答案:

答案 0 :(得分:1)

您的错误在这里:

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)

玩得开心!

答案 1 :(得分:1)

如果要向图形添加新的占位符,则必须遵循以下步骤:-

  • 使用my_model.save()函数将模型的权重保存在一个文件中
  • 通过添加占位符并加载模型权重来再次构建图

这是一个可行的示例-

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

答案 2 :(得分:0)

如果要获得梯度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)

答案 3 :(得分:0)

我发现自己的代码有问题。我用错了。我以前使用tensorflow.keras set sess,但是我的原始代码仅基于keras,而不基于tensorflow.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})