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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

1512閲覧

kerasで2入力1出力のCNN設計をしたい

bas

総合スコア9

Keras

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2020/11/17 04:07

編集2020/11/17 04:58

実現したいこと

2枚の画像を入力して1つの出力を得る(分類される)CNNの設計を行っています。

具体的には,VGG16の特徴抽出層(重みは初期化しないでImagenetで学習済みのものを使用)を用いて2枚の画像から特徴を抽出し,それを全結合層で推論するネットワークです。

しかし,以下のエラーが発生しました。

エラーメッセージ

--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-62-d0881f532e33> in <module>() ----> 1 NN3_conv = Flatten()(merged) 2 NN3_conv = Dense(8192)(NN3_conv) 3 NN3_conv = BatchNormalization()(NN3_conv) 4 NN3_conv = Dense(8192)(NN3_conv) 5 NN3_conv = BatchNormalization()(NN3_conv) ~\Anaconda3\lib\site-packages\keras\engine\base_layer.py in __call__(self, inputs, **kwargs) 504 if all([s is not None 505 for s in to_list(input_shape)]): --> 506 output_shape = self.compute_output_shape(input_shape) 507 else: 508 if isinstance(input_shape, list): ~\Anaconda3\lib\site-packages\keras\layers\core.py in compute_output_shape(self, input_shape) 499 raise ValueError('The shape of the input to "Flatten" ' 500 'is not fully defined ' --> 501 '(got ' + str(input_shape[1:]) + '). ' 502 'Make sure to pass a complete "input_shape" ' 503 'or "batch_input_shape" argument to the first ' ValueError: The shape of the input to "Flatten" is not fully defined (got (None, None, 1024)). Make sure to pass a complete "input_shape" or "batch_input_shape" argument to the first layer in your model.

ソースコード

from keras.models import Model, Sequential from keras.layers import Input, Dense, Dropout, Activation, Flatten from keras.layers import add, concatenate from keras.utils import plot_model from keras.applications.vgg16 import VGG16 import keras NN1=keras.applications.vgg16.VGG16(include_top=False, weights='imagenet', input_tensor=None, input_shape=None, pooling=None) NN2=keras.applications.vgg16.VGG16(include_top=False, weights='imagenet', input_tensor=None, input_shape=None, pooling=None) merged = concatenate([NN1.output, NN2.output]) NN3_conv = Flatten()(merged) NN3_conv = Dense(8192)(NN3_conv) NN3_conv = BatchNormalization()(NN3_conv) NN3_conv = Dense(8192)(NN3_conv) NN3_conv = BatchNormalization()(NN3_conv) NN3_conv = Dense(CLASS_NUM, activation="softmax")(NN3_conv) model = Model([NN1.input, NN2.input], NN3_conv)

何が原因なのかよく分かりません。
どなたかご教授よろしくお願いします。

環境・バージョン

OS
windows10

バージョン
python3.6.4
keras2.3.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

Imagenetの基本サイズを指定したところ正常にFlattenできました。 注意点は、同じVGG16のモデルを2回利用するため、普通に並べてしまうとkerasの内部でlayerの名前がバッティングします。ということで、名前だけ途中で書き換えています。

python

1from keras.models import Model, Sequential 2from keras.layers import Input, Dense, Dropout, Activation, Flatten 3from keras.layers import add, concatenate, BatchNormalization 4from keras.utils import plot_model 5from keras.applications.vgg16 import VGG16 6import keras 7 8NN1=keras.applications.vgg16.VGG16(include_top=False, weights='imagenet', input_tensor=None, input_shape=(224,224,3), pooling=None) 9NN2=keras.applications.vgg16.VGG16(include_top=False, weights='imagenet', input_tensor=None, input_shape=(224,224,3), pooling=None) 10for layer in NN1.layers: 11 layer.name = layer.name + str("NN1") 12for layer in NN2.layers: 13 layer.name = layer.name + str("NN2") 14 15merged = concatenate([NN1.output, NN2.output]) 16 17NN3_conv1 = Flatten()(merged) 18NN3_conv2 = Dense(8192)(NN3_conv1) 19NN3_conv3 = BatchNormalization()(NN3_conv2) 20NN3_conv4 = Dense(8192)(NN3_conv3) 21NN3_conv5 = BatchNormalization()(NN3_conv4) 22NN3_conv6 = Dense(1000, activation="softmax")(NN3_conv5) 23 24model = Model([NN1.input, NN2.input], NN3_conv6) 25model.summary()

console

1__________________________________________________________________________________________________ 2Layer (type) Output Shape Param # Connected to 3================================================================================================== 4input_1NN1 (InputLayer) (None, 224, 224, 3) 0 5__________________________________________________________________________________________________ 6input_2NN2 (InputLayer) (None, 224, 224, 3) 0 7__________________________________________________________________________________________________ 8block1_conv1NN1 (Conv2D) (None, 224, 224, 64) 1792 input_1NN1[0][0] 9__________________________________________________________________________________________________ 10block1_conv1NN2 (Conv2D) (None, 224, 224, 64) 1792 input_2NN2[0][0] 11__________________________________________________________________________________________________ 12 13・・中略・・ 14 15block1_conv2NN1 (Conv2D) (None, 224, 224, 64) 36928 block1_conv1NN1[0][0] 16__________________________________________________________________________________________________ 17block1_conv2NN2 (Conv2D) (None, 224, 224, 64) 36928 block1_conv1NN2[0][0] 18__________________________________________________________________________________________________ 19block1_poolNN1 (MaxPooling2D) (None, 112, 112, 64) 0 block1_conv2NN1[0][0] 20__________________________________________________________________________________________________ 21block1_poolNN2 (MaxPooling2D) (None, 112, 112, 64) 0 block1_conv2NN2[0][0] 22__________________________________________________________________________________________________ 23block2_conv1NN1 (Conv2D) (None, 112, 112, 128 73856 block1_poolNN1[0][0] 24__________________________________________________________________________________________________ 25block2_conv1NN2 (Conv2D) (None, 112, 112, 128 73856 block1_poolNN2[0][0] 26__________________________________________________________________________________________________ 27block2_conv2NN1 (Conv2D) (None, 112, 112, 128 147584 block2_conv1NN1[0][0] 28 29flatten_1 (Flatten) (None, 50176) 0 concatenate_1[0][0] 30__________________________________________________________________________________________________ 31dense_1 (Dense) (None, 8192) 411049984 flatten_1[0][0] 32__________________________________________________________________________________________________ 33batch_normalization_1 (BatchNor (None, 8192) 32768 dense_1[0][0] 34__________________________________________________________________________________________________ 35dense_2 (Dense) (None, 8192) 67117056 batch_normalization_1[0][0] 36__________________________________________________________________________________________________ 37batch_normalization_2 (BatchNor (None, 8192) 32768 dense_2[0][0] 38__________________________________________________________________________________________________ 39dense_3 (Dense) (None, 1000) 8193000 batch_normalization_2[0][0] 40================================================================================================== 41Total params: 515,854,952 42Trainable params: 515,822,184 43Non-trainable params: 32,768 44__________________________________________________________________________________________________ 45

投稿2020/11/22 05:44

PINTO

総合スコア351

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

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

bas

2020/11/26 07:03

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問