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

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

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

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

深層学習

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

機械学習

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

Python

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

Q&A

解決済

1回答

7616閲覧

keras fit_generatorのパラメータについて

---stax---

総合スコア148

Keras

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

深層学習

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

機械学習

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

Python

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

0グッド

0クリップ

投稿2019/03/20 06:07

表題の件について質問させてください
現在画像の2値分類について学習しています
使用しているフレームワークはkerasです

データ全体は200枚(正常:100枚 異常:100枚)
訓練データは120枚(正常:60枚 異常:60枚)
検証データは40枚(正常:20枚 異常:20枚)
テストデータは40枚(正常:20枚 異常:20枚)
というふうにフォルダにあらかじめ配置してflow_from_directoryを
使ってデータを作成しています

モデルを学習させるためにfit_generatorを使用するのですが
その際に指定するパラメータは以下のように指定しています

python

1history = model.fit_generator(train_generator, 2 steps_per_epoch = 8, 3 epochs = 30, 4 validation_data = validation_generator, 5 validation_steps = 5, 6 callbacks=[check_point, lr_decay])

このパラメータについてドキュメントを読んでもいまいち理解できなかったので内容について教えて頂きたいのですが

①steps_per_epoch は訓練データセットを1バッチいくつにするかという認識であっていますでしょうか?(上の例では1バッチ15サンプルを8つ)

②validation_steps はモデル検証時に使われるサンプル数をいくつにするかという意味でしょうか?これが一番よく分かりません・・・(上の例でいうとモデルの検証に8サンプルを使う?)
検証データのバッチ数は訓練データのバッチ数に合わせた方が良いですか?

③steps_per_epoch (1バッチのサンプル数)を決める基準は何かありますか?
大きすぎると局所的最適解にとらわれやすいと記事などで見たことがあるのである程度小さくしたのですが決める目安などがあれば教えて頂きたいです

初歩的な質問で申し訳ありません
アドバイス頂けたら幸いです

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

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

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

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

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

guest

回答1

0

ベストアンサー

①steps_per_epoch は訓練データセットを1バッチいくつにするかという認識であっていますでしょうか?(上の例では1バッチ15サンプルを8つ)

steps_per_epoch は1エポックあたりのステップ数です。
ジェネレーターは無限に画像を生成するので、1エポックは何反復かというのを教えてあげる必要があります。
この値は 学習データのサンプル数 // バッチサイズ で計算できます。例えば、学習データ100サンプルでバッチサイズ10なら 100 / 10 = 10 が steps_per_epoch の値になります。

②validation_steps はモデル検証時に使われるサンプル数をいくつにするかという意味でしょうか?これが一番よく分かりません・・・(上の例でいうとモデルの検証に8サンプルを使う?)

上記と同様です。
バリエーションデータのサンプル数 / バッチサイズ

検証データのバッチ数は訓練データのバッチ数に合わせた方が良いですか?

バッチサイズが影響するのは、勾配計算なので学習を行わないバリエーション時は、勾配計算はしないのでどのような値にしても構いません。
GPU を使用している場合、一度に大量に計算したほうが計算量は同じでも早くなるので、メモリの乗る範囲で大きめのバッチサイズにするといいでしょう。

③steps_per_epoch (1バッチのサンプル数)を決める基準は何かありますか?

大きすぎると局所的最適解にとらわれやすいと記事などで見たことがあるのである程度小さくしたのですが決める目安などがあれば教えて頂きたいです

steps_per_epoch は上述の通り、バッチサイズを意味しているわけではありません。
バッチサイズは大きくするほど、その点での本来の勾配に近づくので、大きくしすぎると局所解にハマりやすくなります。
逆に小さくすると、局所解にハマる可能性が減りますが、GPU での計算効率が落ちます。(一度に大量の計算を行ったほうが効率がいいため)

最急降下法や確率的勾配法の仕組みについては理解されていますでしょうか?

追記

Keras のライブラリの使い方は公式ドキュメントで理解が難しいようであれば、以下の本がおすすめです。

PythonとKerasによるディープラーニング | Francois Chollet, 巣籠 悠輔, 株式会社クイープ |本 | 通販 | Amazon

追記

私が微分の理解が出来ていないので色々あやふやになっているのが改めて実感します

参考書も進めて頂いてありがとうございます。早速購入しました。

勾配降下法の部分も概要が書かれていたのでそちらも進めてみます。

数学的に厳密な定義は置いておいてイメージを書きますが、
Deep Learning の学習は「損失関数の値が小さくなる点を探す」という作業になります。
どう探すのかというと、ある点に今いるとき、勾配が急な方向に進みます。
ちょっと進んだら、またその点でまた勾配が急な方向に進みます。
これを繰り返していくと、関数の値が小さい点を見つけることができます。

ただ最も勾配が急な方向に進んでいくと、以下の例のように、右にもっと深い穴があるのに、それより浅い穴にハマって抜け出せなくなってしまいます。

それを回避するために、最も勾配に急な方向ではなく、だいたい下っていけるような方向に進んでいくことで浅い穴にハマってしまいづらくするのが確率的勾配法です。

投稿2019/03/20 06:31

編集2019/03/25 11:53
tiitoi

総合スコア21956

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

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

---stax---

2019/03/25 01:09

回答ありがとうございます。 返答遅くなり大変申し訳ありません。 ①②に関しては頂いた回答と合わせてもう一度調べ直して理解出来たと感じます 参考にしたリンク:https://qiita.com/kenta1984/items/bad75a37d552510e4682 >>最急降下法や確率的勾配法の仕組みについては理解されていますでしょうか? ご指摘いただいたように数学的知識が乏しいので「なんとなくこんな事しているのかな」くらいの理解しかありません・・・ 以下の図のレベルの理解です https://qiita.com/qiiiiiiita/items/4c6483602f595addefec 理解があやふやなのですが、バッチサイズが大きくなるとデータはある程度平均化されてしまうために各データの変化が捉えられなくなるために局所解から抜け出せなくなる、というような解釈はあっていますか?
tiitoi

2019/03/25 03:30 編集

バッチサイズ=全データ数とした場合、最急降下法と呼ばれるその点の近傍で最も値が減少する方向を選んで、進んでいくことになります。その場合、局所解にハマってしまうと抜け出せなくなってしまいます。 そのため、確率的勾配法というサンプル1つで勾配を計算して値を更新していく方法が考案されました。 本来の勾配の代わりにサンプル1つの勾配を使って進むことで、必ずしも最急降下方向に進むわけではなくなるので、局所解にハマりづらくなります。 現在の Deep Learning では、最急降下法と確率的勾配法の間を取って、サンプル n 個で勾配を計算するミニバッチ勾配降下法(単に確率的勾配法と呼ばれることもある)が使われています。 何個のサンプルの勾配を計算するかを表すパラメータをバッチサイズといいます。 バッチサイズが全データ数に近いほど、本来の勾配に近づくので、局所解にハマりやすくなります。
---stax---

2019/03/25 07:58

回答ありがとうございます。 かなり丁寧に説明して頂いていると思うのですが私が微分の理解が出来ていないので色々あやふやになっているのが改めて実感します... 参考書も進めて頂いてありがとうございます。早速購入しました。 勾配降下法の部分も概要が書かれていたのでそちらも進めてみます。
tiitoi

2019/03/25 11:57

勾配法のイメージを追記しました。 「PythonとKerasによるディープラーニング」本は Keras の使い方を実践的に書いた本なので、数学的な議論は出てきません。 実際、使う上では数学的な背景を知らなくても、困ることはないと思います。 「バッチサイズは1 ~ サンプル数の間で設定できて、バッチサイズは大きいと関数の浅い穴にハマってしまう、小さいと GPU の場合、計算効率が悪くなる、なので、適当な値 16, 32, 64 を試していい結果を採用する」ぐらいの認識でもいいかもしれません。
---stax---

2019/03/26 01:19

回答ありがとうございます。 何度もご迷惑おかけして申し訳ありません。 分からない状態であれもこれも理解しようとして余計分からなくなっていたのでイメージを伝えて頂けるのは非常に助かります。 まずは回答頂いたイメージを持ちながら バッチサイズをいくつか試してみてどう変化するのかを見て感覚を掴んでみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問