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

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

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

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

Python

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

Q&A

解決済

1回答

2607閲覧

CNN学習時のAllocation of exceeds 10% of system memory エラーについて

Kohei_KESE

総合スコア41

Keras

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

Python

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

0グッド

1クリップ

投稿2018/11/08 07:07

現在、10241372の画像(グレースケール)150枚に対し、Lenetの最終層のみを変更した回帰学習を試みています。
学習を実行したとき、表題のエラーが表示されるのですが原因がわからなかったので理由を教えて頂きたいです。
バッチサイズは16に設定しているので、メモリに格納される容量は概算で
1024
1372/8/10^6*16=0.0028GB
となると思うのですが、GPUは12GBのものを使用しているためなぜメモリをオーバーするのかがわかりませんでした。
学習モデルのTotal paramsは2,195,226,571です。

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

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

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

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

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

guest

回答1

0

ベストアンサー

パラメータ数が 2195226571 なら、単精度なので重み 2195226571*4 byte = 8.78G になります。それに加えてバッチサイズ16なら収まらないでしょうね。

LeNet でなんでそんなにパラメータが多いのでしょうか?
出力層の出力数以外に入力層の形状や中間層の次元数も変えていませんか?

投稿2018/11/08 09:13

tiitoi

総合スコア21956

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

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

Kohei_KESE

2018/11/08 10:08

申し訳ございません。モデルはBatchNormalizationを追加していたり少しいじってあります。 それにしても、8.76GBが最初に確保されるとしてもバッチ16分の0.0028GBは十分に小さいので問題ないように思えるのですが・・・
tiitoi

2018/11/08 10:28 編集

> 1024*1372/8/10^6*16=0.0028GB この計算式の意味を教えてください。 16はバッチサイズとして、それ以外の数字がどこから出てきたのかよくわからないです。 各レイヤーごとに出力値を保存する必要があるので、こんな小さい値にはならないはずです。 ちなみに入力層の形状を (1024*1372) 変えたり、全結合層の次元をいじったりしてます?元のコードを貼れますか?
Kohei_KESE

2018/11/12 02:47

1024*1372 : bit数 /8 : bit→bite変換 10^6 : GB表記 16 : バッチ数 です。 >各レイヤーごとに出力値を保存する必要があるので、こんな小さい値にはならないはずです。 これは出力値は最初に確保した8.76GBに含まれないという理解でよろしいでしょうか? モデルは下記の通りです。 model = Sequential() model.add(Conv2D(20, kernel_size=5, padding="same", input_shape=(28,28,1))) model.add(Activation("relu")) model.add(MaxPooling2D()) model.add(Conv2D(50, kernel_size=5, border_mode="same")) model.add(Activation("relu")) model.add(MaxPooling2D()) model.add(Flatten()) model.add(Dense(500)) model.add(Activation("relu")) model.add(Dense(1)) model.compile( optimizer="adam", loss = "mean_squared_error", metrics = ["accuracy"])
tiitoi

2018/11/12 03:18 編集

上記のモデルではパラメータ数は 1,251,571 でしたよ。 変更したのはBatch Normalizationを追加や出力層の形状だけとのことですが、入力層の形状を input_shape=(1024, 1372, 1) のように変えませんでしたか?そのようにしたら、2,195,226,571 という値が出てきました。
tiitoi

2018/11/12 03:22 編集

もしそうだとしたら、それがメモリ不足の原因です。 実際計算量や使用メモリ量が膨大になるので、入力層のサイズがこんなに大きい CNN が使われることはまずないです。 基本的には (256, 256) あたりが最も多く使われます。大きくても (512, 512) です。 なので、画像は入力層にそのままのサイズで与えるのではなく、リサイズしてください。そうすればメモリ不足にはならないはずです。
Kohei_KESE

2018/11/12 04:15

回答ありがとうございます。おっしゃる通りinput_shapeを(1024,1372,1)に変更していました。 今試しに、inputを256*256でVGG16を回してみたところ、重たいものの動作が確認できたので、計算の化可否はtotal_paramsの数の制御が重要だと言えそうですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問