LoginSignup
2
1

More than 5 years have passed since last update.

Lua版 ゼロから作るDeep Learning その5[MNIST画像の表示]

Last updated at Posted at 2017-06-12

過去記事

Lua版 ゼロから作るDeep Learning その1[パーセプトロンの実装]
Lua版 ゼロから作るDeep Learning その2[活性化関数]
Lua版 ゼロから作るDeep Learning その3[3層ニューラルネットワークの実装]
Lua版 ゼロから作るDeep Learning その4[ソフトマックス関数の実装]

MNISTの表示

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

luarocksのインストール
$ luarocks install image

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

luarocksのインストール
$ brew install luarocks

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

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

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

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]))

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

実行例
$ 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として出力しています。画像は以下の通りです。
 
trainData1.png
 
 またスクリプトの方を参照していただくとラベルの値を1引いています。これはラベルの値が実際の画像の数値よりも1大きいためです。なぜそうなっているのかはちょっと私には意図がわかりませんでした。ご存知の方がいらっしゃれば教えていただけると助かります。
 
 またpython のときは画像データは一次元ベクトルので格納されていましたが、こちらは最初からTensor となっているのでそのあたりはわかりやすいです。
 
 またLuaの配列(テーブル型)は1からインデックスが始まります。慣れない人は注意したほうがいいかもしれません。
 

おわりに

 今回は以上です。

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

 参考

torch/tutorials
itorch._iopub socket not set #63

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1