回答編集履歴

2

マイナー変更

2017/11/16 08:20

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -1,28 +1,26 @@
1
- 1.およそその認識で正しいのではないでしょうか。←オンライン学習などについて
1
+ 1.およそその認識で正しいのではないでしょうか。←オンライン学習などについて(ジェネレータならちょっと複雑です。言葉の定義的な意味で。[ミニバッチ学習もオンライン学習の一種に含まれそうですし。](https://www.ai-gakkai.or.jp/my-bookmark_vol30-no5/))
2
2
 
3
- 普通はデータセットの方がずっと大きいので、学習時にメモリに乗せるため適切なバッチサイズが必要となります
3
+ 普通はデータセットの方がずっと大きいので、学習時にメモリに乗せるため適切なバッチサイズが必要となります。
4
4
 
5
- 割り切れない場合、残りは切り捨てることが多いと思いますが、実際の実装を見るしかないでしょう。暇があったら調べます。(追記しました
5
+ 割り切れない場合、残りは切り捨てることが多いと思いますが、実際の実装を見るしかないでしょう。暇があったら調べます。(切り捨てないようです。
6
6
 
7
- データセットより大きくなる場合、エラーが出そうですが…(エラーが出ないように処理されていました。num_epochs=1ならデータセットで打ち切りです。num_epochs=Noneなら指定したbatch_sizeまでデータをかさ増しします。)
7
+ データセットより大きくなる場合、エラーが出そうですが…(一度目まではエラーが出ないように処理されていました。num_epochs=1ならデータセットサイズで打ち切りです。num_epochs=Noneなら指定したbatch_sizeまでデータをかさ増しします。)
8
8
 
9
- 込み入った話:画像データなどの場合、切り抜いたり変形させたりして学習させることがあり、元のデータから大量にデータを生成するテクニックがあります。その場合、バッチサイズに合うように大量にデータが作り出されていくので、教師データサイズは直接関係しません。
9
+ 込み入った話:画像データなどの場合、切り抜いたり変形させたりして学習させることがあり、元のデータから大量にデータを生成する[テクニック](https://keras.io/ja/preprocessing/image/)があります。その場合、バッチサイズに合うように大量にデータが作り出されていくので、教師データサイズは直接関係しません。(ジェネレータだったので、今回のケースに相当します。)
10
-
11
- https://stackoverflow.com/questions/41175401/what-is-a-batch-in-tensorflow
12
10
 
13
11
 
14
12
 
15
13
  2.epochと一緒にstepを考えべきでしょう。
16
14
 
17
- 以下が詳しいです。
18
-
19
- https://stackoverflow.com/questions/38340311/what-is-the-difference-between-steps-and-epochs-in-tensorflow
15
+ [ここ](https://stackoverflow.com/questions/38340311/what-is-the-difference-between-steps-and-epochs-in-tensorflow)が詳しいです。
20
16
 
21
17
 
22
18
 
23
19
  以下にもっと一般的な話があるので、そちらを理解すると、今の疑問が解決するかと。
24
20
 
25
- https://towardsdatascience.com/epoch-vs-iterations-vs-batch-size-4dfb9c7ce9c9
21
+ [学習時のバッチサイズ、エポック、ステップについて](https://towardsdatascience.com/epoch-vs-iterations-vs-batch-size-4dfb9c7ce9c9)
22
+
23
+ [バッチについて詳しく](https://stackoverflow.com/questions/41175401/what-is-a-batch-in-tensorflow)
26
24
 
27
25
 
28
26
 
@@ -54,17 +52,27 @@
54
52
 
55
53
  y = np.array([0., -1., -2., -3.])
56
54
 
55
+
56
+
57
57
  print('Shuffle', 'epochs', 'batch_size', 'target')
58
58
 
59
59
  for fs in [False, True]:
60
60
 
61
- for ie in range(1,4):
61
+ for ie in [1, 2, None]:
62
62
 
63
63
  for ib in range(1, 10):
64
64
 
65
65
  with tf.Session() as sess:
66
66
 
67
- input_fn = tf.estimator.inputs.numpy_input_fn(x, y, batch_size=ib, shuffle=fs, num_epochs=ie)
67
+ input_fn = tf.estimator.inputs.numpy_input_fn(x,
68
+
69
+ y,
70
+
71
+ batch_size=ib,
72
+
73
+ shuffle=fs,
74
+
75
+ num_epochs=ie)
68
76
 
69
77
  bs = input_fn()
70
78
 
@@ -72,6 +80,14 @@
72
80
 
73
81
  threads = tf.train.start_queue_runners(sess, coord=coord)
74
82
 
83
+ for j in range(3):
84
+
85
+ try:
86
+
75
- print(fs, ie, ib, sess.run(bs[1]))
87
+ print(fs, ie, ib, sess.run(bs[1]))
88
+
89
+ except Exception as e:
90
+
91
+ print(fs, ie, ib, 'no more data')
76
92
 
77
93
  ```

1

追記

2017/11/16 08:20

投稿

mkgrei
mkgrei

スコア8560

test CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  普通はデータセットの方がずっと大きいので、学習時にメモリに乗せるため適切なバッチサイズが必要となりますが。
4
4
 
5
- 割り切れない場合、残りは切り捨てることが多いと思いますが、実際の実装を見るしかないでしょう。暇があったら調べます。
5
+ 割り切れない場合、残りは切り捨てることが多いと思いますが、実際の実装を見るしかないでしょう。暇があったら調べます。(追記しました)
6
6
 
7
- データセットより大きくなる場合、エラーが出そうですが…
7
+ データセットより大きくなる場合、エラーが出そうですが…(エラーが出ないように処理されていました。num_epochs=1ならデータセットで打ち切りです。num_epochs=Noneなら指定したbatch_sizeまでデータをかさ増しします。)
8
8
 
9
9
  込み入った話:画像データなどの場合、切り抜いたり変形させたりして学習させることがあり、元のデータから大量にデータを生成するテクニックがあります。その場合、バッチサイズに合うように大量にデータが作り出されていくので、教師データサイズは直接関係しません。
10
10
 
@@ -23,3 +23,55 @@
23
23
  以下にもっと一般的な話があるので、そちらを理解すると、今の疑問が解決するかと。
24
24
 
25
25
  https://towardsdatascience.com/epoch-vs-iterations-vs-batch-size-4dfb9c7ce9c9
26
+
27
+
28
+
29
+ ---
30
+
31
+ 追記:
32
+
33
+ この関数、feedに食わせるためのジェネレータなんですね。
34
+
35
+ 知りませんでした。勉強になっておもしろかったです。
36
+
37
+
38
+
39
+ 以下のコードを試して走らせてみると、挙動について理解できます。
40
+
41
+ ちなみにtensorflowはバージョンが変わるたびに関数の場所がコロコロ変わっており、以下のコードはr1.1.0で動くことしか確認しておりません。
42
+
43
+
44
+
45
+ ```python
46
+
47
+ import numpy as np
48
+
49
+ import tensorflow as tf
50
+
51
+
52
+
53
+ x = {'in': np.array([1., 2., 3., 4.])}
54
+
55
+ y = np.array([0., -1., -2., -3.])
56
+
57
+ print('Shuffle', 'epochs', 'batch_size', 'target')
58
+
59
+ for fs in [False, True]:
60
+
61
+ for ie in range(1,4):
62
+
63
+ for ib in range(1, 10):
64
+
65
+ with tf.Session() as sess:
66
+
67
+ input_fn = tf.estimator.inputs.numpy_input_fn(x, y, batch_size=ib, shuffle=fs, num_epochs=ie)
68
+
69
+ bs = input_fn()
70
+
71
+ coord = tf.train.Coordinator()
72
+
73
+ threads = tf.train.start_queue_runners(sess, coord=coord)
74
+
75
+ print(fs, ie, ib, sess.run(bs[1]))
76
+
77
+ ```