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

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

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

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

Q&A

解決済

1回答

803閲覧

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

sigefuji

総合スコア125

Python 3.x

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

0グッド

0クリップ

投稿2022/08/31 06:32

質問の内容

参考書籍のコード(pytorch)で自前のデータの動作を調べています。
先の質問での環境を再構築して、現象が再現できましたので、再度補足して質問します。

調べている直近の課題
train_features, train_labels = next(iter(train_dataloader))

により、dataloaderで生成されたデータの内、先頭のデータ(一個の画像データ)の内容を調べること。
それで、上記命令のように、先頭の1個のデータを取り出し、featuerとlabelの内容をprintしようとした。

この位置で検出されたエラーメッセージ

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

このエラーを出力したcollate.pyのソースも補足で提示。しかしこの部分を理解するまでもなく恐らく、
next(iter(train_dataloader))の個所が何かおかしいと予想されます。

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

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

該当のソースコード

python

1# トランスフォーマーオブジェクトを生成 2transform = transforms.Compose( 3 [transforms.ToTensor(), # Tensorオブジェクトに変換 4 #transforms.Normalize((0.5), (0.5)) # 平均0.5、標準偏差0.5で正規化 5 ]) 6 7# 訓練用データの読み込み(60000セット) 8f_mnist_train = datasets.FashionMNIST( 9 root=root, # データの保存先のディレクトリ 10 download=False, # ダウンロードを許可 11 train=True) # 訓練データを指定 12 #transform=transform) # トランスフォーマーオブジェクトを指定 13 14# Display image and label. 15#print("size",f_mnist_train.size()) 16print("train dataset",f_mnist_train.data[0,8]) 17#print("train dataset",f_mnist_train.label[0]) 18len= f_mnist_train.__len__() 19print("len",len) 20# テスト用データの読み込み(10000セット) 21f_mnist_test = datasets.FashionMNIST( 22 root=root, # データの保存先のディレクトリ 23 download=False, # ダウンロードを許可 24 train=False) # テストデータを指定 25 #transform=transform) # トランスフォーマーオブジェクトを指定 26#print("test.len",f_mnist_test.size()) 27# 訓練用のデータローダー 28train_dataloader = DataLoader(f_mnist_train, # 訓練データ 29 batch_size=batch_size, # ミニバッチのサイズ 30 shuffle=True) # シャッフルして抽出 31# テスト用のデータローダー 32test_dataloader = DataLoader(f_mnist_test, # テストデータ 33 batch_size=1, # ミニバッチのサイズ 34 shuffle=False) # シャッフル無しに抽出 35#ここまではオリジナルのソース 36 37#以下が調査用に追加した部分 38 39train_features, train_labels = next(iter(train_dataloader)) 40 41print("size", train_features.size()) 42sys.exit() 43 44#以下は色々調べてみようとした形跡(参考まで) 45 46print(f"Feature batch shape: {train_features.size()}") 47print(f"Labels batch shape: {train_labels.size()}") 48#img = f_mnist_train[0].squeeze() 49#label = train_labels[0] 50#plt.imshow(img, cmap="mono") 51#plt.show() 52#print(f"Label: {label}") 53 54sys.exit() 55print("train_dataloader",train_dataloader[0]) 56print("train.len",train_dataloader.__len__(),train_dataloader.__size__()) 57print("test.len",train_dataloader.__len__()) 58#print("f_mnist_train.shape",f_mnist_train.shape[0],"test.shape",f_mnist_test.shape)[0]; 59#print("train_dataloader",type(train_dataloader)) 60#print("test_dataloader",test_dataloader).dim() 61# データローダーが返すミニバッチの先頭データの形状を出力 62for (x, t) in train_dataloader: # 訓練データ 63 print(x.shape) 64 print(t.shape) 65 break 66 67for (x, t) in test_dataloader: # テストデータ 68 #print(x.shape) 69 #print(t.shape) 70 print(type(t)) 71 print(type(t)) 72 break

補足情報

最後にエラー検出した関数(collate.py)のリスト

r""""Contains definitions of the methods used by the _BaseDataLoaderIter workers to collate samples fetched from dataset into Tensor(s). These **needs** to be in global scope since Py2 doesn't support serializing static methods. `default_collate` and `default_convert` are exposed to users via 'dataloader.py'. """ import torch import re import collections from torch._six import string_classes np_str_obj_array_pattern = re.compile(r'[SaUO]') def default_convert(data): r""" Function that converts each NumPy array element into a :class:`torch.Tensor`. If the input is a `Sequence`, `Collection`, or `Mapping`, it tries to convert each element inside to a :class:`torch.Tensor`. If the input is not an NumPy array, it is left unchanged. This is used as the default function for collation when both `batch_sampler` and `batch_size` are NOT defined in :class:`~torch.utils.data.DataLoader`. The general input type to output type mapping is similar to that of :func:`~torch.utils.data.default_collate`. See the description there for more details. Args: data: a single data point to be converted Examples: >>> # Example with `int` >>> default_convert(0) 0 >>> # Example with NumPy array >>> default_convert(np.array([0, 1])) tensor([0, 1]) >>> # Example with NamedTuple >>> Point = namedtuple('Point', ['x', 'y']) >>> default_convert(Point(0, 0)) Point(x=0, y=0) >>> default_convert(Point(np.array(0), np.array(0))) Point(x=tensor(0), y=tensor(0)) >>> # Example with List >>> default_convert([np.array([0, 1]), np.array([2, 3])]) [tensor([0, 1]), tensor([2, 3])] """ elem_type = type(data) if isinstance(data, torch.Tensor): return data elif elem_type.__module__ == 'numpy' and elem_type.__name__ != 'str_' \ and elem_type.__name__ != 'string_': # array of string classes and object if elem_type.__name__ == 'ndarray' \ and np_str_obj_array_pattern.search(data.dtype.str) is not None: return data return torch.as_tensor(data) elif isinstance(data, collections.abc.Mapping): try: return elem_type({key: default_convert(data[key]) for key in data}) except TypeError: # The mapping type may not support `__init__(iterable)`. return {key: default_convert(data[key]) for key in data} elif isinstance(data, tuple) and hasattr(data, '_fields'): # namedtuple return elem_type(*(default_convert(d) for d in data)) elif isinstance(data, tuple): return [default_convert(d) for d in data] # Backwards compatibility. elif isinstance(data, collections.abc.Sequence) and not isinstance(data, string_classes): try: return elem_type([default_convert(d) for d in data]) except TypeError: # The sequence type may not support `__init__(iterable)` (e.g., `range`). return [default_convert(d) for d in data] else: return data default_collate_err_msg_format = ( "default_collate: batch must contain tensors, numpy arrays, numbers, " "dicts or lists; found {}") def default_collate(batch): 本文が長くなるので省略

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

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

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

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

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

sigefuji

2022/08/31 11:13

仰せの事ですが、元の投稿を編集する(どうするのかわからないので単に追加するだけになると)、かえって煩雑になると考えます。もし思うとおりに編集できたとしても、それは新規投稿と何ら変わらないと考えます。
guest

回答1

0

自己解決

元の投稿で終了しましたので、この再提示の投稿も終了します。

投稿2022/09/03 08:19

sigefuji

総合スコア125

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問