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

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

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

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

Q&A

解決済

2回答

1687閲覧

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

sigefuji

総合スコア125

Python 3.x

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

0グッド

0クリップ

投稿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'>

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

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

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

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

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

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は使えないので。
guest

回答2

0

自己解決

自前のデータは私の目的の現象をNNで適用できるかを調べるためのもので、その目的は一部のモデルでエラーがでましたが、より複雑なモデルで、使えることがわかったことと、そのエラーを分析することはかなり困難である見通しですので、この質問は自己解決で終了とします。

投稿2022/09/03 08:15

編集2022/09/03 08:26
sigefuji

総合スコア125

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

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

0

train_features, train_labels = next(iter(train_dataloader))   #エラー

エラーの行で
TypeError: default_collate: batch must contain tensors, numpy arrays, numbers, dicts or lists; found <class 'PIL.Image.Image'>
となります。

なおFashionMNISTとありますが、自前のデータを、本来の場所に安直に上書きしたものです。

「自前のデータ」というものがどんなものか不明なので、
【PyTorch】ニューラルネットワークを構築する方法【NN】
の「データセットの読み込み」のコードを全部そのまま実行してから、

python

1train_features, train_labels = next(iter(train_dataloader))

を実行しましたが、エラーにはなりませんでした

【PyTorch】畳込みニューラルネットワークを構築する方法【CNN】
の「データセットの読み込み」のコードを全部そのまま実行した場合でも、同様にエラーにはなりませんでした

「Fashion-MNIST」では大丈夫でしたが、「自前のデータ」だとエラーになるのでしたら、「自前のデータ」の作り方が間違ってるのだと思います

投稿2022/09/01 07:27

編集2022/09/02 00:55
jbpb0

総合スコア7651

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

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

sigefuji

2022/09/01 23:03

結論的には、同じ自前のデータでも、モデルによって異なり”そう”に見えますので、当初のエラー予想とは異なり、 何か別の原因がありそうにおもいます。より複雑なモデルで問題ないので、とりあえずこの問題は別な課題として、本質問は終了とさせていただきたく思います。今後何か状況が明らかになれば報告もやぶさかではありません。 親切なフォローありがとうございました。
jbpb0

2022/09/02 01:03

質問には > train_features, train_labels = next(iter(train_dataloader))   #エラー > エラーの行で > TypeError: default_collate: batch must contain tensors, numpy arrays, numbers, dicts or lists; found <class 'PIL.Image.Image'> > となります。 と書かれてて、私は正規のデータ(Fashion-MNIST)の場合はその行ではエラーにならないと回答してます その回答で、何か不足があるのでしょうか? ・「自前のデータ」だとエラーになると質問に書いてある ・正規のデータ(Fashion-MNIST)では同じコードでエラーにならない ことから、エラーの原因は「自前のデータ」にあると考えるのが妥当だと思います
sigefuji

2022/09/02 05:53

おっしゃることはその通りですが、再度調べたところその個所でエラーは正しくなかったようです。 そのこととは別に、正規のデータでエラーにならなかったからと言って、自前のデータがエラーの原因であるとは限らないと思います。 なぜなら、同じ自前のデータで他のpytorchの複数のモデルでエラーにならない場合があることから、エラーとなるモデルでは自前のデータの場合に発生する何かの問題の存在が考えられるからです。 その問題は、自前のデータの場合に顕在化するモデルのコードに内在する問題であることが考えられます。もっともそのモデルを定義している部分に何か問題があるかも知れません。 いずれにしても自前のデータ(内容でなく)の形式には問題が無いと考えてよいと思っています。 今の段階では、これらの問題をどう扱うかは当方がなすべき事項だと思っています。 繰り返しになりますが、私の質問に対して丁寧な検討を頂いたことは感謝します。
jbpb0

2022/09/02 07:09

> 再度調べたところその個所でエラーは正しくなかった 私は質問に書いてある内容に対して回答してます 質問に当初書いたことが間違ってることが後で分かったのなら、質問を編集してそのことを質問に追記してください あるいは、ご自身で別の回答を書いて、そこに、エラーが出てる行は当初質問に書いてた行とは別の行だったことが後で分かった、ということを書いて、その回答で「自己解決」にしてください
jbpb0

2022/09/02 07:16

> 正規のデータでエラーにならなかったからと言って、自前のデータがエラーの原因であるとは限らない エラーの原因が絶対に「自前のデータ」以外には無い、とは言いませんが、「自前のデータ」がエラーの原因である可能性がかなり高いと思います 同じコードで、エラーが出ないデータとエラーが出るデータがあるのなら、データに何か互換性が無い部分がある、と考えるのが自然です その「互換性が無い部分がある」ことを指して、私は「データの作り方が間違ってる」と書いてます
sigefuji

2022/09/03 08:14

自前のデータは私の目的の現象をNNで適用できるかを調べるためのもので、その目的は一部のモデルでエラーがでましたが、より複雑なモデルで、使えることがわかったことと、そのエラーを分析することは目的でもありませんので、この質問は自己解決で終了とします。 なお互換性のご指摘は見解の相違のようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問