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

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

ただいまの
回答率

90.48%

  • Python

    12188questions

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

  • 深層学習

    228questions

  • Chainer

    209questions

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

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

解決済

回答 1

投稿 編集

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

pipeppy

score 1

 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の出力数というのは使うフィルタの種類の数ということですか?(エッジやぼかし等の)

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+2

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 での実装例

from keras.layers import (Activation, BatchNormalization, Conv2D, Dense,
                          Dropout, Flatten, MaxPooling2D)
from keras.models import Sequential


def AlexNet():
    model = Sequential()

    model.add(Conv2D(96, kernel_size=(11, 11), strides=(4, 4),
                     activation='relu', input_shape=(227, 227, 3)))
    model.add(BatchNormalization())
    model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))

    model.add(Conv2D(256, kernel_size=(5, 5),
                     padding='same', activation='relu'))
    model.add(BatchNormalization())
    model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))

    model.add(Conv2D(384, kernel_size=(3, 3),
                     padding='same', activation='relu'))
    model.add(Conv2D(384, kernel_size=(3, 3),
                     padding='same', activation='relu'))
    model.add(Conv2D(256, kernel_size=(3, 3),
                     padding='same', activation='relu'))
    model.add(MaxPooling2D(pool_size=(3, 3), strides=(2, 2)))

    model.add(Flatten())
    model.add(Dense(4096))
    model.add(Dropout(0.5))
    model.add(Dense(4096))
    model.add(Dropout(0.5))
    model.add(Activation('softmax'))

    return model


model = AlexNet()
model.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/28 03:17

    ありがとうございます!
    やはりサイトの誤植だったんですね。

    画像サイズの件もありがとうございます
    自分のデータセットに合わせて構築しようと思います

    追加で疑問点があって重ねて質問して申し訳ありませんが、畳み込み層を増やしてより複雑な特徴を取り出したくても元入力画像が小さすぎたら意味が無くなりますかね?
    アップスケーリングして画像を大きくして畳み込み層を増やす方が現実的なのですかね?

    キャンセル

  • 2019/01/28 03:24 編集

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

    キャンセル

  • 2019/01/28 03:32

    なるほど・・やはりそうなのですね。

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

    キャンセル

  • 2019/01/28 03:41

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

    キャンセル

  • 2019/01/28 04:17

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

    キャンセル

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

  • Python

    12188questions

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

  • 深層学習

    228questions

  • Chainer

    209questions

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