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

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

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

Q&A

解決済

1回答

14781閲覧

データサイズ、バッチサイズ、エポックの関係

oscikonome

総合スコア16

0グッド

0クリップ

投稿2017/11/16 03:47

以下のチュートリアルを読みながらTensorFlowの学習をしています
https://www.tensorflow.org/get_started/get_started

tf.estimator
Basic usage
のところに記載してあるプログラムの意味でよく分からない部分があります。

x_train = np.array([1., 2., 3., 4.])
y_train = np.array([0., -1., -2., -3.])
x_eval = np.array([2., 5., 8., 1.])
y_eval = np.array([-1.01, -4.1, -7, 0.])

ここでtrainという1つの従属変数と1つの目的変数のペア4個分の学習用データと、別名でevalという同様の評価用データを宣言しているのだと思います。

input_fn = tf.estimator.inputs.numpy_input_fn(
{"x": x_train}, y_train, batch_size=4, num_epochs=None, shuffle=True)
train_input_fn = tf.estimator.inputs.numpy_input_fn(
{"x": x_train}, y_train, batch_size=4, num_epochs=1000, shuffle=False)
eval_input_fn = tf.estimator.inputs.numpy_input_fn(
{"x": x_eval}, y_eval, batch_size=4, num_epochs=1000, shuffle=False)

ここでは入力用の関数を宣言しているようなのですが、batch_sieとnum_epochsの意味がよくわかりません。

もとのtrainとevalは4個のデータのため、batch_size=4というのはいわゆるバッチ学習、batch_size=1はオンライン学習、2or3の場合はミニバッチ学習、ということなのでしょうか?
また、batch_size=3は4を割り切れないためどういう内容のデータになるのか、batch_sizeを4より大きくした場合は4と指定したときと違うのでしょうか?

2.num_epochsの意味は何でしょうか?Noneと1000ではどういう違いが生まれるのでしょうか?

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

1.およそその認識で正しいのではないでしょうか。←オンライン学習などについて(ジェネレータならちょっと複雑です。言葉の定義的な意味で。ミニバッチ学習もオンライン学習の一種に含まれそうですし。
普通はデータセットの方がずっと大きいので、学習時にメモリに乗せるため適切なバッチサイズが必要となります。
割り切れない場合、残りは切り捨てることが多いと思いますが、実際の実装を見るしかないでしょう。暇があったら調べます。(切り捨てないようです。)
データセットより大きくなる場合、エラーが出そうですが…(一度目まではエラーが出ないように処理されていました。num_epochs=1ならデータセットサイズで打ち切りです。num_epochs=Noneなら指定したbatch_sizeまでデータをかさ増しします。)
込み入った話:画像データなどの場合、切り抜いたり変形させたりして学習させることがあり、元のデータから大量にデータを生成するテクニックがあります。その場合、バッチサイズに合うように大量にデータが作り出されていくので、教師データサイズは直接関係しません。(ジェネレータだったので、今回のケースに相当します。)

2.epochと一緒にstepを考えべきでしょう。
ここが詳しいです。

以下にもっと一般的な話があるので、そちらを理解すると、今の疑問が解決するかと。
学習時のバッチサイズ、エポック、ステップについて
バッチについて詳しく


追記:
この関数、feedに食わせるためのジェネレータなんですね。
知りませんでした。勉強になっておもしろかったです。

以下のコードを試して走らせてみると、挙動について理解できます。
ちなみにtensorflowはバージョンが変わるたびに関数の場所がコロコロ変わっており、以下のコードはr1.1.0で動くことしか確認しておりません。

python

1import numpy as np 2import tensorflow as tf 3 4x = {'in': np.array([1., 2., 3., 4.])} 5y = np.array([0., -1., -2., -3.]) 6 7print('Shuffle', 'epochs', 'batch_size', 'target') 8for fs in [False, True]: 9 for ie in [1, 2, None]: 10 for ib in range(1, 10): 11 with tf.Session() as sess: 12 input_fn = tf.estimator.inputs.numpy_input_fn(x, 13 y, 14 batch_size=ib, 15 shuffle=fs, 16 num_epochs=ie) 17 bs = input_fn() 18 coord = tf.train.Coordinator() 19 threads = tf.train.start_queue_runners(sess, coord=coord) 20 for j in range(3): 21 try: 22 print(fs, ie, ib, sess.run(bs[1])) 23 except Exception as e: 24 print(fs, ie, ib, 'no more data')

投稿2017/11/16 05:41

編集2017/11/16 08:20
mkgrei

総合スコア8560

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

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

diningyo

2017/11/16 05:48

> 割り切れない場合、残りは切り捨てることが多いと思いますが、実際の実装を見るしかないでしょう。 私もここは実際の実装依存だと思います。 溢れた分を次のepochから取ってくるなんて実装も見たこと有りますね。
mkgrei

2017/11/16 08:22

次のepochから持ってくるためにnum_epochsがあるようです。
oscikonome

2017/11/16 09:07

エポックは元のデータをどれだけ増やすか、ということですね。(数値を指定すれば指定した分だけ、Noneなら取り出しが終わるまでいくらでも。シャッフルは増やした後の全体をシャッフルするイメージのようですね) そこからバッチサイズ分のデータを、ステップの数だけ取り出していくイメージでしょうか。 とすると、学習においてはエポックに数値を指定する理由はあまりなさそうですね、ただ評価の際にはエポックをNoneにすると無限ループになると・・・ サンプルコードが分かりやすかったです。ありがとうございます。
oscikonome

2017/11/16 09:09 編集

(評価でNoneを指定したら全く進まなかったもので・・・)
mkgrei

2017/11/16 09:19

まったくもっておっしゃる通りかと思います。 ただそのエポックという言葉の解釈はこの例に限ったほうがよいと思います。 一般的な学習では1つのセットからバッチサイズずつ取り出して、出し切ったところを学習の1エポック、そしてそのエポックを何度か繰り返すことになるので。 基礎的なことから学べるという意味ではtensorflowを直に触るのがよいかと思います。ただ、泥臭いことがいろいろと出てきて本質的なところにたどり着くまで大変だったりします。 kerasのようなtensorflowのラッパーを使うことで、大局的に理解することも大事かと。 一般的な学習例。 http://aidiary.hatenablog.com/entry/20161109/1478696865
oscikonome

2017/11/16 09:34

>一般的な学習では1つのセットからバッチサイズずつ取り出して、出し切ったところを学習の1エポック、そしてそのエポックを何度か繰り返すことになるので。 最初の認識がこれでした。元のデータサイズ、バッチサイズ、後は繰り返しの数を指定すれば十分だと思い、ここでのエポックが分かりませんでした。 kerasも参考にしたいと思います。
mkgrei

2017/11/16 10:29

このケース、エポックかと言われると確かにエポックではないわけではないのが紛らわしいですね。 http://st-hakky.hatenablog.com/entry/2017/01/17/165137 学習時はシャッフルしてしまうので、厳密には正しくないかもしれないですが。 何がともあれおもしろい話をありがとうございます。 大変勉強になりました。 ちなみに、同じxに対して同じyを予測するのなら、線形の評価関数を使っている限り、評価に何エポック使っても同じ値になるような。 何か勘違いしているのかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問