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

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

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

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

深層学習

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

Python

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

Q&A

解決済

1回答

2124閲覧

CNNのモデル構築についてです

pipeppy

総合スコア13

Chainer

Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

深層学習

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

Python

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

0グッド

0クリップ

投稿2019/01/27 16:50

編集2019/01/27 17:02

### CNNのモデル構築について質問です
CNNについて独学で勉強をしています。
自分で何かを検出するプログラムを組みたくてAlexNetというモデルを参考にして実際に自分でモデル構築しようとしているのですが、AlexNetでわからないことがあったので質問させてもらいます。
http://tecmemo.wpblog.jp/2017/03/19/dl_alexnet/
上記のサイトを元に勉強しているのですが、まず疑問になったのが
pool2のプーリング層でフィルタサイズ(3,3)ストライド(2,2)で(13,13,256)と出力されるのはなぜでしょうか?
(6,6,256)ではないでしょうか?という疑問がまず一つと

少し基本の勉強の理解が追いついていないのでここからは基本の質問もあります、すいません。
入力する画像のサイズが小さい時(仮に32*32)、畳み込み層やプーリング層を何層も作ろうと思ってもすぐに出力されるサイズが小さくなって意味が無くなりますよね?
その場合の対処方法などはあるのでしょうか?

上記URLの出力数というのは使うフィルタの種類の数ということですか?(エッジやぼかし等の)

全結合層のノード数の設定はどのようにして行うのでしょうか?
多かったらどうなる少なかったらどうなるのか調べてもピンとこなかったのですいません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

pool2のプーリング層でフィルタサイズ(3,3)ストライド(2,2)で(13,13,256)と出力されるのはなぜでしょうか?

その前の conv2 の行が誤植でその後の3行の整合性が取れなくなっているのだと思います。
conv2 のところは、padding=(2, 2) でその出力結果は (27, 27, 256) となって、その次の正規化層は形状変更しないので、同じく (27, 27, 256) です。
これをプーリングして (13, 13, 256) になります。
なので、その前の conv2、norm2 のところの出力サイズが間違っています。

Keras での実装例

python

1from keras.layers import (Activation, BatchNormalization, Conv2D, Dense, 2 Dropout, Flatten, MaxPooling2D) 3from keras.models import Sequential 4 5 6def AlexNet(): 7 model = Sequential() 8 9 model.add(Conv2D(96, kernel_size=(11, 11), strides=(4, 4), 10 activation='relu', input_shape=(227, 227, 3))) 11 model.add(BatchNormalization()) 12 model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) 13 14 model.add(Conv2D(256, kernel_size=(5, 5), 15 padding='same', activation='relu')) 16 model.add(BatchNormalization()) 17 model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) 18 19 model.add(Conv2D(384, kernel_size=(3, 3), 20 padding='same', activation='relu')) 21 model.add(Conv2D(384, kernel_size=(3, 3), 22 padding='same', activation='relu')) 23 model.add(Conv2D(256, kernel_size=(3, 3), 24 padding='same', activation='relu')) 25 model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2))) 26 27 model.add(Flatten()) 28 model.add(Dense(4096)) 29 model.add(Dropout(0.5)) 30 model.add(Dense(4096)) 31 model.add(Dropout(0.5)) 32 model.add(Activation('softmax')) 33 34 return model 35 36 37model = AlexNet() 38model.summary()
_________________________________________________________________ Layer (type) Output Shape Param # ================================================================= conv2d_1 (Conv2D) (None, 55, 55, 96) 34944 _________________________________________________________________ batch_normalization_1 (Batch (None, 55, 55, 96) 384 _________________________________________________________________ max_pooling2d_1 (MaxPooling2 (None, 27, 27, 96) 0 _________________________________________________________________ conv2d_2 (Conv2D) (None, 27, 27, 256) 614656 _________________________________________________________________ batch_normalization_2 (Batch (None, 27, 27, 256) 1024 _________________________________________________________________ max_pooling2d_2 (MaxPooling2 (None, 13, 13, 256) 0 _________________________________________________________________ conv2d_3 (Conv2D) (None, 13, 13, 384) 885120 _________________________________________________________________ conv2d_4 (Conv2D) (None, 13, 13, 384) 1327488 _________________________________________________________________ conv2d_5 (Conv2D) (None, 13, 13, 256) 884992 _________________________________________________________________ max_pooling2d_3 (MaxPooling2 (None, 6, 6, 256) 0 _________________________________________________________________ flatten_1 (Flatten) (None, 9216) 0 _________________________________________________________________ dense_1 (Dense) (None, 4096) 37752832 _________________________________________________________________ dropout_1 (Dropout) (None, 4096) 0 _________________________________________________________________ dense_2 (Dense) (None, 4096) 16781312 _________________________________________________________________ dropout_2 (Dropout) (None, 4096) 0 _________________________________________________________________ activation_1 (Activation) (None, 4096) 0 ================================================================= Total params: 58,282,752 Trainable params: 58,282,048 Non-trainable params: 704 _________________________________________________________________

入力する画像のサイズが小さい時(仮に32*32)、畳み込み層やプーリング層を何層も作ろうと思ってもすぐに出力されるサイズが小さくなって意味が無くなりますよね?

その場合の対処方法などはあるのでしょうか?

モデルによって (227, 227, 3) のように入力サイズは決まっているので、画像はモデルに入れる前にその大きさ (227, 227) にリサイズします。
もしデータセットの画像が (28, 28) のように小さいのであれば、リサイズするか、そのサイズを入力としたモデルを用意します。

上記URLの出力数というのは使うフィルタの種類の数ということですか?(エッジやぼかし等の)

出力数 = フィルタ数です。どちらの呼び方もされます。

全結合層のノード数の設定はどのようにして行うのでしょうか?
多かったらどうなる少なかったらどうなるのか調べてもピンとこなかったのですいません。

データセットの複雑さに合わせて変えるのがよいのではないでしょうか。
パラメータがデータセットの複雑さに対して、少なすぎると過小適合、多すぎると過学習します。
ハイパーパラメータと考えて良いです。
適当にいじって精度がよい値を採用してみてはどうでしょうか。

投稿2019/01/27 17:51

tiitoi

総合スコア21956

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

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

pipeppy

2019/01/27 18:17

ありがとうございます! やはりサイトの誤植だったんですね。 画像サイズの件もありがとうございます 自分のデータセットに合わせて構築しようと思います 追加で疑問点があって重ねて質問して申し訳ありませんが、畳み込み層を増やしてより複雑な特徴を取り出したくても元入力画像が小さすぎたら意味が無くなりますかね? アップスケーリングして画像を大きくして畳み込み層を増やす方が現実的なのですかね?
tiitoi

2019/01/27 18:26 編集

基本的に畳み込み層は padding='same' にしとけば出力サイズは変わらず、出力サイズが小さくなるのはプーリングした場合だけなので、理論上は畳み込み層をたくさん重ねることができます。 画像が小さいということはそれだけ画像から得られる情報が少ないということなので、拡大したからたくさん特徴が得られるかというとそこは微妙だと思います。
pipeppy

2019/01/27 18:32

なるほど・・やはりそうなのですね。 検出対象が小さい場合はどのようにするのが一般的なのでしょうか? 重ね重ねすいません。どんどん疑問が膨らんできてしまって・・。
tiitoi

2019/01/27 18:41

どのようなタスク (画像分類、物体検出) を解くのか、画像サイズがどのくらいなのかにもよるので、それらの情報によってどうするか変わります。
pipeppy

2019/01/27 19:17

まだそこまで自分のやりたいことが固まってなかったのでやりたいことが固まってから調べてみます! ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問