結果まとめ追記はじめにこんにちは。何が起きたかから言うと、DeepLearningしようとしたらデータが270GB近くあってメモリに乗らなかった。そこで、練習がてら、batchごとにHDDからデータを読み出して、batch学習するコードを書いた。kerasやpythonをある程度知っている前提で書き進めていく。Documentationとある。これによると方法は2つあるらしい。このブログではこちらを試した。epochs)を使う。この方法はこちらの記事に解説が書いてあった。tech.wonderpla.net両者の違い(私感)train_on_batchを使う方は、直感的に簡単に扱えるのが良い。fit_generatorを使う方は、高機能なのが良い。データをその場で加工するときとかに使うと思う。augmentつかってたし)このブログ書いといて、あれだが、慣れたら後者のほうがスマートに書ける気がする。高機能だし、むしろ後者を使いたい。やることの概要イメージの図はこんな感じこの2つの矢印に相当する関数が必要。以下のように名前をつける。モデルを更新する部分はkerasがtrain_on_batch()というものを提供してくれているので、自分で書く必要があるの、get_batch()だけとなる。データの説明HDDからどうやってメモリに乗せるかを決めるには、データ構造がわからないといけない。今回実験に用いたデータはMNISTである。生のデータだとこんな感じ。そのままだとメモリに載ってしまうのでデータを加工して一旦HDDに保存した。1サンプルに付き28×28の画像データに整形して、その数字の並びのまま.csvにして保存した。(ついでに255で割って0-1正規化もした)catしてみるとこんな感じ。横に伸びてるけど微妙に1になってるのがわかる。階層構造は以下のようになっている。#処理の本体とりあえずdata/train/からbatch_size分のcsvを読み込んでくるんだなとだけ思っていおいてくださいモデルの構築(飛ばしてOK)今回は上図を参考にLeNetを構築した。一部活性化関数をreluにしていたり、初期値をHeの初期値に設定している。modelHDDからバッチを読み出す前準備として、ファイル名だけはすべて読み込みこむ。後々のために、trainとtestを分割しておく。本題のバッチを読み出す関数を書く。Y_batchforで逐次的にbatchを取得したかったのでreturnではなくyieldを用いています。Y_batch)を回していきます。batchのサイズは1000で行っています。5epochだけ回して見ることにします。score[1])結果モデルの構成から表示されるようになっている。0_________________________________________________________________最初は着実に学習が進んでbatchに対する正解率も上がっていく。371中略、1epoch目の結果は以下のようになった。0.9454761904761905となった。trainと比較すると過学習気味かと思ったが、途中のepochでtestのaccuracyは上昇し続けていたのでなんとも...。MNISTで94%はちょっと残念。LeNetのFCをもう一層減らしてCNNのfilter数を増やせばもっと良い結果が出るかもしれない。今回の目的はHDDからbatchを読み出して、訓練することなので目的は達成された。y)を使うと楽にbatchで訓練できるただし逐一バッチを読み出す関数は自分で書かなければいけない(今回ならget_batch())自分はこの方法よりfit_generatorをマスターしたいと思ったもちろんいちいちHDDから読み出しているのでメモリにすべて乗っているときと比べてめちゃくちゃ時間がかかる。github.comデータに関してはhttps://www.kaggle.com/c/digit-recognizer/dataからtrainのデータを拾ってきた。追記モデルを以下のように変更し、batch_sizeを512に変更したら精度がよくなった。お問い合わせはてなブログをはじめよう!aotamasakiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。