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

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

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

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

解決済

pytorch/Dataloaderを使う

sigefuji
sigefuji

総合スコア114

Python 3.x

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

2回答

0リアクション

0クリップ

174閲覧

投稿2022/09/05 08:45

編集2022/09/05 23:47

分析すべき一次元のデータをpytorchのconv1dで学習するため、ミニバッチデータを順次取り出すためのDataloader廻りの実装をしています。
基本的な手順としては
1.分析データ全体をファイルから読み、tensorデータx、ラベルtを生成
2.このtensorデータをバッチサイズで順次取り出すためにDataloaderによりオブジェクト(iterator)を取得する
3.このiteratorからバッチデータを順次取り出して学習する
を想定します(普通の考えと思います)。

いくつかの資料から下記のコードを作りました。

結果
・train_features, train_labels = next(iter(train_loader))の処で
ValueError: too many values to unpack (expected 2)のエラーが出ます。
この意味は右辺で出力するものに対して、受け側は2個までしかないとのことのようですが(多分)、
train_loaderはデータtensorとラベルtensorの2種類ではないのでしょうか?
・またコメントアウトした、#print("shape",train_loader.shape) ではshapeは無いとのエラーになります。

これらからDataloader が意図通り機能していないのかなとも思います。

何がどのように悪いのでしょうか。そしてどのように変えると良いでしょうか。

なお分析データに関してのエラーではありませんので分析データに関することは質問外とします。

その1.ValueError: too many values to unpack (expected 2) その2.AttributeError: 'DataLoader' object has no attribute 'shape'

該当のソースコード

phton

import os,sys from torchvision import datasets import torchvision.transforms as transforms from torch.utils.data import DataLoader import numpy as np import torch.utils.data #分析データの tensorデータを生成 file_path = "test_img1.byte" rec_size = 64 with open(file_path, 'rb') as f: data = np.frombuffer(f.read(), np.int16, offset=0) x = data.reshape(-1, rec_size) print("x.shape", x.shape) file_path = "test_lbl1.byte" rec_size = 1 with open(file_path, 'rb') as f: data = np.frombuffer(f.read(), np.int8, offset=0) t = data.reshape(-1, rec_size) print("t.shape", t.shape) x = torch.tensor(x, dtype=torch.int16) t = torch.tensor(t, dtype=torch.int8) print("torch x.shape",x.shape) print("torch t.shape",t.shape) dataset = torch.utils.data.TensorDataset(x, t) # 1つ目のデータを確認 print('入力データ:', dataset[0][0],dataset[1][0]) print('教師データ:', dataset[0][1],dataset[1][1]) batch_size = 64 #tensorデータ x をDataloaderに与え、train_loaderオブジェクト(iterator)を得る train_loader = DataLoader(x, # 訓練データ batch_size=batch_size, # ミニバッチのサイズ shuffle=True) # シャッフルして抽出 print(train_loader) #print("shape",train_loader.shape) #shapeがないとのエラー #print("size",train_loader.size()) train_features, train_labels = next(iter(train_loader)) # 最初のバッチデータを取得 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]) # train_loaderを次のように使用 for (x, t) in train_loader: loss, preds= train_step(x, t) # 損失と予測値を取得 conv1dを使用 preds_max = preds.argmax(dim=-1).tolist() # torch.Tensorオブジェクトにデバイスを割り当てる x, t = x.to(device), t.to(device)

コンソール出力

runFile('C:/book/data/test1.py', wdir='C:/book/data')
x.shape (14000, 64)
t.shape (14000, 1)
torch x.shape torch.Size([14000, 64])
torch t.shape torch.Size([14000, 1])
入力データ: tensor([ 0, 0, 0, 11, 32, 4, -15, 2, -1, -17, 0, -16, 0, -3,
7, 18, 6, -2, -3, -1, -4, -2, -8, 6, 11, 15, -17, 1,
-1, 8, -1, -2, -11, 0, 0, 1, 0, 0, 1, -2, 5, 0,
-6, 3, -1, -3, 6, 13, 19, -6, -7, -5, -1, 4, -3, -8,
-14, -3, -1, -8, -4, -2, -4, -3], dtype=torch.int16) tensor([ 0, 0, 0, 0, 11, 32, 4, -15, 2, -1, -17, 0, -16, 0,
-3, 7, 18, 6, -2, -3, -1, -4, -2, -8, 6, 11, 15, -17,
1, -1, 8, -1, -2, -11, 0, 0, 1, 0, 0, 1, -2, 5,
0, -6, 3, -1, -3, 6, 13, 19, -6, -7, -5, -1, 4, -3,
-8, -14, -3, -1, -8, -4, -2, -4], dtype=torch.int16)
教師データ: tensor([7], dtype=torch.int8) tensor([7], dtype=torch.int8)
<torch.utils.data.dataloader.DataLoader object at 0x0000027805FA6D60>
Traceback (most recent call last):

File "C:\book\fxdata\test1.py", line 49, in <module>
print("shape",train_loader.shape) #shapeがないとのエラー

AttributeError: 'DataLoader' object has no attribute 'shape'

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

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

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

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

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

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

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

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

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

jbpb0

2022/09/05 13:57

> train_loader = DataLoader(x, # 訓練データ だと、「x」だけで「t」を使ってないので、 > train_loaderはデータtensorとラベルtensorの2種類ではないのでしょうか? はデータのみです train_loader = DataLoader(x, # 訓練データ ↓ 変更 train_loader = DataLoader(dataset, # 訓練データ とすれば、ラベルも入ります
sigefuji

2022/09/05 23:41

ご返事ありがとうございます。 なるほど、そいうことなのですね。少なくともDataloader(x,...ではおかしい。 また、直後の print("shape",train_loader.shape)ではshapeは意味なく、その後の train_features, train_labels = next(iter(train_loader)) を通して初めて、dataとlabelが取り出されて print("train_feature type",type(train_features)) で、shapeが見えることもわかりました。 少し、dataloader周りの理解が進みました。
sigefuji

2022/09/06 13:00

なかなか興味深い記事のご紹介ありがとうございます。 ざっと読んでみましたが、今までnnや特に実装で気になっていることも目につきました。 じっくり読んで見たいと思います。 今までNN自体は自作C++で一番単純なモデルでは色々やっていたのですが、複雑なモデルではなかなか大変であることと、GPU適用も敷居が高いので、tensorflow+kerasやpytorchなら、自動微分の適用でかなり容易にできそうな感じなので、この際挑戦しようと書籍を入手して試しているわけです。 それから、このサイトでの評価の手順を探したのですがわからずです。

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

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

Python 3.x

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