前提・実現したいこと
画像のようにMNISTデータを各クラスごとに1クラス10枚ずつ表示したいです。(画像はインターネットからコピーしています)
![
現時点で実装できているもの
現時点では、以下のソースコードのように学習用データの最初から縦10、横10で表示できるようにしました。
該当のソースコード
python
1### MNIST データを可視化するプログラム ### 2 3from __future__ import print_function 4 5import cv2 6import numpy as np 7import mnist 8 9nx, ny = 10, 10 # 横縦に並べる画像の数 10gap = 3 # 画像間のスペース 11 12# MNIST の学習データのうち最初の nx * ny 個だけ取り出す 13mn = mnist.MNIST(pathMNIST = './mnist') 14dat = mn.getImage('L') 15lab = mn.getLabel('L') 16 17result=[] 18 19for i in range(10): 20 count=0 21 for count in range(10): 22 for j in range(len(dat)): 23 if i == lab[j]: 24 result.append(dat[j]) 25 count = count+1 26 elif count == 10: 27 break 28 29nrow, ncol = mn.nrow, mn.ncol 30 31# 並べた画像の幅と高さ 32width = nx * (ncol + gap) + gap 33height = ny * (nrow + gap) + gap 34 35# 画像の作成 36img = np.zeros((height, width), dtype = int) + 128 37for iy in range(ny): 38 lty = iy*(nrow + gap) + gap 39 for ix in range(nx): 40 ltx = ix*(ncol + gap) + gap 41 img[lty:lty+nrow, ltx:ltx+ncol] = result[iy*nx+ix].reshape((nrow, ncol)) 42 43# 画像の出力 44cv2.imwrite('MNIST.png', img) 45 46# ラベルの出力 47print(lab.reshape((ny, nx)))
python
1#### MNISTデータ読み込み用プログラム 2from __future__ import print_function 3 4import struct 5import os 6import numpy as np 7 8 9class MNIST: 10 11 def __init__( self, pathMNIST = '.' ): 12 13 fnLabelL = os.path.join( pathMNIST, 'train-labels-idx1-ubyte' ) 14 fnLabelT = os.path.join( pathMNIST, 't10k-labels-idx1-ubyte' ) 15 self.fnLabel = { 'L': fnLabelL, 'T': fnLabelT } 16 fnImageL = os.path.join( pathMNIST, 'train-images-idx3-ubyte' ) 17 fnImageT = os.path.join( pathMNIST, 't10k-images-idx3-ubyte' ) 18 self.fnImage = { 'L': fnImageL, 'T': fnImageT } 19 self.nrow = 28 20 self.ncol = 28 21 self.nclass = 10 22 23 24 def getLabel( self, LT ): 25 26 return _readLabel( self.fnLabel[LT] ) 27 28 29 def getImage( self, LT ): 30 31 return _readImage( self.fnImage[LT] ) 32 33 34##### reading the label file 35def _readLabel( fnLabel ): 36 37 f = open( fnLabel, 'rb' ) 38 39 header = f.read( 8 ) 40 mn, num = struct.unpack( '>2i', header ) # MSB first (bigendian) 41 assert mn == 2049 42 label = np.array( struct.unpack( '>%dB' % num, f.read() ), dtype = int ) 43 44 f.close() 45 46 return label 47 48 49##### reading the image file 50def _readImage( fnImage ): 51 52 f = open( fnImage, 'rb' ) 53 54 header = f.read( 16 ) 55 mn, num, nrow, ncol = struct.unpack( '>4i', header ) # MSB first (bigendian) 56 assert mn == 2051 57 58 ### pixels (unsigned byte) 59 npixel = ncol * nrow 60 pixel = np.empty( ( num, npixel ) ) 61 for i in range( num ): 62 buf = struct.unpack( '>%dB' % npixel, f.read( npixel ) ) 63 pixel[i, :] = np.asarray( buf ) 64 65 f.close() 66 67 return pixel 68 69 70 71if __name__ == '__main__': 72 73 mnist = MNIST( pathMNIST = './mnist' ) 74 75 print( '# MNIST training data' ) 76 dat = mnist.getImage( 'L' ) 77 lab = mnist.getLabel( 'L' ) 78 print( dat.shape, dat.dtype, lab.shape ) 79 print(lab.index("0")) 80 81 print( '# MNIST test data' ) 82 dat = mnist.getImage( 'T' ) 83 lab = mnist.getLabel( 'T' ) 84 print( dat.shape, dat.dtype, lab.shape )
エラー箇所
これで実行すると「0」の画像が100枚(縦10、横10)表示にできました。
しかし、このままでは0のみになります。どうすれば全ての数字を10枚ずつ表示できますか?
回答1件
あなたの回答
tips
プレビュー