ミニバッチ学習でのデータシャッフルの方法 (GPUを使って学習する場合)

752 views
Skip to first unread message

Yusuke Watanabe

unread,
Nov 18, 2015, 9:41:37 AM11/18/15
to Chainer User Group
こんにちは。

通常、SGDで学習する場合、与えるミニバッチは、1エポックごとにランダムにシャッフルしたほうが良いと言われています。
GPUを用いてchainerで学習する場合、このようなデータシャッフルはどこで行うのが良いのでしょうか?

おすすめの方法を教えていただけると幸いです。

今の所、得られた観察は...
  • cupy はシャッフル機能を備えていない (numpyは numpy.random.shuffle機能がある)
  • cupy.ndarrayでは、x[[1,3,5]] のようなindexによるアクセスはサポートされていない

なので、データをGPU上に転送してからシャッフルしたデータを得る方法がよくわかりませんでした。


毎エポックごとに、numpyで(CPU上で)シャッフルしてからGPUに転送するしか方法が無いのでしょうか?





Ryosuke Okuta

unread,
Nov 18, 2015, 8:36:03 PM11/18/15
to Chainer User Group
Chainerを使っていただき、ありがとうございます。

CuPyは現在開発中のため、いろんな機能が不足しております(PR大歓迎です)。
代わりの方法として、CuPyにはtakeが実装されているので、
CPU上でインデックス配列を構築してtakeでデータを取り出す方式が考えられます。

インデックス配列の転送はCPUとGPUで同期が走るので、
インデックス配列は何個か用意して使いまわすと良いかと思います。


2015年11月18日水曜日 23時41分37秒 UTC+9 Yusuke Watanabe:

Yusuke Watanabe

unread,
Nov 19, 2015, 3:24:25 AM11/19/15
to Chainer User Group
ご返答有難うございます。
そのうちCuPyの機能追加にも貢献できればと思ってます。

なるほど、takeを使えば上手く取り出せますね。
ありがとうございました。





2015年11月19日木曜日 10時36分03秒 UTC+9 Ryosuke Okuta:
Reply all
Reply to author
Forward
0 new messages