2017-03-05 10 views
0

私は短期間Tensorflowを使用しています。ここに私の問題がある: 私はそれに微調整を行うためのAlexNet重みをロードするので、私はので、私は定義されたサイズ50 のバッチを与える:Tensorflowのプレースホルダーの形状

# Graph input 
x = tf.placeholder(tf.float32, [50, 227, 227, 3]) 
y = tf.placeholder(tf.float32, [None, 40]) 

私は50枚の画像のバッチを与え、40の出力を取得したいですクラス。

は、その後、私は私がトレーニングを行うことができます

class Model: 
@staticmethod 
def alexnet(_X, _dropout): 
    # Layer 1 (conv-relu-pool-lrn) 
    conv1 = conv(_X, 11, 11, 96, 4, 4, padding='VALID', name='conv1') 
    conv1 = max_pool(conv1, 3, 3, 2, 2, padding='VALID', name='pool1') 
    norm1 = lrn(conv1, 2, 2e-05, 0.75, name='norm1') 
    # Layer 2 (conv-relu-pool-lrn) 
    conv2 = conv(norm1, 5, 5, 256, 1, 1, group=2, name='conv2') 
    conv2 = max_pool(conv2, 3, 3, 2, 2, padding='VALID', name='pool2') 
    norm2 = lrn(conv2, 2, 2e-05, 0.75, name='norm2') 
    # Layer 3 (conv-relu) 
    conv3 = conv(norm2, 3, 3, 384, 1, 1, name='conv3') 
    # Layer 4 (conv-relu) 
    conv4 = conv(conv3, 3, 3, 384, 1, 1, group=2, name='conv4') 
    # Layer 5 (conv-relu-pool) 
    conv5 = conv(conv4, 3, 3, 256, 1, 1, group=2, name='conv5') 
    pool5 = max_pool(conv5, 3, 3, 2, 2, padding='VALID', name='pool5') 
    # Layer 6 (fc-relu-drop) 
    fc6 = tf.reshape(pool5, [-1, 6*6*256]) 
    fc6 = fc(fc6, 6*6*256, 4096, name='fc6') 
    fc6 = dropout(fc6, _dropout) 
    # Layer 7 (fc-relu-drop) 
    fc7 = fc(fc6, 4096, 4096, name='fc7') 
    fc7 = dropout(fc7, _dropout) 
    # Layer 8 (fc-prob) 
    fc8 = fc(fc7, 4096, 40, relu=False, name='fc8') 
    return fc8 # fc8 and fc7 (for transfer-learning) 

私のモデルを定義し、それを

keep_var = tf.placeholder(tf.float32) 

# Model 
pred = Model.alexnet(x, keep_var) 

を作成し、それがうまく動作しますが、最後に、私は1つの画像だけを与えたいと思うが、 xプレースホルダとyプレースホルダは50個の画像に対して定義されているため、エラーが発生します。 はここでトレーニングした後に私のコードは、1枚の画像のみ与えることです:

x_test = tf.placeholder(tf.float32, [1, 227, 227, 3]) 
    y_test = tf.placeholder(tf.float32, [None, 40]) 
    img = loaded_img_train[0][:][:][:] # Only one image 
    label = loaded_lab_train[0][:] # Only one label 
    prediction = sess.run(pred, feed_dict={x_test: [img],  y_test: [label], keep_var: 1.}) 

をそして、それは私に、このエラーが発生します。

InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'Placeholder' with dtype float and shape [50,227,227,3] 
[[Node: Placeholder = Placeholder[dtype=DT_FLOAT, shape=[50,227,227,3], _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

私は私が欲しいの入力サイズを養うために方法を考え出したことはできません。

私の運動を直接CNN

あなたの助けのおかげで多くのことをして花の認識からインスピレーションを得ています! ギョーム

答えて

1

図形の最初の寸法を固定サイズに設定する代わりに、数値の代わりにNoneを設定することで、図形の最初の寸法に可変サイズを使用できます。 Tensorflowは、入力サイズと形状の他の寸法の固定サイズによってバッチサイズを計算することができます。

プレースホルダXの
y = tf.placeholder(tf.float32, [None, 40]) 

、あなたが設定する必要があります:プレースホルダYの

は、あなたが正しいことを行った

x = tf.placeholder(tf.float32, [None, 227, 227, 3]) 
+0

を、私はそれをしなかったが、私は定義されたとき、私は別のエラーを得た私畳み込みレイヤー: 'バイアス= tf.reshape(tf.nn.bias_add(conv、biases)、 conv.get_shape()。as_list())' 'TypeError:期待されるバイナリまたはユニコード文字列、None ' これはconv.get_shapにありますe()に問題があります。 – guillaumegg10

+0

コンバージョンは、次のように定義される。 '畳み込み=ラムダI、K:tf.nn.conv2d( I、K、[1、S_H、s_w、1]、パディング=パディング)tf.variable_scope(名前)と としてスコープ: #convレイヤの重みとバイアスのtf変数を作成する kernel = make_var( 'weights'、shape = [k_h、k_w、int(c_i)/ group、c_o]) biases = make_var( 'biases' 、[c_o]) グループ== 1の場合: conv = convolve(入力、カーネル) ' – guillaumegg10

+0

私は少し迷っています。練習が必要だ ! – guillaumegg10

関連する問題