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

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

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

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

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

2回答

2181閲覧

ミニバッチ学習の実装がよくわかりません・・・。

pritu

総合スコア7

深層学習

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

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

Python 3.x

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2021/10/01 09:45

編集2021/10/01 14:45

勉強のために画像認識の実装をgoogle colaboratoryで行っています。
画像50枚とかだと学習を行ってくれるのですが、
画像が3000枚だとメモリ不足でクラッシュしてしまい学習できません。
(できれば、解像度やサイズを変更したくありません。)

そこで、ミニバッチ学習ならメモリ消費を少なくできるんじゃないかと思い実装しようとしています。

質問:
バッチサイズNのサブセットに分割して、modelクラスのfitで一つずつモデルを作成したらどうやって一つにまとめてモデルを保存するのでしょうか?

なにかライブラリがあるのでしょうか?

(ミニバッチ学習はバッチごとの損失、勾配を求めてその平均で重みを更新するという認識ででいます。)

お手数をおかけしますが、よろしくお願い致します。

以下コードになります。

Python

1import keras 2from keras.utils import np_utils 3from keras.models import Sequential 4from keras.layers.convolutional import Conv2D, MaxPooling2D 5from keras.layers.core import Dense, Dropout, Activation, Flatten 6import numpy as np 7from sklearn.model_selection import train_test_split 8from PIL import Image 9import glob 10import matplotlib.pyplot as plt 11 12#画像が入った入力データ 13X = X.astype('float32') 14X = X / 255.0 15 16#正解ラベルの形式を変換 17Y = np_utils.to_categorical(Y, 4) 18 19#学習用データとテストデータ 20X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2,train_size=0.8)

モデルの構築

Python

1model = Sequential() 2 3model.add(Conv2D(32, (3, 3), padding='same',input_shape=X_train.shape[1:])) 4model.add(Activation('relu')) 5model.add(Conv2D(32, (3, 3))) 6model.add(Activation('relu')) 7model.add(MaxPooling2D(pool_size=(2, 2))) 8model.add(Dropout(0.25)) 9 10model.add(Conv2D(64, (3, 3), padding='same')) 11model.add(Activation('relu')) 12model.add(Conv2D(64, (3, 3))) 13model.add(Activation('relu')) 14model.add(MaxPooling2D(pool_size=(2, 2))) 15model.add(Dropout(0.25)) 16 17model.add(Flatten()) 18model.add(Dense(512)) 19model.add(Activation('relu')) 20model.add(Dropout(0.5)) 21model.add(Dense(4)) 22model.add(Activation('softmax')) 23 24# コンパイル 25model.compile(loss='categorical_crossentropy',optimizer='SGD',metrics=['accuracy']) 26 27#訓練 28history = model.fit(X_train, Y_train, epochs=100)

これだとメモリ不足に陥るため、ミニバッチ学習で小分けに学習していきたいです。
(ちなみに画像サイズは700×500です。)

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

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

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

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

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

toast-uz

2021/10/01 13:24

現在、クラッシュしてしまうコードを示してください。最近のフレームワークを普通に使うとミニバッチ学習ができてしまいます(意識して変更しないとミニバッチ学習しない状態にならない)ので、質問者様が考えている原因や対策が違う可能性があります。
pritu

2021/10/01 14:46

コードを載せてみました! おそらくですが、画像サイズがでかいためにメモリが不足するのかと思っています・・・。
toast-uz

2021/10/01 23:29 編集

kerasのmodel.fitでのbatch_sizeはデフォルトで32になりますので、ミニバッチ学習はできています。700✕500✕32ch✕バッチサイズ32✕float(4バイト) = 1,433,600,000 = 1.4GBなので、ここが原因ではないように思います。以下2つを教えて下さい。 ・X.shape (ミニバッチ以前に、そもそもデータ全体がメモリに乗っているのかの確認 → この対策は有名ですが、質問者様が「ミニバッチ」というこの対策と異なる用語を使ったため、ミスリードしている可能性あり) ・具体的にメモリエラーが出た前後のエラーメッセージ、学習の進行状況がわかるメッセージ → 学習途上でメモリエラーになっているのであれば、何らかの理由で過去のミニバッチの使用メモリが開放されていない可能性あり。あるいはXで利用しているメモリが大きすぎて、残りメモリが少ない可能性あり。
toast-uz

2021/10/02 01:12

ppaul様の回答が正しいと思いますので、上記は無視してください。
pritu

2021/10/02 03:26

toast-uzさん、 ご回答ありがとうございます! ミニバッチ学習に関して勘違いしていました・・・
guest

回答2

0

ベストアンサー

NNの学習で必要なGPUメモリを算出するを参考にして画像サイズ700×500、batchサイズ32で計算してみました。

パラメータを見ることができないので、正確ではありませんが、モデルの部分の必要メモリは約56Gバイトになります。これとは別に画像全てを保管するメモリも必要です。画像が0枚でもクラッシュすることになりますね。

batchサイズを8に変更しても約14Gバイトなのでgoogle colaboratoryの上限12Gバイトでは不足です。

また、画像サイズを大きくした場合、層数を増やさないと精度はあまり上がりませんし、層数を増やすと必要メモリも計算時間も大幅に増えます。

700*500の画像認識をしたければ、現在のスーパーコンピュータでは無理である可能性が高いと思います。

投稿2021/10/02 00:11

ppaul

総合スコア24670

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

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

toast-uz

2021/10/02 01:10

model.summary()してみたら3チャネルカラー画像という前提で Total params: 697,338,404 ニューロン数: 76,389,508 でした。
pritu

2021/10/02 03:24

ppaulさん、 わかりやすい説明ありがとうございます。 画像サイズを小さくして層数を考えながら、精度がでるか自分なりに考えてみようと思います!
guest

0

ニューラルネットワークで認識できる画像サイズ(入力値)は、普通大きくても256x256や128x128、小さければ32x32くらいです。百度中国のどこかの企業が昔やっていましたが512x512もできなくはないですが、負荷が巨大になる割に、対して認識性能が上がらない(コスト対効果が見合わない)、という結論(先の百度の論文ではない別のところです)があったと思います。

さらに、掲載のコードはリファレンスのコードとよく似ていますので、元画像をimg=cv2.resize(img,(100,100))くらいに縮めればそこそこ認識できるものと思います。もし認識率が悪ければ既存のネットワーク構造と重みを流用してください。

これでだめならバッチサイズを今の1/2に減らすことを繰り返していけば普通は走るはずです。

投稿2021/10/01 22:59

編集2021/10/02 00:23
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

pritu

2021/10/02 03:28

fourteenlengthさん、 ご回答ありがとうございます! 画像サイズを大きくすれば精度があがると正直思っていました。。 勉強になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問