前提・実現したいこと
python初心者です。
kerasでMaxpooling(フィルタサイズ2×2)を行わずにconvolution(畳み込み層)のフィルタサイズ(カーネルサイズ)=3×3、ストライド=2とすることで画像情報を半減させたいです。
具体的にはU-Netを用いて入力画像180×180→90×90→45×45→90×90→180×180というようにダウンサンプリング、アップサンプリングを行いたいです。
尚、convolution層でのフィルタサイズ=3×3、ストライド=1とした場合は正常に動作しますが、フィルタサイズを上記のように変更したところエラーが発生します。
発生している問題・エラーメッセージ
ValueError: `Concatenate` layer requires inputs with matching shapes except for the concat axis. Got inputs shapes: [(None, 2, 2, 128), (None, 3, 3, 64)]
該当のソースコード
python
#スライス画像をゼロパディングする→元画像のshape(49, 180, 180, 1)から(49, 182, 182, 1)に変更されていることを確認 train_a_slisepadding=np.pad(train_a_slice,((0,0),(1,1),(1,1),(0,0)),'constant') train_b_slisepadding=np.pad(train_b_slice,((0,0),(1,1),(1,1),(0,0)),'constant') def network_unet_simple3(): input_img = Input(shape=(IMAGE_SIZE, IMAGE_SIZE,1)) enc1 = Conv2D(32, kernel_size=3, strides=2, activation="relu", padding="same")(input_img) enc1 = BatchNormalization()(enc1) enc1 = Conv2D(32, kernel_size=3, strides=2, activation="relu", padding="same")(enc1) enc1 = BatchNormalization()(enc1) enc1 = Conv2D(32, kernel_size=3, strides=2, activation="relu", padding="same")(enc1) enc1 = BatchNormalization()(enc1) enc2 = Conv2D(64, kernel_size=3, strides=2, activation="relu", padding="same")(enc1) enc2 = BatchNormalization()(enc2) enc2 = Conv2D(64, kernel_size=3, strides=2, activation="relu", padding="same")(enc2) enc2 = BatchNormalization()(enc2) enc2 = Conv2D(64, kernel_size=3, strides=2, activation="relu", padding="same")(enc2) enc2 = BatchNormalization()(enc2) enc3 = Conv2D(128, kernel_size=3, strides=2, activation="relu", padding="same")(enc2) enc3 = BatchNormalization()(enc3) enc3 = Conv2D(128, kernel_size=3, strides=2, activation="relu", padding="same")(enc3) enc3 = BatchNormalization()(enc3) enc3 = Conv2D(128, kernel_size=3, strides=2, activation="relu", padding="same")(enc3) enc3 = BatchNormalization()(enc3) enc3 = Conv2D(128, kernel_size=3, strides=2, activation="relu", padding="same")(enc3) enc3 = BatchNormalization()(enc3) up2 = UpSampling2D(size=2)(enc3) dec2 = concatenate([up2, enc2], axis=2) dec2 = Conv2D(64, kernel_size=3, strides=2, activation="relu", padding="same")(dec2) dec2 = BatchNormalization()(dec2) dec2 = Conv2D(64, kernel_size=3, strides=2, activation="relu", padding="same")(dec2) dec2 = BatchNormalization()(dec2) dec2 = Conv2D(64, kernel_size=3, strides=2, activation="relu", padding="same")(dec2) dec2 = BatchNormalization()(dec2) up1 = UpSampling2D(size=2)(dec2) dec1 = concatenate([up1, enc1], axis=2) dec1 = Conv2D(32, kernel_size=3, strides=2, activation="relu", padding="same")(dec1) dec1 = BatchNormalization()(dec1) dec1 = Conv2D(32, kernel_size=3, strides=2, activation="relu", padding="same")(dec1) dec1 = BatchNormalization()(dec1) dec1 = Conv2D(32, kernel_size=3, strides=2, activation="relu", padding="same")(dec1) dec1 = BatchNormalization()(dec1) dec1 = Conv2D(1, kernel_size=1, strides=1, activation="sigmoid", padding="same")(dec1) model = Model(input=input_img, output=dec1) return model model = network_unet_simple3() # ネットワークを表示 print(model.summary()) #通常のU-Netは以下のような構造をしていますので別途記載しておきます。 # def network_unet_simple3(): # input_img = Input(shape=(IMAGE_SIZE, IMAGE_SIZE,1)) # enc1 = Conv2D(32, kernel_size=3, strides=1, activation="relu", padding="same")(input_img) # enc1 = BatchNormalization()(enc1) # enc1 = Conv2D(32, kernel_size=3, strides=1, activation="relu", padding="same")(enc1) # enc1 = BatchNormalization()(enc1) # enc1 = Conv2D(32, kernel_size=3, strides=1, activation="relu", padding="same")(enc1) # enc1 = BatchNormalization()(enc1) # down1 = MaxPooling2D(pool_size=2, strides=2)(enc1) # enc2 = Conv2D(64, kernel_size=3, strides=1, activation="relu", padding="same")(down1) # enc2 = BatchNormalization()(enc2) # enc2 = Conv2D(64, kernel_size=3, strides=1, activation="relu", padding="same")(enc2) # enc2 = BatchNormalization()(enc2) # enc2 = Conv2D(64, kernel_size=3, strides=1, activation="relu", padding="same")(enc2) # enc2 = BatchNormalization()(enc2) # down2 = MaxPooling2D(pool_size=2, strides=2)(enc2) # enc3 = Conv2D(128, kernel_size=3, strides=1, activation="relu", padding="same")(down2) # enc3 = BatchNormalization()(enc3) # enc3 = Conv2D(128, kernel_size=3, strides=1, activation="relu", padding="same")(enc3) # enc3 = BatchNormalization()(enc3) # enc3 = Conv2D(128, kernel_size=3, strides=1, activation="relu", padding="same")(enc3) # enc3 = BatchNormalization()(enc3) # enc3 = Conv2D(128, kernel_size=3, strides=1, activation="relu", padding="same")(enc3) # enc3 = BatchNormalization()(enc3) # up2 = UpSampling2D(size=2)(enc3) # dec2 = concatenate([up2, enc2], axis=-1) # dec2 = Conv2D(64, kernel_size=3, strides=1, activation="relu", padding="same")(dec2) # dec2 = BatchNormalization()(dec2) # dec2 = Conv2D(64, kernel_size=3, strides=1, activation="relu", padding="same")(dec2) # dec2 = BatchNormalization()(dec2) # dec2 = Conv2D(64, kernel_size=3, strides=1, activation="relu", padding="same")(dec2) # dec2 = BatchNormalization()(dec2) # up1 = UpSampling2D(size=2)(dec2) # dec1 = concatenate([up1, enc1], axis=-1) # dec1 = Conv2D(32, kernel_size=3, strides=1, activation="relu", padding="same")(dec1) # dec1 = BatchNormalization()(dec1) # dec1 = Conv2D(32, kernel_size=3, strides=1, activation="relu", padding="same")(dec1) # dec1 = BatchNormalization()(dec1) # dec1 = Conv2D(32, kernel_size=3, strides=1, activation="relu", padding="same")(dec1) # dec1 = BatchNormalization()(dec1) # dec1 = Conv2D(1, kernel_size=1, strides=1, activation="sigmoid", padding="same")(dec1) # model = Model(input=input_img, output=dec1) # return model # model = network_unet_simple3()
試したこと
サイトでは「各種のディープラーニングフレームワークでは、Convolutionのパディング方式として"SAME"モードが指定できると思いますが、ナイーブにこれを使うと、ダウンサンプリング層のたびに受容領域の位置が出力に対してずれていくという問題があります。ダウンサンプリングの回数を予め考慮してはじめにパディングをしてしまうことで、簡単に解消できます。」と書かれていたため、入力画像にあらかじめゼロパディングを行いましたが、結果は変わらず上記に示すエラーとなりました。そもそものパディングのコードが違うのかそれとも原因は別にあるのかすらも検討もつかない状況です。どなたか教えていただければ幸いです。よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
まだ回答がついていません
会員登録して回答してみよう