🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2303閲覧

MNIST画像の表示について

takuya324232506

総合スコア7

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/12/17 01:42

編集2020/12/17 14:16

前提・実現したいこと

画像のようにMNISTデータを各クラスごとに1クラス10枚ずつ表示したいです。(画像はインターネットからコピーしています)
![MNIST画像

現時点で実装できているもの

現時点では、以下のソースコードのように学習用データの最初から縦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枚ずつ表示できますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

plasticgrammer

2020/12/17 08:27

回答には不足しているかもしれませんが、単純に実装すると以下のような流れでよいのではと思います。 1. とりあえずラベルを全部取得 lab = mn.getLabel('L') 2. 出力ラベルのループ(0~9) 3. ラベル全部に対するループ 出力ラベルと等しければ、それに対応するイメージデータを保持 10個みつかったらブレイク 4. 保持しているイメージデータ全てを出力
takuya324232506

2020/12/17 14:17

回答ありがとうございます。 この回答を基に修正しました。0だけの画像100枚が縦横10枚ずつになってしまいました。 修正箇所等あればお願いします!
plasticgrammer

2020/12/17 21:33

for count in range(10): これは不要では?
takuya324232506

2020/12/18 01:45

ありがとうございます。 あれから修正したらうまく画像表示ができました。
guest

回答1

0

自己解決

python

1count=0 2for i in range(0,10): 3 for j in range(len(dat)): 4 if i == lab[j]: 5 result.append(dat[j]) 6 count = count+1 7 if count != 0 and count == 15: 8 count = 0 9 break

このように書き換えたら実装できました。回答いただいたみなさんありがとうございました。

投稿2020/12/18 03:38

takuya324232506

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問