我有一个经过训练的模型。像这样
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 ......
答案 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})