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

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

ただいまの
回答率

88.10%

pytorchでのDataset作成方法

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 592

score 19

pytorchのtorch.utils.data.Datasetを用いて自作でデータセットを作ろうとしたのですが,エラーが発生してしまいます.
自分なりに調べたのですが解決できないため詳しい方いらっしゃいましたら教えていただけましたら幸いです.
以下私のコードです.

class DataSets(torch.utils.data.Dataset):
    def __init__(self,imgdir,lbldir,tfms):

        self.imgdir = imgdir
        self.lbldir = lbldir
        self.tfms = tfms

        self.tr = []
        self.lbl = []
        self.lb = pd.read_csv(self.lbldir+'/train.csv')
        for i in range(1821):
            self.tr_path = glob.glob((os.path.join(self.imgdir,f'Train_{i}.jpg')))
            self.tr.append(tr_path)

            self.lb = self.lb.iloc[:,1:]
            self.lbl.append(self.lb.iloc[i,:])


    def __len__(self):
        return len(self.tr)

    def __getitem__(self,idx):
        img = np.array(Image.open(self.tr[idx]))
        lbl = self.lbl[idx]

        if self.tfms:
            img = self.tfms(img)

        return img, lbl

そして,transformを定義後にこのようにしてDataloaderを作成しました.

bs = 8
ds = DataSets(imgdir, lbldir, tfms)
dl = torch.utils.data.DataLoader(ds, bs, shuffle=True)

ここまでは問題なく進行するのですが,確認のため以下のコードを入力するとエラーが生じます.

for i in dl:
    print(i)
--------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
/opt/conda/lib/python3.6/site-packages/PIL/Image.py in open(fp, mode)
   2637     try:
-> 2638         fp.seek(0)
   2639     except (AttributeError, io.UnsupportedOperation):

AttributeError: 'list' object has no attribute 'seek'

During handling of the above exception, another exception occurred:

AttributeError                            Traceback (most recent call last)
<ipython-input-91-26c3503426c8> in <module>
----> 1 for i in dl:
      2     print(i)

/opt/conda/lib/python3.6/site-packages/torch/utils/data/dataloader.py in __next__(self)
    343 
    344     def __next__(self):
--> 345         data = self._next_data()
    346         self._num_yielded += 1
    347         if self._dataset_kind == _DatasetKind.Iterable and \

/opt/conda/lib/python3.6/site-packages/torch/utils/data/dataloader.py in _next_data(self)
    383     def _next_data(self):
    384         index = self._next_index()  # may raise StopIteration
--> 385         data = self._dataset_fetcher.fetch(index)  # may raise StopIteration
    386         if self._pin_memory:
    387             data = _utils.pin_memory.pin_memory(data)

/opt/conda/lib/python3.6/site-packages/torch/utils/data/_utils/fetch.py in fetch(self, possibly_batched_index)
     42     def fetch(self, possibly_batched_index):
     43         if self.auto_collation:
---> 44             data = [self.dataset[idx] for idx in possibly_batched_index]
     45         else:
     46             data = self.dataset[possibly_batched_index]

/opt/conda/lib/python3.6/site-packages/torch/utils/data/_utils/fetch.py in <listcomp>(.0)
     42     def fetch(self, possibly_batched_index):
     43         if self.auto_collation:
---> 44             data = [self.dataset[idx] for idx in possibly_batched_index]
     45         else:
     46             data = self.dataset[possibly_batched_index]

<ipython-input-84-1f993d703f19> in __getitem__(self, idx)
     23 
     24     def __getitem__(self,idx):
---> 25         img = np.array(Image.open(self.tr[idx]))
     26         lbl = self.lbl[idx]
     27 

/opt/conda/lib/python3.6/site-packages/PIL/Image.py in open(fp, mode)
   2638         fp.seek(0)
   2639     except (AttributeError, io.UnsupportedOperation):
-> 2640         fp = io.BytesIO(fp.read())
   2641         exclusive_fp = True
   2642 

AttributeError: 'list' object has no attribute 'read'


解決方法教えていただけましたら幸いです.
よろしくお願い致します.

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

globの戻り値ってリストですよね?ファイル名のリストをappedして二重のリストにしてるように見えます。

なので↓じゃダメですかね?
self.tr_path = os.path.join(self.imgdir,f'Train_{i}.jpg')
self.tr.append(tr_path)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/27 10:24

    仰る通り,二重リストになっていたことが原因でした.
    回答ありがとうございました.

    キャンセル

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

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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