我有一个模型,我用于图像识别 . 我正在训练模型识别三个类,每个类有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