2017-09-28 16 views
1

私はKeras 1.xから2.xにプロジェクトを移行しています。keras.backend.conv2dをKeras 1.xから2.xに移行する

コードでは、1.xで正常に動作していたkeras.backend.conv2d操作が2.xでクラッシュするようになりました。

convs = K.conv2d(a, b, padding='valid', data_format='channels_first') 

入力テンソルはa形状とb両方(1024, 4, 1, 1)出力テンソル形状は1.xで(1024, 1024, 1, 1)たあります私は次のエラーを取得してい2.xでは

ValueError: CorrMM: impossible output shape 
    bottom shape: 1024 x 4 x 1 x 1 
    weights shape: 1 x 1 x 1024 x 4 
    top shape: 1024 x 1 x -1022 x -2 

Apply node that caused the error: CorrMM{valid, (1, 1), (1, 1), 1 False}(Print{message='a', attrs=('__str__',), global_fn=<function DEBUG_printTensorShape at 0x00000272EF1FAD08>}.0, Subtensor{::, ::, ::int64, ::int64}.0) 
Toposort index: 30 
Inputs types: [TensorType(float32, (False, False, True, True)), TensorType(float32, (True, True, False, False))] 
Inputs shapes: [(1024, 4, 1, 1), (1, 1, 1024, 4)] 

私はTheanoバックエンドを使用して、そしてK.set_image_data_formatconv2dchannels_firstの両方を設定しています。

答えて

1

conv2Dの方法では、aが実際のイメージであり、bがカーネルです。


aの予想形状( "channels_first" で)である:

(batchSize, channels, side1, side2) 

だから、あなたの入力があります

  • 1024画像
  • 4チャネル
  • 画像1×1

しかし'channels_last'を使用しますが、bの予想形状は、次のとおりです。

(side1,side2, inputChannels,outputChannels) 

フィルタでは、それはまだチャンネル最後であるので、これは、少し誤解を招くようです。あなたの出力が(1024,1024,1,1)た場合

だから、私は1024の出力フィルタを持っている必要がありbを想定して(私のkerasにバージョン2.0.4をテスト済み)、それは次のように形作られるべきである。

(1,1,4,1024) 

あなたはおそらく使用する必要があります再構成だけでなく、次元を置換するいくつかの方法。ナンシーはswapaxes、ケラスはK.permute_dimensionsです。

+0

'K.permute_dimensions(x、(3,2,1,0))'がその仕事をしました。ありがとう! – Overdrivr

関連する問題