質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

1回答

5074閲覧

Python,手書き数字データベースmnistから数字5の画像を取り出す,class,defを使う

wpx-vv1uZ

総合スコア23

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2019/06/03 09:16

編集2019/06/04 11:34

前提・実現したいこと

pythonの機械学習の勉強を始めようと思っているものです。
mnistの中から5の画像をリスト化して出力するコードを書こうとしています。
class,def,への理解がまだまだです。

どこがおかしいのでしょうか。
あまりにおかしすぎて修正できないレベルであれば考え直します。

発生している問題・エラーメッセージ

Traceback (most recent call last): File "mnist_def.py", line 23, in <module> mnist = Mnist('mnist_784', 'data', 'target') File "mnist_def.py", line 8, in __init__ self.mnist = fetch_openml('database_name', version = 1) #データベースを取得 File "/anaconda3/lib/python3.7/site-packages/sklearn/datasets/openml.py", line 563, in fetch_openml data_info = _get_data_info_by_name(name, version, data_home) File "/anaconda3/lib/python3.7/site-packages/sklearn/datasets/openml.py", line 333, in _get_data_info_by_name data_home) File "/anaconda3/lib/python3.7/site-packages/sklearn/datasets/openml.py", line 176, in _get_json_content_from_openml_api raise ValueError(error_message) ValueError: Dataset database_name with version 1 not found.

このようなエラーが出ていますが、ここ以外にもおかしな所が多数ある気がしています。

該当のソースコード

python

1from sklearn.datasets import fetch_openml 2import numpy as np 3from PIL import Image 4 5class Mnist: 6 #初期化メソッド 7 def __init__(self, database_name, data_label, target_label): 8 self.mnist = fetch_openml('database_name', version = 1,) #データベースを取得 9 self.picture = self.mnist[data_label] #画像データを取得 10 self.number = self.mnist[target_label]# ターゲット(数字)を取得 11 12#関数make_listは、引数(enum)として与えられた数値の画像データのリストを作成し、戻り値とする 13 def make_list(self, enum): 14 picture_list = list() 15 16 for i, num in enumerate(self.number): 17 n = int(num) #収納されている数字(文字列) 18 if n == enum: #emuで指定した数字と一緒なら 19 picture_list.append(self.picture[i]) #画像をリストに追加 20 21 return picture_list 22#クラスとその関数を使って、数値5の画像リストpicuture_listを作成する 23mnist = Mnist('mnist_784', 'data', 'target') 24picture = mnist.make_list(5) 25print(len(picture_list)) 26

試したこと

教材やネットを見ながら書いていたのですが、、、手詰まりになってきたので質問しました。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラーの原因

TypeError: object of type 'int' has no len()
型エラー: 型 int のオブジェクトは len() が定義されていません。

python

1picture_list = (5) 2print(len(picture_list))

picture_list = (5)picture_list = 5 と同じで、その結果、len(5) となっています。
整数を len() に渡すことはできないのでエラーとなっています。
おそらく、picture_list には数字5の画像がリストで入っているようにしたかったのだと思いますが、現状のコードはそのようになっていません。

MNIST データの指定した数字の画像を表示するコード

ステップ1)
コード内に MNIST データセットを取得する処理がどこにも見当たりません。fetch_openml でまず MNIST データセットを取得していください。

取得すると、画像を表す (70000, 784) の numpy 配列 X と各画像の数字を表す (70000,) の numpy 配列 y を返します。y の型は文字列なので注意していください。

ステップ2)
各画像の数字が5の画像を取得する場合、 target_imgs = X[y == '5'] とします。

ステップ3)
matplotlib で数字が5の画像の1枚を表示する。

python

1import matplotlib.pyplot as plt 2import numpy as np 3from sklearn.datasets import fetch_openml 4 5# ステップ1) MNIST データを取得する。(30秒ぐらいかかる) 6X, y = fetch_openml("mnist_784", version=1, return_X_y=True) 7print(X.shape, y.shape) # (70000, 784) (70000,) 8print(X.dtype, y.dtype) # float64 object 9# y の型は数値ではなく、文字列なので注意 10 11# 指定した数字の画像を取得する。 12target = '5' 13target_imgs = X[y == target] 14# 形状を変更する。 (サンプル数, 784) -> (サンプル数, 28, 28) 15target_imgs = target_imgs.reshape(len(target_imgs), 28, 28) 16print(target_imgs.shape) # (6313, 28, 28) 17 18# 1枚可視化してみる。 19plt.imshow(target_imgs[0], cmap='gray') 20plt.plot()

イメージ説明


コードの説明はだいぶ省略しているので、不明点があればコメントしてください。

追記

教材の穴埋めで上の様な感じになっているので、できるだけ形を崩さない形で解決できないでしょうか?

質問のコードをできるだけ変更しないで、「MNIST データセットから指定した数字の画像の一覧を取り出す」というタスクを実現するコードを以下に記載しました。

python

1from sklearn.datasets import fetch_openml 2 3 4class Mnist: 5 def __init__(self, database_name): 6 self.picture, self.number = fetch_openml( 7 "mnist_784", version=1, return_X_y=True 8 ) 9 10 def make_list(self, target): 11 """数字 target の画像の一覧を取得する。 12 """ 13 picture_list = [] 14 15 for img, label in zip(self.picture, self.number): 16 if label == target: # ラベルが target と同じ数字の場合 17 picture_list.append(img) 18 19 return picture_list 20 21 22mnist = Mnist("mnist_784") 23picture_list = mnist.make_list("5") 24print(len(picture_list)) # 6313

追記

上のやつが答えらしいのですが、自分のpcだとエラーが出ました。

以下の2点がおかしいです。
写し間違えではないでしょうか。

この2点を修正したところ、動作しました。

diff

1- self.mnist = fetch_openml("database_name", version=1) 2+ self.mnist = fetch_openml(database_name, version=1)

diff

1- picture = mnist.make_list(5) 2+ picture_list = mnist.make_list(5)

修正後のコード

python

1from sklearn.datasets import fetch_openml 2import numpy as np 3from PIL import Image 4 5 6class Mnist: 7 # 初期化メソッド 8 def __init__(self, database_name, data_label, target_label): 9 self.mnist = fetch_openml(database_name, version=1) # データベースを取得 10 self.picture = self.mnist[data_label] # 画像データを取得 11 self.number = self.mnist[target_label] # ターゲット(数字)を取得 12 13 # 関数make_listは、引数(enum)として与えられた数値の画像データのリストを作成し、戻り値とする 14 def make_list(self, enum): 15 picture_list = list() 16 17 for i, num in enumerate(self.number): 18 n = int(num) # 収納されている数字(文字列) 19 if n == enum: # emuで指定した数字と一緒なら 20 picture_list.append(self.picture[i]) # 画像をリストに追加 21 22 return picture_list 23 24 25# クラスとその関数を使って、数値5の画像リストpicuture_listを作成する 26mnist = Mnist("mnist_784", "data", "target") 27picture_list = mnist.make_list(5) 28print(len(picture_list))

投稿2019/06/03 09:51

編集2019/06/04 12:32
tiitoi

総合スコア21956

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

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

wpx-vv1uZ

2019/06/03 15:35

回答ありがとうございます。 わがままですみませんが、教材の穴埋めで上の様な感じになっているので、できるだけ形を崩さない形で解決できないでしょうか?
tiitoi

2019/06/03 15:57 編集

追記しました。 これでも「質問のコードから穴埋めの形に沿っていなくて困る」ということであれば、質問のコードからは問題に最初から記載があった部分と質問者さんがあとから追加した部分の区別がつかないため、元の問題を貼ってください。
wpx-vv1uZ

2019/06/04 11:57

回答ありがとうございます。 コードを書き換えました。 上のやつが答えらしいのですが、自分のpcだとエラーが出ました。 もし分かれば教えてくれると嬉しいです。
tiitoi

2019/06/04 12:33

おそらく写し間違えだと思いますが、追記した2点を修正したところ、動作しました。 6313 と表示されるはずです。
wpx-vv1uZ

2019/06/04 14:06

回答ありがとうございます。 6313と表示されました。 なんどもお答えいただき本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問