過去記事
Lua版 ゼロから作るDeep Learning その1[パーセプトロンの実装]
Lua版 ゼロから作るDeep Learning その2[活性化関数]
Lua版 ゼロから作るDeep Learning その3[3層ニューラルネットワークの実装]
[Lua版 ゼロから作るDeep Learning その4[ソフトマックス関数の実装]]
(http://qiita.com/Kazuki-Nakamae/items/20e53a02a8b759583d31)
MNISTの表示
今回はMNIST画像データの表示です。
このあたりはpythonと勝手が異なります。まずPILが使えません。代わりにtorchのimageをインストールしましょう。
imageパッケージ
以下のコマンドでインストール可能です。
$ luarocks install image
luarocks はLua のパッケージ管理ツールです。持っていない人はインストールしましょう。
$ brew install luarocks
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
では訓練画像を表示するスクリプトは以下のようになります。
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]))
実行例は以下の通りです。
$ 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 の場合では直接表示していましたが、記事をあさってみるとどうもお勧めできないようです。確かに実際に色々試してみましたがdisplayはthコマンドでは動きませんし、同様にitorch などもthコマンドで動かせませんでした。下手に環境もいじりたくもないのでpngとして出力しています。画像は以下の通りです。
またスクリプトの方を参照していただくとラベルの値を1引いています。これはラベルの値が実際の画像の数値よりも1大きいためです。なぜそうなっているのかはちょっと私には意図がわかりませんでした。ご存知の方がいらっしゃれば教えていただけると助かります。
またpython のときは画像データは一次元ベクトルので格納されていましたが、こちらは最初からTensor となっているのでそのあたりはわかりやすいです。
またLuaの配列(テーブル型)は1からインデックスが始まります。慣れない人は注意したほうがいいかもしれません。
おわりに
今回は以上です。