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

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

ただいまの
回答率

91.36%

  • TensorFlow

    277questions

  • Keras

    32questions

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

解決済

回答 1

投稿 2017/12/08 21:05

  • 評価
  • クリップ 0
  • VIEW 48

essa

score 2

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と解釈)★
の部分が悪さをしていると思うのですが。。。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

投稿 2017/12/09 00:31

編集 2017/12/09 14:56

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/11 10: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)]
    となりました。

    キャンセル

  • 2017/12/11 11:34

    こちらで以下のことをしてみたところ、解決しました。

    ・一番最初に入力する際、ゼロパディングを行う。

    今回の場合は2で割る処理を3回繰り返します。
    例えば、1500の場合は1500÷2÷2÷2まで行います。
    その結果、187.5となり、187として解釈されてエラーが起こってしまいました。
    そのため、浮動小数点が入らないように入力時にゼロパディングを行いました。

    具体的には、1504としました。
    そうすることで、
    1504÷2÷2÷2 = 188となり、エラーが起こらなくなりました。

    mkgrei様のお話された、最初に入力データとしてサイズをそろえるというのは、上記のような解釈で正しかったでしょうか?

    よろしくお願い致します。

    キャンセル

  • 2017/12/11 13:50

    仰る通りです。

    基本的にpool_sizeを行った数分割り切る必要があります。
    今pool_sizeが(2, 2)で、それを3回行っているので、基本的に2^3=8で割り切る必要があります。
    実はMerge層などを使うと補ってやることができますが、反復回数が多いニューラルネットワーク内で補間するよりも、データを用意する時点で揃えたほうが得です。

    pooling層でstrides=(1, 1)かつpadding='same'を指定すると入力の次元を保存することができます。
    実用的にこの操作が悪さをするのかどうかは定かではありません。ダウンサンプリングはしなくなりますので。

    キャンセル

  • 2017/12/11 16:37

    とてもわかりやすい説明ありがとうございます。

    画像処理を行うニューラルネットワークを構築する際には、画像の縦横を計算しながら
    構築する必要があるのですね。

    ありがとうございました。

    キャンセル

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

ただいまの回答率

91.36%

関連した質問

同じタグがついた質問を見る

  • TensorFlow

    277questions

  • Keras

    32questions