@beginner_programan

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

CNNの構造について質問です。

解決したいこと

下記のコードについて質問なのですが、なぜ★のついているコードを書く必要があるかわかりません。上のコードと同じなので別にいらないのでしょうか?また、下記のコードは何層になるのでしょうか?
プログラム初心者でネットで調べてもピンと来ませんでした。

model = Sequential()
model.add(Conv2D(32,(3,3), padding='same', input_shape=(INPUT_IMAGE_SIZE,INPUT_IMAGE_SIZE,3)))
model.add(Activation('relu'))
★model.add(Conv2D(32,(3,3),padding='same'))
model.add(Activation('relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(64,(3,3),padding='same'))
model.add(Activation('relu'))
★model.add(Conv2D(64,(3,3),padding='same'))
model.add(Activation('relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(CLASS_NUM, activation='softmax'))
0 likes

1Answer

model.summary()してみてください。これを使うとCNNのモデルの構造を可視化できます。

ライブラリをインポート

from tensorflow.keras.models import Sequential
from keras.layers import Activation,Dense, Dropout, Flatten, Conv2D, MaxPooling2D, Input

質問に上がっているコードでモデルを構築します。なおinput_shapeとCLASS_NUMは適当です。

model = Sequential()
model.add(Conv2D(32,(3,3), padding='same',input_shape=(28, 28, 1)))
model.add(Activation('relu'))
model.add(Conv2D(32,(3,3),padding='same'))
model.add(Activation('relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Conv2D(64,(3,3),padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64,(3,3),padding='same'))
model.add(Activation('relu'))
model.add(MaxPool2D(pool_size=(2,2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))

model.summary()を実行すると

model.summary()

下記が出力されます。これが今回のCNNの構造です。

Model: "sequential_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_11 (Conv2D)           (None, 28, 28, 32)        320       
_________________________________________________________________
activation_11 (Activation)   (None, 28, 28, 32)        0         
_________________________________________________________________
conv2d_12 (Conv2D)           (None, 28, 28, 32)        9248      
_________________________________________________________________
activation_12 (Activation)   (None, 28, 28, 32)        0         
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 14, 14, 32)        0         
_________________________________________________________________
dropout_5 (Dropout)          (None, 14, 14, 32)        0         
_________________________________________________________________
conv2d_13 (Conv2D)           (None, 14, 14, 64)        18496     
_________________________________________________________________
activation_13 (Activation)   (None, 14, 14, 64)        0         
_________________________________________________________________
conv2d_14 (Conv2D)           (None, 14, 14, 64)        36928     
_________________________________________________________________
activation_14 (Activation)   (None, 14, 14, 64)        0         
_________________________________________________________________
max_pooling2d_6 (MaxPooling2 (None, 7, 7, 64)          0         
_________________________________________________________________
dropout_6 (Dropout)          (None, 7, 7, 64)          0         
_________________________________________________________________
flatten_1 (Flatten)          (None, 3136)              0         
_________________________________________________________________
dense_2 (Dense)              (None, 512)               1606144   
_________________________________________________________________
activation_15 (Activation)   (None, 512)               0         
_________________________________________________________________
dropout_7 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_3 (Dense)              (None, 10)                5130      
=================================================================
Total params: 1,676,266
Trainable params: 1,676,266
Non-trainable params: 0

★の部分はCNNの畳み込み層と呼ばれるレイヤーです。上記の表のLayerのtypeがConv2Dになっている箇所が該当します。

CNNの構造を図で表すと以下になります。
エビフライトライアングル
この画像の引用元はこちらです

畳み込み層(★のついているコード)はCNNを構成するレイヤーの一つです。

1Like

Comments

  1. 回答ありがとうございます。
    畳み込み層は2,3つあってもいいと言うことですね。疑問が解けました。
    このモデルは17層から成り立っているということで理解はあってますか?
  2. ニューラルネットワークの層の数え方は明確に決まってないです。ただ基本的には活性化関数(Activation)やプーリング層(MaxPooling2D)、ドロップアウト層(Dropout)、Flatten層などはただ処理をするだけの層であり、学習してパラメータを自ら更新はしないため、層の数に含めない場合が多いと思います。model.summary()で出力した表のParam (パラメータ数)を見てみると、それらの層は全て0になっています。よって質問のCNNは畳み込み層が4層、全結合層が2層で合計6層のネットワークだと思います。

    参考リンク貼っておきます。
    https://teratail.com/questions/157636
    https://towardsdatascience.com/understanding-and-calculating-the-number-of-parameters-in-convolution-neural-networks-cnns-fc88790d530d
    https://qiita.com/Fumio-eisan/items/3038041c1ed076d643e7
  3. なるほど、ありがとうございます。
    勉強になりました。
    今後も何かあればご教授お願い致します。

Your answer might help someone💌