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

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

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

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

解決済

pytorch.datasets/dataloader生成のデータを調べるときにエラー

sigefuji
sigefuji

総合スコア114

Python 3.x

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

2回答

0リアクション

0クリップ

377閲覧

投稿2022/08/27 03:31

前提

参考書籍のpytorchのサンプルコードでDataloaderが生成したtensorデータの先頭のイメージを調べています。
pytorchの公式サイトから、参考になる個所を抜き出し下記のコードを作りました。
エラーの行で
TypeError: default_collate: batch must contain tensors, numpy arrays, numbers, dicts or lists; found <class 'PIL.Image.Image'>
となります。
調査用のこの数行が無い場合は、それなりに全epoch分実行されます(エラーとはならない)
#先頭イメージのデータを見るとした行は正しいイメージデータがプリントされます(8行目の狙った1行のみ)
なおFashionMNISTとありますが、自前のデータを、本来の場所に安直に上書きしたものです。(自前のdetaloader作成手引きもあるようですが今後の課題です)
エラー型の不一致のようですが、原因がわかりません。

別な質問ですが、datasetsやDataLoaderが生成するデータはpytorch用のtensorなる形式だそうですが、
numpyのようなshapeが使えませんが、それらに相当するメッソドなりの公式サイトがみつけらえませんでした。
以下の__len__などは断片的なサイトを参考にしましたので、datasetsクラス(?)のメソッド(?)の説明ページもわかりません。(どんなのがあるか?)

補足
エラーのあるnext(iter(train_dataloader))
の意味は、ここでは生成したデータの先頭のイメージを1個取り出すことと理解しています。

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

TypeError: default_collate: batch must contain tensors, numpy arrays, numbers, dicts or lists; found <class 'PIL.Image.Image'>

f_mnist_train = datasets.FashionMNIST(
root=root, # データの保存先のディレクトリ
download=False, # ダウンロードを許可
train=True) # 訓練データを指定
#transform=transform) # トランスフォーマーオブジェクトを指定

print("train dataset",f_mnist_train.data[0,8])     #先頭イメージのデータを見る
len= f_mnist_train.len()
print("len",len)

train_dataloader = DataLoader(f_mnist_train, # 訓練データ
batch_size=batch_size, # ミニバッチのサイズ
shuffle=True) # シャッフルして抽出

train_features, train_labels = next(iter(train_dataloader))   #エラー
print(f"Feature batch shape: {train_features.size()}")
print(f"Labels batch shape: {train_labels.size()}")
img = f_mnist_train[0].squeeze()
label = train_labels[0]
plt.imshow(img, cmap="mono")
plt.show()

sys.exit()
以下略

python38 pytorch

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。
すべてのトレースバック
Traceback (most recent call last):

File "C:\Users\qhtsi\anaconda3\envs\py38pytorch2\lib\site-packages\spyder_kernels\py3compat.py", line 356, in compat_exec
exec(code, globals, locals)

File "c:\book\shuwa\chap06\sec03\fashion-mnist_cnn_pytorch.py", line 62, in <module>
train_features, train_labels = next(iter(train_dataloader)) エラー行

File "C:\Users\xxx\anaconda3\envs\py38pytorch2\lib\site-packages\torch\utils\data\dataloader.py", line 681, in next
data = self._next_data()

File "C:\Users\xxx\anaconda3\envs\py38pytorch2\lib\site-packages\torch\utils\data\dataloader.py", line 721, in _next_data
data = self._dataset_fetcher.fetch(index) # may raise StopIteration

File "C:\Users\xxx\anaconda3\envs\py38pytorch2\lib\site-packages\torch\utils\data_utils\fetch.py", line 52, in fetch
return self.collate_fn(data)

File "C:\Users\xxx\anaconda3\envs\py38pytorch2\lib\site-packages\torch\utils\data_utils\collate.py", line 175, in default_collate
return [default_collate(samples) for samples in transposed] # Backwards compatibility.

File "C:\Users\xxx\anaconda3\envs\py38pytorch2\lib\site-packages\torch\utils\data_utils\collate.py", line 175, in <listcomp>
return [default_collate(samples) for samples in transposed] # Backwards compatibility.

File "C:\Users\xxx\anaconda3\envs\py38pytorch2\lib\site-packages\torch\utils\data_utils\collate.py", line 183, in default_collate
raise TypeError(default_collate_err_msg_format.format(elem_type))

TypeError: default_collate: batch must contain tensors, numpy arrays, numbers, dicts or lists; found <class 'PIL.Image.Image'>

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

jbpb0

2022/08/27 23:44

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください または、 https://teratail.storage.googleapis.com/uploads/contributed_images/56957fe805d9d7befa7dba6a98676d2b.gif を見て、そのようにしてみてください 現状、コードがとても読み辛いです 質問にコードを載せる際に上記をやってくれたら、他人がコードを読みやすくなり、コードの実行による現象確認もやりやすくなるので、回答されやすくなります
sigefuji

2022/08/29 11:49

ご返事ありがとうございます。またお礼が遅れてすみません。回答でないコメントの場合もあったのですね。見逃していました。 """python の件意味がわかりました。そのようにします。今環境が壊れて修復中です。 datasets.FashionMNIST( の引数にインデントが無く見ずらいですね。注意します。 ご紹介のshape相当の機能ありがとうございます。このサイトは割と細かく整理されていて良いと思います。今までも参考にしていました。 sizeなどで対比してみます(それにしてもnumpyとtensorがあるのは、初学者泣かせですね) なおリスト最後のpltはpytorchには対応していないと思います(まだそこまだ進んでいない)
jbpb0

2022/08/30 03:39

"""python ではなく ```python です 文字が違うと意味無いので、キーボードで入力するのではなく、私のコメントからコピペしてください おそらく現状の質問は、 TypeError: default_collate: batch must contain tensors, numpy arrays, numbers, dicts or lists; found <class 'PIL.Image.Image'> と python38 pytorch が、上下が「```」で挟まれてると思います 質問のコードも上記と同様に、上下を「```」で挟んでください そうすれば、コードのインデントが消えずに表示されるので、他人がコードを正確に把握できます (「```」の後の「python」は、付けても付けなくても、どちらでもいいです)
sigefuji

2022/08/30 03:48

わかりました。ご指摘ありがとうございます。
sigefuji

2022/08/30 05:45

環境が変わってしまったためか、現象が再現しなくなってしまいました、(別のエラーがでる) 再現しなくて申し訳ありませんが、本質問はとりあえず保留とさせていただきます。
jbpb0

2022/08/31 11:53 編集

> なおFashionMNISTとありますが、自前のデータを、本来の場所に安直に上書きしたものです。 「自前のデータ」というものがどんなものか不明なので、 https://www.think-self.com/machine-learning/pytorch-nn/#i の「データセットの読み込み」のコードを全部そのまま実行してから、 train_features, train_labels = next(iter(train_dataloader)) を実行しましたが、エラーにはなりませんでした 上記の実行で取得したデータを下記のようにして確認しましたが、問題無いようです print(type(train_features)) #<class 'torch.Tensor'> print(train_features.size()) #torch.Size([64, 784]) print(type(train_labels)) #<class 'torch.Tensor'> print(train_labels.size()) #torch.Size([64]) 「Fashion-MNIST」では大丈夫でしたが、「自前のデータ」だとエラーになるのでしたら、「自前のデータ」の作り方が間違ってるのだと思います
sigefuji

2022/09/01 06:13

試していただきありがとうございます。 参考書籍は将にそのとおりです。検索スキルに感心です。 この本はtensorflow、tensorflow+keras、pytorchについて、色んなレベルのモデルを実装しているのです。それで、それら全部を自前のデータで検証しています。 データはすべてmnistに準拠しているので、自前のデータも共通で済みます。 次の6.3章がエラーの出たモデル。次の6.6章は同じデータで正常に実行されます。 色々調べたところ、本来のmnistのデータではいずれも正常に実行され、6.3章のモデルが自前のデータでエラーの出ることがわかりました・ 結論的には、当初のエラーの予想とはことなり、問題は複雑そうなので、この質問は終了とさせていただきます。 ちなみに、6.3章はpytorchによるCNNモデル、6.6章はプーリングありモデルとなります。 以下長文です。 6.3章 ``` ''' 1. データの読み込みと前処理 ''' import os import sys import torchvision.transforms as transforms from torch.utils.data import DataLoader from torchvision import datasets x_sz=30 # 自前データのサイズ y_sz=30 p_out=15 # ミニバッチのサイズ batch_size = 64 # ダウンロード先のディレクトリ root = './data' # トランスフォーマーオブジェクトを生成 transform = transforms.Compose( [transforms.ToTensor(), # Tensorオブジェクトに変換 #transforms.Normalize((0.5), (0.5)) # 平均0.5、標準偏差0.5で正規化 ]) # 訓練用データの読み込み(60000セット) f_mnist_train = datasets.FashionMNIST( root=root, # データの保存先のディレクトリ download=True, # ダウンロードを許可 train=True) # 訓練データを指定 #transform=transform) # トランスフォーマーオブジェクトを指定 # テスト用データの読み込み(10000セット) f_mnist_test = datasets.FashionMNIST( root=root, # データの保存先のディレクトリ download=True, # ダウンロードを許可 train=False) # テストデータを指定 #transform=transform) # トランスフォーマーオブジェクトを指定 # 訓練用のデータローダー train_dataloader = DataLoader(f_mnist_train, # 訓練データ batch_size=batch_size, # ミニバッチのサイズ shuffle=True) # シャッフルして抽出 # テスト用のデータローダー test_dataloader = DataLoader(f_mnist_test, # テストデータ batch_size=1, # ミニバッチのサイズ shuffle=False) # シャッフル無しに抽出 train_features, train_labels = next(iter(train_dataloader)) ``` #6.6章 同様の処理でモデルの構造が異なる ``` ''' 1. データの読み込みと前処理 ''' import os from torchvision import datasets import torchvision.transforms as transforms from torch.utils.data import DataLoader # ダウンロード先のディレクトリ root = './data' ysz=30 xsz = 30 p_out = 15 img_sz = ysz*xsz # トランスフォーマーオブジェクトを生成 transform = transforms.Compose( [transforms.ToTensor(), # Tensorオブジェクトに変換 #transforms.Normalize((0.5), (0.5)) # 平均0.5、標準偏差0.5で正規化 ]) # 訓練用データの読み込み(60000セット) f_mnist_train = datasets.FashionMNIST( root=root, # データの保存先のディレクトリ download=True, # ダウンロードを許可 train=True, # 訓練データを指定 transform=transform) # トランスフォーマーオブジェクトを指定 # テスト用データの読み込み(10000セット) f_mnist_test = datasets.FashionMNIST( root=root, # データの保存先のディレクトリ download=True, # ダウンロードを許可 train=False, # テストデータを指定 transform=transform) # トランスフォーマーオブジェクトを指定 # ミニバッチのサイズ batch_size = 64 # 訓練用のデータローダー train_dataloader = DataLoader(f_mnist_train, # 訓練データ batch_size=batch_size, # ミニバッチのサイズ shuffle=True) # シャッフルして抽出 # テスト用のデータローダー test_dataloader = DataLoader(f_mnist_test, # テストデータ batch_size=batch_size, # ミニバッチのサイズ shuffle=False) # シャッフルして抽出 print(type(train_features))   #train_featureという名前はこのソースにはないです。train_dataloaderのことですか? #<class 'torch.Tensor'> print(train_features.size()) #torch.Size([64, 784]) print(type(train_labels)) #<class 'torch.Tensor'> print(train_labels.size()) #torch.Size([64]) train_features, train_labels = next(iter(train_dataloader)) #この場合はエラーとならない ``` アドバイスの情報を参考に実際にエラーの起きる場所をしらべたところ、当初の上記場所ではなく、 for (x, t) in train_dataloader: の処でエラーが発生していました(当初のエラーメッセージ)。sys.exit()を順番に挿入して確認しました。最初の#ngのところ。 ``` ''' 8.モデルを使用して学習する ''' from sklearn.metrics import accuracy_score # エポック数 epochs = 30 #100 # 損失と精度の履歴を保存するためのdictオブジェクト history = {'loss':[],'accuracy':[], 'test_loss':[], 'test_accuracy':[]} # 早期終了の判定を行うオブジェクトを生成 #ers = EarlyStopping(patience=5, # 監視対象回数 # verbose=1) # 早期終了時にメッセージを出力 # 学習を行う for epoch in range(epochs): train_loss = 0. # 訓練1エポックあたりの損失を保持する変数 train_acc = 0. # 訓練1エポックごとの精度を保持する変数 test_loss = 0. # 評価1エポックごとの損失を保持する変数 test_acc = 0. # 評価1エポックごとの精度を保持する変数 # 1ステップにおける訓練用ミニバッチを使用した学習 #print("p_out",p_out) step=0; sumpr=[0 for i in range(p_out)] sumeq=[0 for i in range(p_out)] #print("dataloader",train_dataloader.__len__(),"batch_size",batch_size) #ok sys.exit() for (x, t) in train_dataloader: #ng # torch.Tensorオブジェクトにデバイスを割り当てる #ng x, t = x.to(device), t.to(device) #ng ``` 結論的には、同じ自前のデータでも、モデルによって異なり”そう”に見えますので、当初のエラー予想とは異なり、 何か別の原因がありそうにおもいます。より複雑なモデルで問題ないので、とりあえずこの問題は別な課題として、本質問は終了とさせていただきたく思います。
sigefuji

2022/09/01 12:21

参考にされたモデルは5.7章のようで、これを自前データで実行してもエラーは生じず完走します。 ちなみに自前データはイメージサイズ(30,30)、サンプル数(14万強)でピクセルの値は0/1でほとんどが0データとなっています。
jbpb0

2022/09/02 00:45

> 参考にされたモデルは5.7章のようで、これを自前データで実行してもエラーは生じず完走します。 > 次の6.3章がエラーの出たモデル。 https://www.think-self.com/machine-learning/pytorch-cnn/#i の「データセットの読み込み」のコードを全部そのまま実行してから、 train_features, train_labels = next(iter(train_dataloader)) を実行しましたが、エラーにはなりませんでした 上記の実行で取得したデータを下記のようにして確認しましたが、問題無いようです print(type(train_features)) #<class 'torch.Tensor'> print(train_features.size()) #torch.Size([64, 1, 28, 28]) print(type(train_labels)) #<class 'torch.Tensor'> print(train_labels.size()) #torch.Size([64]) 書籍6.3のコードでも、「Fashion-MNIST」では大丈夫でした > なおFashionMNISTとありますが、自前のデータを、本来の場所に安直に上書きしたものです。 「自前のデータ」だとエラーになるのでしたら、「自前のデータ」の作り方が間違ってるのだと思います
sigefuji

2022/09/02 07:52

そうではないと思います。 自前のデータの内容とモデルのコードとの(わかりやすく言えば)相性、(またはモデルの定義の問題)だと思います。 当然正規データではOKを確認しています。 この可能性はお考えになれませんか? 自前のデータで他のモデルがOKなのはなぜですか。自前のデータはモデルごとに共通です。 (自前のデータの形式に誤りがあれば、完走しません。サイズエラーになる。)
jbpb0

2022/09/02 08:16

その書籍のコードは「Fashion-MNIST」のために書かれたものです そのコードを流用して別のデータに使用するのなら、「Fashion-MNIST」に完全互換なデータを作らなくてはいけません 別のデータではエラーが出るのなら、そのデータと「Fashion-MNIST」には何か互換性に欠けている部分があるので、そこを直さなくてはいけません 互換性に欠けてる部分は、データのshapeでは無いかもしれません 私が「データの作り方が間違ってる」と書いてるのは、データのshapeが異なることだけを指してるのではありません 何かは分からないけど何か互換性に欠ける部分があるので、それが無くなるようにデータを作り直さないといけない、という意味です
jbpb0

2022/09/02 08:30

「Fashion-MNIST」のような一般的では無い特殊なファイル形式のデータを自分で作って、互換性で悩む、なんてことをするよりは、普通の画像ファイルを使ってpytorchで学習・推論するサンプルコードはいくらでも転がってるので、そういうのから画像ファイルをDataLoader()で読み込んでデータ化するところを流用したらいいと思うのですが
sigefuji

2022/09/04 00:58

 特に互換性で悩んでいるわけではありませんが、そのようなサンプルコードも参考にしてみます。 今はデータローダ周りを検討しています。conv1dはministは使えないので。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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