===== (2)tuple_datasetによるデータの準備・設定 =====
Chainer2でMNIST目次\\
[[Chainer2プログラミングの全体図]]
-[[(1)Chainer2を使用するためのimport文]]
-[[(2)データの準備・設定|(2)データの準備・設定(Chainer)]] <= いまココ
-[[(3)モデルの記述|(3)モデルの記述(Chainer)]]
-[[(4)モデルと最適化アルゴリズムの設定|(4)モデルと最適化アルゴリズムの設定(Chainer)]]
-[[(5)学習と結果の出力(Chainer)]]
-[[(6)結果の出力|(6)学習結果のパラメータの保存(Chainer)]]
-[[(7)推測|(7)推測(Chainer)]]
#3 モデルの記述
class MyModel(Chain):
def __init__(self):
super(MyModel,self).__init__(
# パラメータを含む関数の宣言
)
def __call__(self, ...):
# 損失関数
def fwd(self, x):
# 順伝播? ここにもモデルを記載、予測するときにこの関数を用いる
===== 開発環境 =====
Windows 8.1\\
Anaconda \\
Python 3.5\\
Chainer 2.0\\
Chainerのインストール方法は[[Chainer2.0をWindowsにインストール]]をご覧下さい。
このページは、[[(1)Chainer2を使用するためのimport文]]の続きであり、今回は、MNISTのデータの準備・設定を行っていきます。
データの準備が難しいところなのですが、今回は、最初なので、Chainerであらかじめ用意されているMNISTデータセットを利用します。
オリジナルデータセットの準備については、後日、[[Chainer2用自前データの準備]]
に記載予定です。
===== 手順 =====
==== 0. 前回終了時の画面 ====
[[(1)Chainer2を使用するためのimport文]]終了時の、以下のような状態から始めます。
{{:pasted:20171103-205859.png?400|}}
==== 1. データセットの準備 ====
以下のコードを入力して、Shift + Enterを押します。最初は、MNISTの画像データなどがダウンロードされるので、時間がかかります。
from chainer.datasets import mnist
# データセットがダウンロード済みでなければ、ダウンロードも行う
train, test = mnist.get_mnist(withlabel=True, ndim=1)
# matplotlibを使ったグラフ描画結果がnotebook内に表示されるようにします。
%matplotlib inline
import matplotlib.pyplot as plt
# データの例示
x, t = train[0]
plt.imshow(x.reshape(28, 28), cmap='gray')
plt.show()
print('label:', t)
以下のような画面になります。(以下の画面は、2回目以降の画面となります。最初は、「Downloading from %%http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz...%%」といった感じの文字が4行続くと思います。)
{{:pasted:20171103-211623.png}}
順に解説していきます。
from chainer.datasets import mnist
# データセットがダウンロード済みでなければ、ダウンロードも行う
train, test = mnist.get_mnist(withlabel=True, ndim=1)
Chainerが用意しているchainer.datasetsから、手書き数字MNISTのデータをダウンロードして読み込みます。
MNISTとは何か、またこれから何をやろうとしているのかについては、以下のサイトが非常に分かりやすいです。\\
http://exceldeeplearning.blog.jp/archives/1411297.html\\
ちなみに、よく言われているMNISTの元データのダウンロードついては、[[http://twosquirrel.mints.ne.jp/?p=20277|こちら]]をご覧いただければと思います。
手書き数字MNISTは、本来は28x28pixelのグレースケールの画像と、それが何の数字であるかの正解ラベルのセットです。この画像と正解ラベルのセットが、training用の6万セット、test用の1万セットとなっています。
ただ、画像のままではChainerでは読み込めません。そのため、画像を0~255の値をとる284個の数字が1列に並んだ配列(ndim=1)に変換(さらに正規化といって全部255で割る)したものと、正解ラベルのセット(withlabel=True)に変換したものを、chainer.datasets.get_mnist()関数で呼び出して、trainとtestという変数に代入しています。
>なかがどんなカタチになっているかというと、一つの行(train[0])に
>%%[[%%.234809284, .324039284, .34809382 …. .04843098%%]%%, 3%%]%%
>というように、左に入力値と右にその答え(ラベル値)がセットで入っています。
>また、chainerではtrainで学習して、testで試してみて正解率を見ていく感じになります。\\
出典:[[https://qiita.com/tommyfms2/items/a2f23acbf515fba3495b|chainer 1.11.0以降のmnistを解説]]
具体的には、今回、
x, t = train[0]
print(x)
print(t)
と入力してShift + Enterで実行すると、以下のように表示されてます。
{{:pasted:20171103-213151.png}}
{{:pasted:20171103-213221.png}}
ちなみに、
print(train[0])
とすると、以下のように表示されて、train[0]は、1x784のNumpy配列(各要素は0から1までの数値(dtype=float32))と、正解ラベル(dtype=int32)のタプル(tuple)であることが分かります。
{{:pasted:20171103-213448.png}}
{{:pasted:20171103-213512.png}}
次は、train[0]の画像データをJupyter Notebookで可視化しています。
# matplotlibを使ったグラフ描画結果がnotebook内に表示されるようにします。
%matplotlib inline
import matplotlib.pyplot as plt
# データの例示
# trainデータセットの1行目を、画像データのNumpy配列(1x784)をx、正解ラベルをtとして取り出す
x, t = train[0]
# 1x784のNumpy配列xを、28x28のNumpy配列に変換後、matplotlibのpyplotを用いて、
# グレースケール画像として読み込み、Jupyter Notebook内で表示
plt.imshow(x.reshape(28, 28), cmap='gray')
plt.show()
# 正解ラベルの表示
print('label:', t)
こちらは、ダウンロードしたMNIST画像の1つを、Jupyter Notebook上に表示して確認しています。一つ一つのコードについては、上記のコード内にコメントで記載しました。ここでは、numpyのreshape()関数と、matplotlib.pyplotのimshow()関数、show()関数を用いています。numpyとmatplotlibは機械学習プログラミングでよく使いますので、特にNumpyについては勉強しておく必要があります。
Numpyについては、[[http://twosquirrel.mints.ne.jp/?p=20153|Chainer用の画像処理メモ(5)初めてのNumPy"import numpy as np"]]をご覧いただければ幸いですが、以下の2つの本などで、ある程度しっかり勉強しておく必要があります。
後半のコードは、特にMNISTのtrainingを行う際には不要ですが、データを読み込んだときに、読み込んだデータと元のデータとの整合性の検証は大事なことなので、このようなコードの記載があるのだと思われます。
Chainerが用意しているMNISTデータセットを用いる手順は上記でおしまいです。
初めての場合は、次は、とりあえず、[[(3)モデルの記述]]に進んでください。
===== chainer.datasets.get_mnist関数について =====
trainとtestに対応する2つのdatasetを返します。
(1)グレースケール画像のデータをgetする場合\\
今回はそれにあたります(MNISTなんてグレースケールで十分)が、
train, test = mnist.get_mnist(withlabel=True, ndim=1)
のように、引数に、withlabel=True, ndim=1と入れます。
(2)万が一、カラー画像としてデータをgetしたい場合\\
train, test = mnist.get_mnist(withlabel=True, ndim=3, rgb_format=True)
のように、引数に、withlabel=True, ndim=1, rgb_format=Trueと入れます。
Chainer関連の関数については、公式マニュアルを読むのが一番です。残念ながら英語ですが、それでも読むしかありません。日本発祥なのだから、マニュアルの日本語Versionもぜひ欲しいところなのですが、、、Kerasは日本語マニュアルがあるのに、、、
Docs » Chainer Reference Manual » Dataset examples » chainer.datasets.get_mnist\\
https://docs.chainer.org/en/stable/reference/generated/chainer.datasets.get_mnist.html\\
{{:pasted:20171103-185942.png}}
===== Numpy配列について =====
よろしければ、以下をご覧ください。
Chainer用の画像処理メモ(5)初めてのNumPy"import numpy as np"\\
2017/10/22\\
http://twosquirrel.mints.ne.jp/?p=20209
Chainer用の画像処理メモ(6)画像をNumpy配列に変換\\
2017/10/23\\
http://twosquirrel.mints.ne.jp/?p=20209
===== import matplotlib.pyplot as pltについて =====
かなり面倒ですが、コードを理解するためには、import文の役割を一つずつ調べていくのが王道です。
機械学習プログラミングで使用することが多いimport文について、以下にまとめていく予定ですので、ぜひご覧ください。
機械学習で用いるpythonの”import xxx”まとめ\\
2017/10/25 2017/10/28\\
http://twosquirrel.mints.ne.jp/?p=20344
Matplotlibについては、以下の本の第4章「Matplotlibでグラフを描画しよう」がおすすめですが、さしあたり、[[https://qiita.com/Tatejimaru137/items/44646c9bb3799768fa81|matplotlibで画像を連続的に表示する方法メモ]]や[[http://oikakeru.hateblo.jp/entry/2017/03/30/150842|Matplotlibで画像を表示してみるetc(その1)]]が参考になります。matplotlib.pyplotで画像を表示するために、numpyとかPIL(pillow)とかいきなり出てきますので、その都度、[[http://twosquirrel.mints.ne.jp/?p=20344|機械学習で用いるpythonの”import xxx”まとめ]]で該当部分をチェックしてもよいとは思います。
===== 参考文献 =====
Chainer: ビギナー向けチュートリアル Vol.1
mitmul 2017年05月18日に更新
https://qiita.com/mitmul/items/eccf4e0a84cb784ba84a
Chainerv2による実践深層学習、新納浩幸
上のMNISTのチュートリアルだと、Chainerがあらかじめ用意しているデータを使用しているだけで、自前のデータを扱う方法がさっぱりわからないので、以下の解説を参考にする必要がある。
chainerのデータセットの作り方 LinearやCNN\\
https://qiita.com/tommyfms2/items/c3fa0cb258c17468cb30
===== 自前のデータでchainerのデータセットの作り方 =====
作成中。下記ページを参考にする。
chainerのデータセットの作り方 LinearやCNN\\
https://qiita.com/tommyfms2/items/c3fa0cb258c17468cb30
ChainerのCNNにおけるデータセットの作り方\\
2017年8月4日 hiroki7122\\
http://enjoy-programing.com/chainer%E3%81%AEcnn%E3%81%AB%E3%81%8A%E3%81%91%E3%82%8B%E3%83%87%E3%83%BC%E3%82%BF%E3%82%BB%E3%83%83%E3%83%88%E3%81%AE%E4%BD%9C%E3%82%8A%E6%96%B9/
chainerのデータセットの作り方 LinearやCNN\\
tommyfms2 2017年10月07日に更新\\
https://qiita.com/tommyfms2/items/c3fa0cb258c17468cb30
===== リンク =====
次 [[(3)モデルの記述|(3)モデルの記述(Chainer)]]
前 [[(1)Chainer2を使用するためのimport文]]
Chainer2でMNIST目次\\
[[Chainer2プログラミングの全体図]]
-[[(1)Chainer2を使用するためのimport文]]
-[[(2)データの準備・設定|(2)データの準備・設定(Chainer)]] <= いまココ
-[[(3)モデルの記述|(3)モデルの記述(Chainer)]]
-[[(4)モデルと最適化アルゴリズムの設定|(4)モデルと最適化アルゴリズムの設定(Chainer)]]
-[[(5)学習と結果の出力(Chainer)]]
-[[(6)結果の出力|(6)学習結果のパラメータの保存(Chainer)]]
-[[(7)推測|(7)推測(Chainer)]]