質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

フィルタ

フィルタとは、特定の条件に合わせてデータへのアクセスをブロックするプログラムやルーチンを指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1635閲覧

Maxpoolingを行わずにconvolutionのみでダウンサンプリングを行いたい。

1999si

総合スコア0

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

フィルタ

フィルタとは、特定の条件に合わせてデータへのアクセスをブロックするプログラムやルーチンを指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/07 06:48

編集2021/10/08 03:05

前提・実現したいこと

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

1 2 3#スライス画像をゼロパディングする→元画像のshape(49, 180, 180, 1)から(49, 182, 182, 1)に変更されていることを確認 4train_a_slisepadding=np.pad(train_a_slice,((0,0),(1,1),(1,1),(0,0)),'constant') 5train_b_slisepadding=np.pad(train_b_slice,((0,0),(1,1),(1,1),(0,0)),'constant') 6 7def network_unet_simple3(): 8 input_img = Input(shape=(IMAGE_SIZE, IMAGE_SIZE,1)) 9 enc1 = Conv2D(32, kernel_size=3, strides=2, activation="relu", padding="same")(input_img) 10 enc1 = BatchNormalization()(enc1) 11 enc1 = Conv2D(32, kernel_size=3, strides=2, activation="relu", padding="same")(enc1) 12 enc1 = BatchNormalization()(enc1) 13 enc1 = Conv2D(32, kernel_size=3, strides=2, activation="relu", padding="same")(enc1) 14 enc1 = BatchNormalization()(enc1) 15 16 17 enc2 = Conv2D(64, kernel_size=3, strides=2, activation="relu", padding="same")(enc1) 18 enc2 = BatchNormalization()(enc2) 19 enc2 = Conv2D(64, kernel_size=3, strides=2, activation="relu", padding="same")(enc2) 20 enc2 = BatchNormalization()(enc2) 21 enc2 = Conv2D(64, kernel_size=3, strides=2, activation="relu", padding="same")(enc2) 22 enc2 = BatchNormalization()(enc2) 23 24 25 enc3 = Conv2D(128, kernel_size=3, strides=2, activation="relu", padding="same")(enc2) 26 enc3 = BatchNormalization()(enc3) 27 enc3 = Conv2D(128, kernel_size=3, strides=2, activation="relu", padding="same")(enc3) 28 enc3 = BatchNormalization()(enc3) 29 enc3 = Conv2D(128, kernel_size=3, strides=2, activation="relu", padding="same")(enc3) 30 enc3 = BatchNormalization()(enc3) 31 enc3 = Conv2D(128, kernel_size=3, strides=2, activation="relu", padding="same")(enc3) 32 enc3 = BatchNormalization()(enc3) 33 34 up2 = UpSampling2D(size=2)(enc3) 35 dec2 = concatenate([up2, enc2], axis=2) 36 dec2 = Conv2D(64, kernel_size=3, strides=2, activation="relu", padding="same")(dec2) 37 dec2 = BatchNormalization()(dec2) 38 dec2 = Conv2D(64, kernel_size=3, strides=2, activation="relu", padding="same")(dec2) 39 dec2 = BatchNormalization()(dec2) 40 dec2 = Conv2D(64, kernel_size=3, strides=2, activation="relu", padding="same")(dec2) 41 dec2 = BatchNormalization()(dec2) 42 43 up1 = UpSampling2D(size=2)(dec2) 44 dec1 = concatenate([up1, enc1], axis=2) 45 dec1 = Conv2D(32, kernel_size=3, strides=2, activation="relu", padding="same")(dec1) 46 dec1 = BatchNormalization()(dec1) 47 dec1 = Conv2D(32, kernel_size=3, strides=2, activation="relu", padding="same")(dec1) 48 dec1 = BatchNormalization()(dec1) 49 dec1 = Conv2D(32, kernel_size=3, strides=2, activation="relu", padding="same")(dec1) 50 dec1 = BatchNormalization()(dec1) 51 52 dec1 = Conv2D(1, kernel_size=1, strides=1, activation="sigmoid", padding="same")(dec1) 53 54 model = Model(input=input_img, output=dec1) 55 56 return model 57model = network_unet_simple3() 58 59# ネットワークを表示 60print(model.summary()) 61 62#通常のU-Netは以下のような構造をしていますので別途記載しておきます。 63# def network_unet_simple3(): 64# input_img = Input(shape=(IMAGE_SIZE, IMAGE_SIZE,1)) 65# enc1 = Conv2D(32, kernel_size=3, strides=1, activation="relu", padding="same")(input_img) 66# enc1 = BatchNormalization()(enc1) 67# enc1 = Conv2D(32, kernel_size=3, strides=1, activation="relu", padding="same")(enc1) 68# enc1 = BatchNormalization()(enc1) 69# enc1 = Conv2D(32, kernel_size=3, strides=1, activation="relu", padding="same")(enc1) 70# enc1 = BatchNormalization()(enc1) 71# down1 = MaxPooling2D(pool_size=2, strides=2)(enc1) 72 73# enc2 = Conv2D(64, kernel_size=3, strides=1, activation="relu", padding="same")(down1) 74# enc2 = BatchNormalization()(enc2) 75# enc2 = Conv2D(64, kernel_size=3, strides=1, activation="relu", padding="same")(enc2) 76# enc2 = BatchNormalization()(enc2) 77# enc2 = Conv2D(64, kernel_size=3, strides=1, activation="relu", padding="same")(enc2) 78# enc2 = BatchNormalization()(enc2) 79# down2 = MaxPooling2D(pool_size=2, strides=2)(enc2) 80 81# enc3 = Conv2D(128, kernel_size=3, strides=1, activation="relu", padding="same")(down2) 82# enc3 = BatchNormalization()(enc3) 83# enc3 = Conv2D(128, kernel_size=3, strides=1, activation="relu", padding="same")(enc3) 84# enc3 = BatchNormalization()(enc3) 85# enc3 = Conv2D(128, kernel_size=3, strides=1, activation="relu", padding="same")(enc3) 86# enc3 = BatchNormalization()(enc3) 87# enc3 = Conv2D(128, kernel_size=3, strides=1, activation="relu", padding="same")(enc3) 88# enc3 = BatchNormalization()(enc3) 89 90# up2 = UpSampling2D(size=2)(enc3) 91# dec2 = concatenate([up2, enc2], axis=-1) 92# dec2 = Conv2D(64, kernel_size=3, strides=1, activation="relu", padding="same")(dec2) 93# dec2 = BatchNormalization()(dec2) 94# dec2 = Conv2D(64, kernel_size=3, strides=1, activation="relu", padding="same")(dec2) 95# dec2 = BatchNormalization()(dec2) 96# dec2 = Conv2D(64, kernel_size=3, strides=1, activation="relu", padding="same")(dec2) 97# dec2 = BatchNormalization()(dec2) 98 99# up1 = UpSampling2D(size=2)(dec2) 100# dec1 = concatenate([up1, enc1], axis=-1) 101# dec1 = Conv2D(32, kernel_size=3, strides=1, activation="relu", padding="same")(dec1) 102# dec1 = BatchNormalization()(dec1) 103# dec1 = Conv2D(32, kernel_size=3, strides=1, activation="relu", padding="same")(dec1) 104# dec1 = BatchNormalization()(dec1) 105# dec1 = Conv2D(32, kernel_size=3, strides=1, activation="relu", padding="same")(dec1) 106# dec1 = BatchNormalization()(dec1) 107 108# dec1 = Conv2D(1, kernel_size=1, strides=1, activation="sigmoid", padding="same")(dec1) 109 110# model = Model(input=input_img, output=dec1) 111 112# return model 113 114# model = network_unet_simple3()

試したこと

サイトでは「各種のディープラーニングフレームワークでは、Convolutionのパディング方式として"SAME"モードが指定できると思いますが、ナイーブにこれを使うと、ダウンサンプリング層のたびに受容領域の位置が出力に対してずれていくという問題があります。ダウンサンプリングの回数を予め考慮してはじめにパディングをしてしまうことで、簡単に解消できます。」と書かれていたため、入力画像にあらかじめゼロパディングを行いましたが、結果は変わらず上記に示すエラーとなりました。そもそものパディングのコードが違うのかそれとも原因は別にあるのかすらも検討もつかない状況です。どなたか教えていただければ幸いです。よろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

Maxpoolingだった場所のみ変更すれば解決できました。

投稿2021/10/08 08:51

1999si

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問