我有一个模型,我用于图像识别 . 我正在训练模型识别三个类,每个类有1500-3000个图像 . 我正在监控训练期间的交叉熵和准确性,我看到它们随着模型训练而得到改善 . 训练结束后,我重新加载模型并用它来预测一些额外的图像 . 为了证明我所看到的我然后使用该模型来预测4个新图像的类成员资格 . 一个图像是合法的,一个是全0,一个是1,一个是空数组 . 我的数据是缩放的,所以这基本上给了我一个全0的数组,一个在.5左右,一个在1左右,另一个在0附近 . 下面是我重新加载模型和预测新图像的代码 .
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