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

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

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

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

深層学習

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

1回答

2990閲覧

tensorflow.keras Conv2Dのpaddingの仕様が分からない

ryou_T

総合スコア14

Keras

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

深層学習

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2021/11/03 09:39

編集2021/11/03 11:19

前提・実現したいこと

現在、「PythonとKerasによるディープラーニング」という本で勉強をしています。
p258にあったコードでpaddingのパラメータが正しく動いていないのではと思うところがあります。
layers.add()の所できちんと出力のサイズが揃う理由についてご教授いただきたいです。

発生している問題・エラーメッセージ

エラーは起きていないのですが、residual = layers.Conv2D()の所で padding='same'としてもpadding='valid'としてもyの出力とサイズがあってしまいます。 padding='same'は入力のサイズと同じになるようにパディングを行うはずですので、 conv2d_2 (Conv2D) のOutput Shapeは(None, 374, 500, 128)となり、add層の所でサイズの違いによるエラーが出ると思うのです。

該当のソースコード

python

1from tensorflow.keras import Input, layers 2from tensorflow.keras.models import Model 3 4x = Input(shape=(374, 500, 3)) 5y = layers.Conv2D(128, 3, activation='relu', padding='same')(x) 6y = layers.Conv2D(128, 3, activation='relu', padding='same')(y) 7y = layers.MaxPooling2D(2, strides=2)(y) 8residual = layers.Conv2D(128, 1, strides=2, padding='same')(x) 9output = layers.add([y, residual]) 10 11model = Model(x, output) 12model.summary()

出力結果

Model: "functional_1" __________________________________________________________________________________________________ Layer (type) Output Shape Param # Connected to ================================================================================================== input_1 (InputLayer) [(None, 374, 500, 3) 0 __________________________________________________________________________________________________ conv2d (Conv2D) (None, 374, 500, 128 3584 input_1[0][0] __________________________________________________________________________________________________ conv2d_1 (Conv2D) (None, 374, 500, 128 147584 conv2d[0][0] __________________________________________________________________________________________________ max_pooling2d (MaxPooling2D) (None, 187, 250, 128 0 conv2d_1[0][0] __________________________________________________________________________________________________ conv2d_2 (Conv2D) (None, 187, 250, 128 512 input_1[0][0] __________________________________________________________________________________________________ add (Add) (None, 187, 250, 128 0 max_pooling2d[0][0] conv2d_2[0][0] ================================================================================================== Total params: 151,680 Trainable params: 151,680 Non-trainable params: 0 __________________________________________________________________________________________________

試したこと

・Inputのサイズを(None, 375, 500, 3)にして出力のサイズが違う者同士だとadd層で結合ができないことを確認
・Conv2Dの公式ドキュメントを確認
・addの公式ドキュメントを確認
・padding add などのキーワードを含めて検索をしたものの、該当するような記事を見つけられませんでした。

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

windows10 conda仮想環境
すべてconda installにて環境構築
python 3.8.11
tensorflow 2.3.0
tensorflow-base 2.3.0
tensorflow-estimator 2.6.0
tensorflow-gpu 2.3.0
numpy 1.19.4
jupyter 1.0.0
jupyter_client 7.0.1
jupyter_console 7.0.1
jupyter_core 4.8.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

padding='same'としてもpadding='valid'としてもyの出力とサイズがあってしまいます。

tf.nn.convolution
の下の方にある
If padding == "SAME":...

If padding == "VALID":...
を見比べたら分かりますように、畳み込みフィルタのサイズ(spatial_filter_shape[i])が1の場合は、
If padding == "VALID":...
の計算式の「- (spatial_filter_shape[i]-1) * dilation_rate[i]」の部分が「0」になり実質無くなるので、
If padding == "SAME":...
と同じ計算結果になります

padding='same'は入力のサイズと同じになるようにパディングを行うはずですので、

conv2d_2 (Conv2D) のOutput Shapeは(None, 374, 500, 128)となり

「strides=2」で割られるので、そうはなりません

投稿2021/11/04 12:59

jbpb0

総合スコア7653

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

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

ryou_T

2021/11/04 15:37 編集

keras、tensorflowでのconv2dについての記述は調べていましたが、convolutionの方は全く見ておりませんでした。詳しい解説をしていただき、理解することができました。ご教授いただきありがとうございました。
ryou_T

2021/11/04 15:52

すみません、私の勉強不足によるおかしな疑問かもしれませんが、私の使った関数はtf.keras.layers.Conv2Dですので、jbpb0様に提示していただいたtf.nn.convolutionとは実装が違うのではないかと思ってしまいました。ただ、tf.nn.convolutionの実装で考えた場合に辻褄は合うことも理解しております。tf.keras.layers.Conv2Dの内部ではtf.nn.convolutionが使われているという事なのでしょうか。 繰り返しの質問になってしまい申し訳ありません。
ryou_T

2021/11/05 03:46

自己解決いたしましたと書いてしまったのですが、def convolution_opconvolution_op(self, inputs, kernel)と書いてあったので、tf.keras.layers.Conv2Dの実装ではありませんでした。
ryou_T

2021/11/06 07:45

返信が遅くなりまして申し訳ありません。参考のurlを拝見させていただきました。内部ではtf.nn.convolutionが使われているのですね。ご教示いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問