2017-05-26 11 views
0

Tensorflowでプログラミングを始めたばかりですが、私はすでに一般的なニューラルネットワークのコンセプトに非常に満足しています(私の大学を非難しています。私はthis CNN exampleの実装を変更して自分のデザインを動作させるようにしてきました。私の質問は、重量の初期化についてです:Tensorflow CNN MNISTの例、体重の範囲

weights = { 
    # 5x5 conv, 1 input, 32 outputs (i.e. 32 filters) 
    'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32])), 
    # 5x5 conv, 32 inputs, 64 outputs 
    'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64])), 
    # fully connected, 7*7*64 inputs, 1024 outputs 
    'wd1': tf.Variable(tf.random_normal([7*7*64, 1024])), 
    # 1024 inputs, 10 outputs (class prediction) 
    'out': tf.Variable(tf.random_normal([1024, n_classes])) 
} 

第二層は32個の入力と64個の出力を持っている場合は、それはそれだけで2フィルタを適用することを意味するのでしょうか? (?これほど少ないようです)そして、それは、5つの連続3x3のCONV層を実装するために、という意味ではない、私はこのようなその層におけるフィルタの数と出力の前の数乗じておく必要があります:それはちょうど感じ

weights = { 
    'wc1': tf.Variable(tf.random_normal([3, 3, 1, 20])), 
    'wc2': tf.Variable(tf.random_normal([3, 3, 20, 41])), 
    'wc3': tf.Variable(tf.random_normal([3, 3, 20*41, 41])), 
    'wc4': tf.Variable(tf.random_normal([3, 3, 20*41*41, 62])), 
    'wc5': tf.Variable(tf.random_normal([3, 3, 20*41*41*62, 83])), 
    'out': tf.Variable(tf.random_normal([3, 3, 20*41*41*62*83, n_classes])) 
} 

を私は何か間違っているようです。

答えて

2

ええ、何か間違っています。

あなたの入力行列は、深さが最初に1

はのは、[3,3,1,20]例としてWC1を見てみましょうで[バッチ、高さ、幅、深さ]です。これは、20種類のフィルタを持つことを意味し、各フィルタは1つの深さにまたがり、3x3の高さx幅をカバーします。各フィルタは、すべての深さにわたる画像全体を通過します。

概念的に、ピクセル強度であった深さは、前のピクセルの周りの3x3ピクセルあたり20クラスになる可能性があります。

[3、3、20、41]を適用すると、それぞれのフィルタが高さ20、幅3x3の41個のフィルタが41個のフィルタを作成し、 41種類のフィルタのうちの結果は[バッチ、高さ、幅、41]、または1ピクセルあたり41クラスです。

あなたの次の変換は[3、3、20 * 41、41]で間違っています。 20×41の深さを持たないでください。深さは41です。 、あなたはmax_poolingをやったりしていない場合は、パディングかに応じ

weights = { 
    'wc1': tf.Variable(tf.random_normal([3, 3, 1, 20])), 
    'wc2': tf.Variable(tf.random_normal([3, 3, 20, 41])), 
    'wc3': tf.Variable(tf.random_normal([3, 3, 41, 41])), 
    'wc4': tf.Variable(tf.random_normal([3, 3, 41, 62])), 
    'wc5': tf.Variable(tf.random_normal([3, 3, 62, 83])), 
    'out': tf.Variable(tf.random_normal([1, 1, 83, n_classes])) 
} 

WC5を適用した後、出力形状を決定します。ここでは

はあなたが必要とするアップデートです。

wc1の後に[1,2,2,1] max_poolを適用した場合、[height、width]は[28,28]から[14,14]に減少します。

wc2の後に別の[1,2,2,1] max_poolがある場合、[height、width]は[14,14]から[7,7]に減少します。

7は、2で割り切れるわけではありません。wc3がパディングなしで適用される場合、[height、width]は[7,7]から[5,5]に減少します。 wc4 - > [3,3]とwc5 - > [1,1]の場合も同様です。

最後には[バッチ、1,1,83]マトリックスになり、[バッチ、1,1、クラス]マトリックスに変換されます。

+0

ご説明いただきありがとうございます!あなたは私をたくさん助けてくれました。 – Jornam