2017-01-11 3 views
1

私は現在、当初-v3のアーキテクチャを理解しようとしていますし、モデルの層の定義を詳しく見て取っていた。テンソルフローのスコープ内の引数をローカルに指定すると、同じタイプのすべての引数が上書きされますか?

with scopes.arg_scope([ops.conv2d, ops.max_pool, ops.avg_pool],stride=1, padding=’VALID’): 
    # 299 x 299 x 3 
    end_points[’conv0’] = ops.conv2d(inputs, 32, [3, 3], stride=2,scope=’conv0’) 
    # 149 x 149 x 32 
    end_points[’conv1’] = ops.conv2d(end_points[’conv0’], 32, [3, 3], scope=’conv1’) 
    # 147 x 147 x 32 
    end_points[’conv2’] = ops.conv2d(end_points[’conv1’], 64, [3, 3], padding=’SAME’, scope=’conv2’) 
    # 147 x 147 x 64 
    end_points[’pool1’] = ops.max_pool(end_points[’conv2’], [3, 3], stride=2, scope=’pool1’) 
    # 73 x 73 x 64 
    end_points[’conv3’] = ops.conv2d(end_points[’pool1’], 80, [1, 1], scope=’conv3’) 
    # 73 x 73 x 80. 
    end_points[’conv4’] = ops.conv2d(end_points[’conv3’], 192, [3, 3], scope=’conv4’) 
    # 71 x 71 x 192. 
    end_points[’pool2’] = ops.max_pool(end_points[’conv4’], [3, 3], stride=2, scope=’pool2’) 
    # 35 x 35 x 192. 
    net = end_points[’pool2’] 

は、それぞれの層の寸法を確認し、私が最初に見てみなければなりませんでした異なるパディングスタイル:VALIDおよびSAMEVALIDはエッジを破棄しますが、SAMEは実際に両側で均等にパッドされるため、コンボリューションはエッジでも機能します。 これは、たとえば、299x299ピクセルから149x149までの2番目のレイヤーを保持しているため、すべての奇数ピクセルのみを考慮します。[フィルタサイズ:[3,3]]で終わり、パディングは150x150ではなく149x149です。 VALID(エッジは破棄されます)。同じフィルタサイズでこのレイヤーを再びコンボリューションしますが、今では1のストライドはエッジの「苦しみ」が破棄されるため147x147になります。このレイヤーは再び畳み込まれますが、今やひねられて、そのパディングはSAMEに設定され、前のレイヤーと同じ147x147のサイズになります。

が今私を混乱させるスポット来る: はと仮定しSAMEパディングがconv2層に対してのみ有効だったと世界的にまだVALIDに設定されている、pool1のディメンションが正しくによりエッジを廃棄する73x73として示されています。 次の畳み込みレイヤーに行くときは、それが71x71になると予想して、VALIDパディングをアクティブにしました。しかし、conv3の出力は73x73のままであり、つまり、SAMEのパディングが使用されていることを意味します。しかし、conv4では、埋め込みはVALIDと思われ、71x71にサイズを縮小すると完全に混乱します。スリムのarg_scopeのgithubの上のreadmeの

私は、引数のいずれかを設定すると、ローカルに与えられたグローバルな引数よりも優先されますことを、発見:

with slim.arg_scope([slim.ops.conv2d], padding='SAME', stddev=0.01, weight_decay=0.0005): 
    net = slim.ops.conv2d(inputs, 64, [11, 11], scope='conv1') 
    net = slim.ops.conv2d(net, 128, [11, 11], padding='VALID', scope='conv2') 
    net = slim.ops.conv2d(net, 256, [11, 11], scope='conv3') 

を例が示すように、arg_scopeの使用は、コード なりますよりシンプルで簡単に維持することができます。引数 はarg_scopeで指定されていますが、ローカルで上書きすることができます。 特に、パディング引数が 'SAME'に設定されている間に、 の第2のコンボリューションは、 'VALID'の値でオーバーライドします。

しかし、これはそうエッジと最終プーリング層pool2を維持することは、その後も、37x37になり、パディングがSAMEになるのでconv4も73x73の寸法を有するべきであること、を意味します。

私の欠点は何ですか?私のミスはどこですか? 私を助けてくれてありがとう、私は混乱している問題を明確にしたことを願っています。

+0

あまり便利ではありませんが、用語は「畳み込み」であり、「畳み込み」ではありません。 :) –

+0

@chris_anderson thx、それを変更しました:D – Martin

答えて

0

私はpool1層のためのフィルタサイズは、実際に[1,1]がそう、それは寸法を縮小されていないで、それは正確にどのようにそれが必要とどまるようarg_scopeとは何の関係もありません表示されませんでした。

関連する問題