2017-03-09 22 views
6

私はtf.slimを使用して自動エンコーダーを実装しています。私は、次のアーキテクチャと完全にたたみ込みます:Tensorflowでのレイヤーウェイトの再利用

[conv, outputs = 1] => [conv, outputs = 15] => [conv, outputs = 25] => 
=> [conv_transpose, outputs = 25] => [conv_transpose, outputs = 15] => 
[conv_transpose, outputs = 1] 

それは完全に畳み込みであることを、私は(より大きな問題の制限)をプールすることができない持っています。私は縛られた重みを使用したいので、

encoder_W_3 = decoder_W_1_Transposed 

(第1のデコーダ層のように重みが最後のエンコーダ層のもの、転置されています)。

私は重みにtfslimは、あなたがそれらを再利用することができます通常の方法を再利用した場合、すなわちリユース=真、その後、ちょうどあなたが再利用したい層のスコープ名を提供し、私はサイズの問題を得る:

ValueError: Trying to share variable cnn_block_3/weights, but specified shape (21, 11, 25, 25) and found shape (21, 11, 15, 25). 

これは作ります前のモデルのウェイトを転置しないと、意味があります。どのように私はこれらの重量を転置することができますか?

PS:これは非常に抽象的で手を振っていることはわかっていますが、私はtfslimの上にカスタムapiを使って作業していますので、ここでコード例を投稿することはできません。

+0

私が知っているように、Tensorflowの重みは '[filter_height、filter_width、in_channels、out_channels]'のような形をしています。私は、各レイヤーで同じフィルターサイズを使用していると仮定します。したがって、ウェイトをトランスポーズするとき、デコーダとコーダーの対応が必要ですか?例えば、[outputs = 1] => [outputs = 15]は '[outputs = 15] => [outputs = 1]'だけで使用できます。エラーメッセージから、 '25 => 25 'に' 15 => 25 'が割り当てられていると思います。しかし、これらの2つのレイヤーの重みの数が異なる場合、それらをどのように共有することができますか? – Seven

答えて

2

私はこれらの重量をどのように転置することができますか?

転位は単純です:

new_weights = tf.transpose(weights, perm=[0, 1, 3, 2]) 

は、最後の二つの軸を交換します。

しかし、前述のように、重みの総数が変更されたため、エラーに対処するには十分ではありません。

+0

これは、既存の変数の転置に適しています。しかし、tf.slimでは、カーネルの重みが抽象化の背後に隠れているので、それらを再利用(および転置)することは、まだ知られていない方法で別のものを使って行うべきです... –

関連する問題