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

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

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

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

Q&A

解決済

1回答

431閲覧

AutoEncorderのような、レイヤーをマージさせるときの処理について

essa

総合スコア81

Keras

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

0グッド

1クリップ

投稿2017/12/08 12:05

###AutoEncorderのようなレイヤーをマージさせるときの処理について
前回質問した内容と関連する質問をさせていただきます。

AutoEncorderの実装を考えております。
Conv2D_1、Conv2D_2、Conv2D_3、とConv2Dを繰り返した後、
Conv2D_transpose(もしくはUpSampling2D)を繰り返すようなことを考えております。
Conv2D_transposeをするときにConv2Dにより畳み込まれた結果をconcatenateにてマージすることを考えております。
前回の質問にて、padding='same'にするといいと回答をいただきました。

画像サイズによっては問題なく動作するのですが、サイズによっては
マージする際に、Conv2Dの結果とConv2D_transposeの結果の画像サイズが合わせる必要があるため質問させていただきました。
マージするレイヤのピクセル数が一致していないみたいです。

例えば、1回の畳み込み・プーリングにて、Input画像の1/2になるようなレイヤーがあったとします。
それが4回続いたとします。

1回目畳み込み・プーリング
2回目畳み込み・プーリング
3回目畳み込み・プーリング
4回目畳み込み・プーリング

その後、4回目の畳み込みに対して逆畳み込みをし、
画像サイズを3回目の畳み込み・プーリングの結果と同じにします。

4回目の結果に対し、1回目逆畳み込み(3回目畳み込み・プーリングと同じ値にする)

その後、畳み込んだレイヤーとマージをして畳み込んでいきます。
以下、例です。

1回目逆畳み込み x 3回目畳み込み (マージ)
2回目逆畳み込み x 2回目畳み込み (マージ)
3回目逆畳み込み x 1回目畳み込み (マージ)

もちろんマージする際は、画像の縦横は一致している必要があります。

マージするとき、Input画像の画像ファイルのサイズによってエラーが起きてしまいました。
エラーの内容は下記です。(入力画像サイズを1500とした場合です)

"concat" mode can only merge layers with matching output shapes except for the concat axis. Layer shapes: [(None, 374, 374, 256), (None, 375, 375, 128)]

★問題ある例:画像サイズが1500の場合★
1回目畳み込み・プーリング:750
2回目畳み込み・プーリング:375
3回目畳み込み・プーリング:187.5 (187と解釈)

3回目の結果に対してアップサンプリング(2倍)
⇒374
上記の結果に対して、2回目畳み込み・プーリングとマージしようとすると
374と375のため、サイズが一致しないため、エラーになったと考えました。

それでは、374となってしまったほうに対して(1,1)のZero Paddingをすると、問題なく動作するのだろうかと思い、試してみたところ、以下の結果となりました。

"concat" mode can only merge layers with matching output shapes except for the concat axis. Layer shapes: [(None, 378, 378, 256), (None, 375, 375, 128)]

375を上回り、378となってしまいました。

このようなときはどのように対処すればいいのでしょうか?

★3回目畳み込み・プーリング:187.5 (187と解釈)★
の部分が悪さをしていると思うのですが。。。

以上、よろしくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

対処療法として、最初に入力データとしてサイズを揃えたのち、プーリング層に対してもpadding='same'することでしょうか。

投稿2017/12/08 15:31

編集2017/12/09 05:56
mkgrei

総合スコア8560

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

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

essa

2017/12/11 01:33

前回に引き続き、ご回答いただきありがとうございます。 入力データのサイズをそろえるというのは、どのようにそろえるのでしょうか? 2のべき乗にそろえるということでしょうか? もしそうでしたら、例えば縦横が2000ピクセルの画像に対して学習させようとすると、1024ピクセルに圧縮しないといけなくなるため、できたら元画像の大きさのまま動かしたいと思っております。 プーリング層すべてに対してpadding='same'をするのでしょうか? ちなみに、3つのプーリング層に対してpadding = 'same'をしたところ、 "concat" mode can only merge layers with matching output shapes except for the concat axis. Layer shapes: [(None, 376, 376, 256), (None, 375, 375, 128)] となりました。
essa

2017/12/11 02:34

こちらで以下のことをしてみたところ、解決しました。 ・一番最初に入力する際、ゼロパディングを行う。 今回の場合は2で割る処理を3回繰り返します。 例えば、1500の場合は1500÷2÷2÷2まで行います。 その結果、187.5となり、187として解釈されてエラーが起こってしまいました。 そのため、浮動小数点が入らないように入力時にゼロパディングを行いました。 具体的には、1504としました。 そうすることで、 1504÷2÷2÷2 = 188となり、エラーが起こらなくなりました。 mkgrei様のお話された、最初に入力データとしてサイズをそろえるというのは、上記のような解釈で正しかったでしょうか? よろしくお願い致します。
mkgrei

2017/12/11 04:50

仰る通りです。 基本的にpool_sizeを行った数分割り切る必要があります。 今pool_sizeが(2, 2)で、それを3回行っているので、基本的に2^3=8で割り切る必要があります。 実はMerge層などを使うと補ってやることができますが、反復回数が多いニューラルネットワーク内で補間するよりも、データを用意する時点で揃えたほうが得です。 pooling層でstrides=(1, 1)かつpadding='same'を指定すると入力の次元を保存することができます。 実用的にこの操作が悪さをするのかどうかは定かではありません。ダウンサンプリングはしなくなりますので。
essa

2017/12/11 07:37

とてもわかりやすい説明ありがとうございます。 画像処理を行うニューラルネットワークを構築する際には、画像の縦横を計算しながら 構築する必要があるのですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問