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

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

ただいまの
回答率

91.01%

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

解決済

回答 1

投稿

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

oscikonome

score 9

以下のチュートリアルを読みながら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の意味がよくわかりません。

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

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

よろしくお願いします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+3

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

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

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


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

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

import numpy as np
import tensorflow as tf

x = {'in': np.array([1., 2., 3., 4.])}
y = np.array([0., -1., -2., -3.])

print('Shuffle', 'epochs', 'batch_size', 'target')
for fs in [False, True]:
    for ie in [1, 2, None]:
        for ib in range(1, 10):
            with tf.Session() as sess:
                input_fn = tf.estimator.inputs.numpy_input_fn(x, 
                                                              y, 
                                                              batch_size=ib, 
                                                              shuffle=fs, 
                                                              num_epochs=ie)
                bs = input_fn()
                coord = tf.train.Coordinator()
                threads = tf.train.start_queue_runners(sess, coord=coord)
                for j in range(3):
                    try:
                        print(fs, ie, ib, sess.run(bs[1]))
                    except Exception as e:
                        print(fs, ie, ib, 'no more data')

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/11/16 14:48

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

    キャンセル

  • 2017/11/16 17:22

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

    キャンセル

  • 2017/11/16 18:07

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

    サンプルコードが分かりやすかったです。ありがとうございます。

    キャンセル

  • 2017/11/16 18:09 編集

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

    キャンセル

  • 2017/11/16 18:19

    まったくもっておっしゃる通りかと思います。

    ただそのエポックという言葉の解釈はこの例に限ったほうがよいと思います。
    一般的な学習では1つのセットからバッチサイズずつ取り出して、出し切ったところを学習の1エポック、そしてそのエポックを何度か繰り返すことになるので。

    基礎的なことから学べるという意味ではtensorflowを直に触るのがよいかと思います。ただ、泥臭いことがいろいろと出てきて本質的なところにたどり着くまで大変だったりします。
    kerasのようなtensorflowのラッパーを使うことで、大局的に理解することも大事かと。
    一般的な学習例。
    http://aidiary.hatenablog.com/entry/20161109/1478696865

    キャンセル

  • 2017/11/16 18:34

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

    kerasも参考にしたいと思います。

    キャンセル

  • 2017/11/16 19:29

    このケース、エポックかと言われると確かにエポックではないわけではないのが紛らわしいですね。
    http://st-hakky.hatenablog.com/entry/2017/01/17/165137
    学習時はシャッフルしてしまうので、厳密には正しくないかもしれないですが。

    何がともあれおもしろい話をありがとうございます。
    大変勉強になりました。

    ちなみに、同じxに対して同じyを予測するのなら、線形の評価関数を使っている限り、評価に何エポック使っても同じ値になるような。
    何か勘違いしているのかもしれません。

    キャンセル

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

  • ただいまの回答率 91.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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