我有一个用于图像识别的模型。我正在训练模型识别三个类,每个类有1500-3000个图像。我在训练期间监控交叉熵和准确度,我看到它们随着模型训练而改进。训练结束后,我重新加载模型并用它来预测一些额外的图像。为了证明我所看到的,然后我使用该模型来预测4个新图像的类成员资格。一个图像是合法的,一个是全0,一个是1,一个只是一个空数组。我的数据是按比例缩放的,所以这基本上给了我一个全0的数组,一个在.5&s;一个,一个在1&1;左右,另一个在0&s; s附近。下面是我重新加载模型和预测新图像的代码。
ckpt = tf.train.get_checkpoint_state("./complex_model/")
saver = tf.train.import_meta_graph(ckpt.model_checkpoint_path + '.meta')
x_image = tf.get_collection("x")[0]
keep_prob = tf.get_collection("keep_prob")[0]
batch_size_var = tf.get_collection("batch_size")[0]
logits = tf.get_collection("logits")[0]
y = tf.get_collection("y")[0]
with tf.Session() as sess:
saver.restore(sess, ckpt.model_checkpoint_path)
logger.info("Model restored: {0}".format(ckpt.model_checkpoint_path))
image, _ = ImageUtil().reformat(images, None, 3)
image = np.concatenate((image, np.ndarray([1,60,60, 1])))
image_names.append("no val")
image = np.concatenate((image, np.ones([1,60,60, 1])))
image_names.append("ones")
image = np.concatenate((image, np.zeros([1,60,60, 1])))
image_names.append("zeros")
feed_dict = {x_image: image, keep_prob: 1, batch_size_var: image.shape[0]}
prediction, logits = sess.run([y, logits], feed_dict=feed_dict)
我可以看到重新加载的模型是最新的,因为我使用全局步骤并训练了数千次迭代,并且它始终使用正确的全局步骤附加数加载模型。但是,该模型预测我提供的任何数据的相同logits和概率。我错过了一步还是忽略了会引起这种情况的事情?下面是类预测的JSON响应,我已经验证了这正是我的sess.run返回的内容。我在培训期间包含了断点,以确保所有图像在训练阶段都不会返回相同的logits,但事实并非如此。
"predictions": {
"/data/predict/actual_image.jpg": [
0.39970365166664124,
0.3874140679836273,
0.21288223564624786
],
"no val": [
0.39970365166664124,
0.3874140679836273,
0.21288223564624786
],
"ones": [
0.39970365166664124,
0.3874140679836273,
0.21288223564624786
],
"zeros": [
0.39970365166664124,
0.3874140679836273,
0.21288223564624786
]
},
我添加了一些额外的代码来查看我的权重,我注意到我的所有第一层权重都是nan的问题。
variables = tf.get_collection(tf.GraphKeys.VARIABLES)
layer_1_weights = variables[0].eval() <- all nan
layer_2_weights = variables[2].eval() <- -2 - 2
layer_3_weights = variables[4].eval() <- -.11 - .31
layer_4_weights = variables[6].eval() <- -.08 -.3