2016-12-30 4 views
3

私は畳み込みニューラルネットワークでカラー画像を処理するためにテンソルフローを使用しています。コードスニペットは次のとおりです。Tensorflowカラー入力の3チャンネル順

私のコードが実行されるので、私はチャンネルの数が正しいと思います。私の質問は、どのように正しくrgbデータを注文するのですか?それはrgbrgbrgbの形式ですか、それともrrrgggbbbですか?現在私は後者を使用しています。ありがとう。どんな助けもありがとう。

c_output = 2 
    c_input = 784 * 3 

    def weight_variable(shape): 
     initial = tf.truncated_normal(shape, stddev=0.1) 
     return tf.Variable(initial) 

    def bias_variable(shape): 
     initial = tf.constant(0.1, shape=shape) 
     return tf.Variable(initial) 

    def conv2d(x, W): 
     return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 

    def max_pool_2x2(x): 
     return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], 
           strides=[1, 2, 2, 1], padding='SAME') 

    self.c_x = tf.placeholder(tf.float32, shape=[None, c_input]) 
    self.c_y_ = tf.placeholder(tf.float32, shape=[None, c_output]) 

    self.W_conv1 = weight_variable([5, 5, 3, 32]) 
    self.b_conv1 = bias_variable([32]) 
    self.x_image = tf.reshape(self.c_x, [-1, 28, 28 , 3]) 
    self.h_conv1 = tf.nn.relu(conv2d(self.x_image, self.W_conv1) + self.b_conv1) 
    self.h_pool1 = max_pool_2x2(self.h_conv1) 

    self.W_conv2 = weight_variable([5, 5, 32, 64]) 
    self.b_conv2 = bias_variable([64]) 

    self.h_conv2 = tf.nn.relu(conv2d(self.h_pool1, self.W_conv2) + self.b_conv2) 
    self.h_pool2 = max_pool_2x2(self.h_conv2) 

    self.W_fc1 = weight_variable([7 * 7 * 64, 1024]) 
    self.b_fc1 = bias_variable([1024]) 

    self.h_pool2_flat = tf.reshape(self.h_pool2, [-1, 7 * 7 * 64 ]) 
    self.h_fc1 = tf.nn.relu(tf.matmul(self.h_pool2_flat, self.W_fc1) + self.b_fc1) 

    self.keep_prob = tf.placeholder(tf.float32) 
    self.h_fc1_drop = tf.nn.dropout(self.h_fc1, self.keep_prob) 

    self.W_fc2 = weight_variable([1024, c_output]) 
    self.b_fc2 = bias_variable([c_output]) 

    self.y_conv = tf.matmul(self.h_fc1_drop, self.W_fc2) + self.b_fc2 

    self.c_cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(self.y_conv, self.c_y_)) 
    self.c_train_step = tf.train.AdamOptimizer(1e-4).minimize(self.c_cross_entropy) 
    self.c_correct_prediction = tf.equal(tf.argmax(self.y_conv, 1), tf.argmax(self.c_y_, 1)) 
    self.c_accuracy = tf.reduce_mean(tf.cast(self.c_correct_prediction, tf.float32)) 

答えて

2

TL; DR:あなたの現在のプログラムでは、データのメモリレイアウトはRGBRGBRGBRGBする必要がありますする必要があります...

私はあなたがRGB画像に渡している。このラインから仮定28x28ピクセルで:

self.x_image = tf.reshape(self.c_x, [-1, 28, 28, 3]) 

我々はself.x_imageの寸法を呼び出すことができる「バッチ」、「高さ」、「幅」、および「チャネル」です。これは、tf.nn.conv_2d()tf.nn.max_pool()のデフォルトデータ形式に一致します。

TensorFlowでは、テンソルのメモリ内表現はrow-major order(またはCプログラミング言語の配列の表現であるため「C」順序です)です。したがって

[0, 0, 0, 0] 
[0, 0, 0, 1] 
[0, 0, 0, 2] 
[0, 0, 1, 0] 
... 
[?, 27, 27, 1] 
[?, 27, 27, 2] 

あなたを:基本的にはこれが一番右の次元が最も速く変化しており、テンソルの要素は、次の順序でメモリに一緒にパックされていることを意味します(不明なバッチサイズのため?スタンド、マイナス1)プログラムが画像データを正しく解釈していない可能性があります。 、実際には

self.x_image = tf.reshape(self.c_x, [-1, 3, 28, 28]) 

  1. その真の順( "バッチ"、 "チャンネル"、 "高さ"、 "幅")と一致するようにあなたのデータをリシェイプ:少なくとも2つのオプションがあります。この形式は時には畳み込みの方が効率的です。 tf.nn.conv2d()tf.nn.max_pool()に、オプションの引数data_format="NCHW"を渡すことで転置せずに使用するように指示できますが、バイアス変数の形状を一致させる必要があります。

  2. tf.transpose()を使用してプログラムの結果に合わせて画像データをトランスポーズ:私はまた、画像ベースのアーキテクチャを使用して、トレーニングのためのデータをいくつかの(非画像)をフォーマットしようとしている

    self.x_image = tf.transpose(tf.reshape(self.c_x, [-1, 3, 28, 28]), [0, 2, 3, 1]) 
    
+0

。あなたは "バッチ"、 "高さ"、 "幅"、 "チャンネル"と言いますが、私はこれらの次元が何を含んでいるのか少し混乱しています。私の推測は >など、それは正しいですか? – mrwheet

+0

ほぼNHWC形式の4-Dテンソルの要素[[i、j、k、l]は、バッチ要素 'i'、y座標 'j'、x座標 'k' 「l」。 – mrry

+0

ああ、もちろん...ちょうど私の座標が逆転した。ありがとう! – mrwheet

関連する問題