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

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

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

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

Q&A

解決済

2回答

509閲覧

pytorch/Dataloaderを使う

sigefuji

総合スコア125

Python 3.x

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

0グッド

0クリップ

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

1import os,sys 2from torchvision import datasets 3import torchvision.transforms as transforms 4from torch.utils.data import DataLoader 5import numpy as np 6import torch.utils.data 7 8#分析データの tensorデータを生成 9 10file_path = "test_img1.byte" 11rec_size = 64 12with open(file_path, 'rb') as f: 13 data = np.frombuffer(f.read(), np.int16, offset=0) 14x = data.reshape(-1, rec_size) 15print("x.shape", x.shape) 16 17file_path = "test_lbl1.byte" 18rec_size = 1 19with open(file_path, 'rb') as f: 20 data = np.frombuffer(f.read(), np.int8, offset=0) 21t = data.reshape(-1, rec_size) 22print("t.shape", t.shape) 23 24x = torch.tensor(x, dtype=torch.int16) 25t = torch.tensor(t, dtype=torch.int8) 26print("torch x.shape",x.shape) 27print("torch t.shape",t.shape) 28dataset = torch.utils.data.TensorDataset(x, t) 29 30# 1つ目のデータを確認 31print('入力データ:', dataset[0][0],dataset[1][0]) 32print('教師データ:', dataset[0][1],dataset[1][1]) 33 34 35batch_size = 64 36 37#tensorデータ x をDataloaderに与え、train_loaderオブジェクト(iterator)を得る 38train_loader = DataLoader(x, # 訓練データ 39 batch_size=batch_size, # ミニバッチのサイズ 40 shuffle=True) # シャッフルして抽出 41print(train_loader) 42#print("shape",train_loader.shape) #shapeがないとのエラー 43#print("size",train_loader.size()) 44 45train_features, train_labels = next(iter(train_loader)) # 最初のバッチデータを取得 46 47print(type(train_features)) 48#<class 'torch.Tensor'> 49print(train_features.size()) 50#torch.Size([64, 784]) 51 52print(type(train_labels)) 53#<class 'torch.Tensor'> 54print(train_labels.size()) 55#torch.Size([64]) 56 57# train_loaderを次のように使用 58for (x, t) in train_loader: 59 loss, preds= train_step(x, t) # 損失と予測値を取得 conv1dを使用 60 preds_max = preds.argmax(dim=-1).tolist() 61 62 # torch.Tensorオブジェクトにデバイスを割り当てる 63 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'

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

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

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

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

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

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なら、自動微分の適用でかなり容易にできそうな感じなので、この際挑戦しようと書籍を入手して試しているわけです。 それから、このサイトでの評価の手順を探したのですがわからずです。
guest

回答2

0

ベストアンサー

train_loader = DataLoader(x, # 訓練データ

だと、「x」だけで「t」を使ってないので、

train_loaderはデータtensorとラベルtensorの2種類ではないのでしょうか?

はデータのみです

 

python

1train_loader = DataLoader(x, # 訓練データ

↓ 変更

python

1train_loader = DataLoader(dataset, # 訓練データ

とすれば、ラベルも入ります

投稿2022/09/09 15:57

jbpb0

総合スコア7651

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

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

0

ベストアンサーを選べるようにするのも手間がかかるのですね。ありがとうございました。

投稿2022/09/09 23:58

sigefuji

総合スコア125

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問