Lua版 ゼロから作るDeep Learning その５［MNIST画像の表示］


過去記事
--
[Lua版 ゼロから作るDeep Learning その１[パーセプトロンの実装]](http://qiita.com/Kazuki-Nakamae/items/16c82b5ac8a85d4adee3)
[Lua版 ゼロから作るDeep Learning その２［活性化関数］](http://qiita.com/Kazuki-Nakamae/items/5199447a54642620139a)
[Lua版 ゼロから作るDeep Learning その３［３層ニューラルネットワークの実装］](http://qiita.com/Kazuki-Nakamae/items/57c2977d0a9a38bdf6b8)
[Lua版 ゼロから作るDeep Learning その４［ソフトマックス関数の実装］]
(http://qiita.com/Kazuki-Nakamae/items/20e53a02a8b759583d31)


MNISTの表示
--
　今回はMNIST画像データの表示です。
　
　このあたりはpythonと勝手が異なります。まずPILが使えません。代わりにtorchのimageをインストールしましょう。
　
　[imageパッケージ](https://github.com/torch/image)
　
　以下のコマンドでインストール可能です。

```bash:luarocksのインストール
$ luarocks install image
```
　
　luarocks はLua のパッケージ管理ツールです。持っていない人はインストールしましょう。

```bash:luarocksのインストール
$ brew install luarocks
```

　image パッケージがインストールできたならば、テストで確認してみてください。
　以下のようになればとりあえず大丈夫です。

```bash:imageパッケージのテスト
$ luajit -limage -e "image.test()"
seed: 	1497280170
Running 41 tests
 1/41 CompressAndDecompress ............................................. [PASS]
 2/41 test_transformation_largeByteImage_vflip .......................... [PASS]
 3/41 CompressAndDecompressPNG .......................................... [PASS]
 4/41 test_inplace_hflip ................................................ [PASS]
 5/41 bilinearUpscale_ByteTensor ........................................ [PASS]
（省略）
39/41 test_textdraw ..................................................... [PASS]
40/41 byteGaussian ...................................................... [PASS]
41/41 y2jetByteTensor ................................................... [PASS]
Completed 83 asserts in 41 tests with 0 failures and 0 errors
```



　では訓練画像を表示するスクリプトは以下のようになります。
　



```lua:showmnist.lua
require 'image'

print '==> downloading dataset'

-- Note: files were converted from their original LUSH format
-- to Torch's internal format.

-- The SVHN dataset contains 3 files:
--    + train: training data
--    + test:  test data

local tar = 'http://torch7.s3-website-us-east-1.amazonaws.com/data/mnist.t7.tgz'

if not paths.dirp('mnist.t7') then
   os.execute('wget ' .. tar)
   os.execute('tar xvf ' .. paths.basename(tar))
end

local train_file = 'mnist.t7/train_32x32.t7'
local test_file = 'mnist.t7/test_32x32.t7'

----------------------------------------------------------------------
print '==> loading dataset'

-- We load the dataset from disk, it's straightforward

local trainData = torch.load(train_file,'ascii')
local testData = torch.load(test_file,'ascii')

print('Training Data:')
print(trainData)

print('Test Data:')
print(testData)

----------------------------------------------------------------------
print '==> visualizing data'

-- Visualization

print(trainData.labels[1]-1)
print(trainData.data[1]:size(2) * trainData.data[1]:size(3))
print(trainData.data[1]:size())
image.save('trainData1.png', image.toDisplayTensor(trainData.data[1]))
```




　実行例は以下の通りです。

```bash:実行例
$ th showmnist.lua
==> downloading dataset	
（省略）
Length: 11706980 (11M) [application/x-compressed]
Saving to: ‘mnist.t7.tgz’

mnist.t7.tgz        100%[===================>]  11.16M  2.19MB/s    in 7.6s    

2017-06-13 00:14:02 (1.47 MB/s) - ‘mnist.t7.tgz’ saved [11706980/11706980]

x mnist.t7/
x mnist.t7/test_32x32.t7
x mnist.t7/train_32x32.t7
==> loading dataset	
Training Data:	
{
  data : ByteTensor - size: 60000x1x32x32
  labels : ByteTensor - size: 60000
}
Test Data:	
{
  data : ByteTensor - size: 10000x1x32x32
  labels : ByteTensor - size: 10000
}
==> visualizing data	
5	
1024	
  1
 32
 32
[torch.LongStorage of size 3]
```

　python の場合では直接表示していましたが、[記事](http://ultraist.hatenablog.com/entry/2015/01/30/221102)をあさってみるとどうもお勧めできないようです。確かに実際に色々試してみましたがdisplayはthコマンドでは動きませんし、同様にitorch などもthコマンドで動かせませんでした。下手に環境もいじりたくもないのでpngとして出力しています。画像は以下の通りです。
　
![trainData1.png](https://qiita-image-store.s3.amazonaws.com/0/147329/75818245-017a-f229-993b-02e9bc975c0c.png "trainData1.png")
　
　またスクリプトの方を参照していただくとラベルの値を1引いています。これはラベルの値が実際の画像の数値よりも１大きいためです。なぜそうなっているのかはちょっと私には意図がわかりませんでした。ご存知の方がいらっしゃれば教えていただけると助かります。
　
　またpython のときは画像データは一次元ベクトルので格納されていましたが、こちらは最初からTensor となっているのでそのあたりはわかりやすいです。
　
　またLuaの配列（テーブル型）は1からインデックスが始まります。慣れない人は注意したほうがいいかもしれません。
　

おわりに
--

　今回は以上です。

　次回は推論処理を実装してみようと思います。
　
　ありがとうございました。
　
　参考
--

[torch/tutorials](https://github.com/torch/tutorials/blob/master/A_datasets/mnist.lua)
[itorch._iopub socket not set #63](https://github.com/facebook/iTorch/issues/63)