Lua판 제로로부터 만드는 Deep Learning 그 5[MNIST화상의 표시]

과거 기사



Lua판 제로로부터 만드는 Deep Learning 그 1[퍼셉트론의 실장]
Lua판 제로로부터 만드는 Deep Learning 그 2[활성화 함수]
Lua판 제로로부터 만드는 Deep Learning 그 3[3층 뉴럴 네트워크의 실장]
Lua판 제로로부터 만드는 Deep Learning 그 4[소프트 맥스 함수의 구현]

MNIST 표시



이번은 MNIST 화상 데이터의 표시입니다.
 
 이 근처는 파이썬과 마음이 다릅니다. 우선 PIL을 사용할 수 없습니다. 대신 torch 이미지를 설치합시다.
 
이미지 패키지
 
  이하의 커멘드로 인스톨 가능합니다.

luarocks 설치
$ luarocks install image

 
luarocks는 Lua의 패키지 관리 도구입니다. 가지고 있지 않은 사람은 설치합시다.

luarocks 설치
$ 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

 에서는 훈련 이미지를 표시하는 스크립트는 다음과 같습니다.
 

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로 출력하고 있습니다. 이미지는 다음과 같습니다.
 

 
또 스크립트를 참조해 주시면 라벨의 값을 1 빼고 있습니다. 이는 라벨의 값이 실제 이미지의 수치보다 1 크기이기 때문입니다. 왜 그렇게 되어 있는지 조금 나에게는 의도를 몰랐습니다. 아시는 분이 계시면 가르쳐 주시면 도움이 됩니다.
 
또 python 때는 이미지 데이터는 1차원 벡터로 저장되고 있었습니다만, 이쪽은 처음부터 Tensor 가 되어 있으므로 그 근처는 알기 쉽습니다.
 
또 Lua의 배열(테이블형)은 1부터 인덱스가 시작됩니다. 익숙하지 않은 사람은 주의하는 것이 좋을지도 모릅니다.
 

결론



이번은 이상입니다.

다음에 추론 처리를 실장해 보려고 생각합니다.
 
고맙습니다.
 

참고



torch/tutorials
itorch._iopub socket not set #63

좋은 웹페이지 즐겨찾기