web-dev-qa-db-ja.com

TensorFlow ValueError:形状 '(?、64、64、3)'を持つTensor u'Placeholder:0 'の形状(64、64、3)の値をフィードできません

TensorFlowと機械学習は初めてです。カップとペンドライブの2つのオブジェクト(jpeg画像)を分類しようとしています。 model.ckptを正常にトレーニングおよびエクスポートしました。今、予測のために保存されたmodel.ckptを復元しようとしています。スクリプトは次のとおりです。

import tensorflow as tf
import math
import numpy as np
from PIL import Image
from numpy import array


# image parameters
IMAGE_SIZE = 64
IMAGE_CHANNELS = 3
NUM_CLASSES = 2

def main():
    image = np.zeros((64, 64, 3))
    img = Image.open('./IMG_0849.JPG')

    img = img.resize((64, 64))
    image = array(img).reshape(64,64,3)

    k = int(math.ceil(IMAGE_SIZE / 2.0 / 2.0 / 2.0 / 2.0)) 
    # Store weights for our convolution and fully-connected layers
    with tf.name_scope('weights'):
        weights = {
            # 5x5 conv, 3 input channel, 32 outputs each
            'wc1': tf.Variable(tf.random_normal([5, 5, 1 * IMAGE_CHANNELS, 32])),
            # 5x5 conv, 32 inputs, 64 outputs
            'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64])),
            # 5x5 conv, 64 inputs, 128 outputs
            'wc3': tf.Variable(tf.random_normal([5, 5, 64, 128])),
            # 5x5 conv, 128 inputs, 256 outputs
            'wc4': tf.Variable(tf.random_normal([5, 5, 128, 256])),
            # fully connected, k * k * 256 inputs, 1024 outputs
            'wd1': tf.Variable(tf.random_normal([k * k * 256, 1024])),
            # 1024 inputs, 2 class labels (prediction)
            'out': tf.Variable(tf.random_normal([1024, NUM_CLASSES]))
        }

    # Store biases for our convolution and fully-connected layers
    with tf.name_scope('biases'):
        biases = {
            'bc1': tf.Variable(tf.random_normal([32])),
            'bc2': tf.Variable(tf.random_normal([64])),
            'bc3': tf.Variable(tf.random_normal([128])),
            'bc4': tf.Variable(tf.random_normal([256])),
            'bd1': tf.Variable(tf.random_normal([1024])),
            'out': tf.Variable(tf.random_normal([NUM_CLASSES]))
        }

   saver = tf.train.Saver()
   with tf.Session() as sess:
       saver.restore(sess, "./model.ckpt")
       print "...Model Loaded..."   
       x_ = tf.placeholder(tf.float32, shape=[None, IMAGE_SIZE , IMAGE_SIZE , IMAGE_CHANNELS])
       y_ = tf.placeholder(tf.float32, shape=[None, NUM_CLASSES])
       keep_prob = tf.placeholder(tf.float32)

       init = tf.initialize_all_variables()

       sess.run(init)
       my_classification = sess.run(tf.argmax(y_, 1), feed_dict={x_:image})
       print 'Neural Network predicted', my_classification[0], "for your image"


if __== '__main__':
     main()

予測のために上記のスクリプトを実行すると、次のエラーが表示されます。

ValueError: Cannot feed value of shape (64, 64, 3) for Tensor u'Placeholder:0', which has shape '(?, 64, 64, 3)' 

私は何を間違えていますか?そして、numpy配列の形状を修正するにはどうすればよいですか?

37
Pragyan93

imageの形状は(64,64,3)です。

入力プレースホルダー_xの形状は(?, 64,64,3)です。

問題は、プレースホルダーに異なる形状の値を与えていることです。

(1, 64, 64, 3) = 1つの画像のバッチの値でフィードする必要があります。

image値をサイズ1のバッチに変更します。

image = array(img).reshape(1, 64,64,3)

P.S:入力プレースホルダーが画像のバッチを受け入れるという事実は、画像のバッチの予測を並行して実行できることを意味します。形状(N, 64,64,3)のテンソルを使用して、複数の画像(N個の画像)を読み取って、N個の画像のバッチを作成することができます。

34
nessuno

Powder's コメントは何度も見逃したように検出されない場合があります。それで、それをもっと見やすくすることを望んで、彼の主張を繰り返します。

ときどきimage = array(img).reshape(a,b,c,d)を使用するとうまく形が変わることがありますが、経験から、操作で新しいディメンションを使用しようとするたびにカーネルがクラッシュします。最も安全なのは

np.expand_dims(img、axis = 0)

毎回完璧に機能します。理由を説明できません。 このリンク には、その使用法に関する優れた説明と例があります。

5
rocksyne