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

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

新規登録して質問してみよう
ただいま回答率
85.50%
深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

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

Q&A

解決済

1回答

3196閲覧

pytochによる画像分類のtupleエラーについて

nigo1973

総合スコア14

深層学習

深層学習は、多数のレイヤのニューラルネットワークによる機械学習手法。人工知能研究の一つでディープラーニングとも呼ばれています。コンピューター自体がデータの潜在的な特徴を汲み取り、効率的で的確な判断を実現することができます。

PyTorch

PyTorchは、オープンソースのPython向けの機械学習ライブラリ。Facebookの人工知能研究グループが開発を主導しています。強力なGPUサポートを備えたテンソル計算、テープベースの自動微分による柔軟なニューラルネットワークの記述が可能です。

Python 3.x

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

0グッド

0クリップ

投稿2020/07/09 12:51

編集2020/07/09 14:22

「つくりながら学ぶ!Pytorchによる発展ディープラーニング」(小川雄太郎著,マイナビ出版)でPytorchを学んでいます.

画像分類の転移学習(VGG)を,本にあるデータから自分で準備した画像にてモデルを動作させたところ,以下のエラーがでています.

準備したデータのラベルの形式は”torch.Size”となっていますが,モデルを回すとTupleに変わっています.

見本データのデータ形式を確認しましたが違いはなく,なぜtupleに変換されるのかわかりませんでした.

お教えいただけると助かります.
よろしくお願いします.

python

1# ミニバッチのサイズを指定 2batch_size = 32 3 4# DataLoaderを作成 5train_dataloader = torch.utils.data.DataLoader( 6 train_dataset, batch_size=batch_size, shuffle=True) 7 8val_dataloader = torch.utils.data.DataLoader( 9 val_dataset, batch_size=batch_size, shuffle=False) 10 11# 辞書型変数にまとめる 12dataloaders_dict = {"train": train_dataloader, "val": val_dataloader} 13 14print(type(dataloaders_dict)) 15print(dataloaders_dict["train"]) 16print(dataloaders_dict) 17# 動作確認 18batch_iterator = iter(dataloaders_dict["train"]) # イテレータに変換 19print(type(batch_iterator)) 20inputs, labels = next( 21 batch_iterator) # 1番目の要素を取り出す 22print(inputs.size()) 23print(labels) 24print(labels.size()) 25

出力

output

1<class 'dict'> 2<torch.utils.data.dataloader.DataLoader object at 0x7f4b035bf110> 3{'train': <torch.utils.data.dataloader.DataLoader object at 0x7f4b035bf110>, 'val': <torch.utils.data.dataloader.DataLoader object at 0x7f4b03974850>} 4<class 'torch.utils.data.dataloader._DataLoaderIter'> 5torch.Size([32, 3, 96, 96]) 6tensor([0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 7 1, 0, 0, 0, 0, 0, 1, 0]) 8torch.Size([32])

モデル

python

1def train_model(net, dataloaders_dict, criterion, optimizer, num_epochs): 2 3 # epochのループ 4 for epoch in range(num_epochs): 5 print('Epoch {}/{}'.format(epoch+1, num_epochs)) 6 print('-------------') 7 8 9 for phase in ['train', 'val']: 10 if phase == 'train': 11 net.train() 12 else: 13 net.eval() 14 15 epoch_loss = 0.0 16 epoch_corrects = 0 17 18 19 if (epoch == 0) and (phase == 'train'): 20 continue 21 22 for inputs, labels in dataloaders_dict[phase]: 23 print(type(inputs)) 24 print(type(labels)) 25 26 optimizer.zero_grad() 27 28 with torch.set_grad_enabled(phase == 'train'): 29 outputs = net(inputs) 30 print(outputs.size()) 31 print(labels.size()) 32 loss = criterion(outputs, labels) 33 _, preds = torch.max(outputs, 1) 34 35 36 37 if phase == 'train': 38 loss.backward() 39 optimizer.step() 40 41 42 epoch_loss += loss.item() * inputs.size(0) 43 44 epoch_corrects += torch.sum(preds == labels.data) 45 46 47 epoch_loss = epoch_loss / len(dataloaders_dict[phase].dataset) 48 epoch_acc = epoch_corrects.double( 49 ) / len(dataloaders_dict[phase].dataset) 50 51 print('{} Loss: {:.4f} Acc: {:.4f}'.format( 52 phase, epoch_loss, epoch_acc)) 53 54num_epochs=10 55train_model(net, dataloaders_dict, criterion, optimizer, num_epochs=num_epochs)

出力

output

1Epoch 1/10 2------------- 3<class 'torch.Tensor'> 4<class 'tuple'> 5torch.Size([32, 2]) 6-------------------------------------------------------------------------- 7AttributeError Traceback (most recent call last) 8<ipython-input-209-76bf5a2b82f9> in <module> 9 1 # 学習・検証を実行する 10 2 num_epochs=10 11----> 3 train_model(net, dataloaders_dict, criterion, optimizer, num_epochs=num_epochs) 12 13<ipython-input-208-da72f38b986d> in train_model(net, dataloaders_dict, criterion, optimizer, num_epochs) 14 37 outputs = net(inputs) 15 38 print(outputs.size()) 16---> 39 print(labels.size()) 17 40 loss = criterion(outputs, labels) 18 41 _, preds = torch.max(outputs, 1) 19 20AttributeError: 'tuple' object has no attribute 'size'

データセットの情報は以下となります.

python

1# 0と1のラベルした画像のDatasetを作成する 2 3 4class Dataset(data.Dataset): 5 6 7 def __init__(self, file_list, transform=None, phase='train'): 8 self.file_list = file_list 9 self.transform = transform 10 self.phase = phase 11 12 def __len__(self): 13 '''画像の枚数を返す''' 14 return len(self.file_list) 15 16 def __getitem__(self, index): 17 ''' 18 前処理をした画像のTensor形式のデータとラベルを取得 19 ''' 20 # index番目の画像をロード 21 img_path = self.file_list[index] 22 img = Image.open(img_path) 23 24 # 画像の前処理を実施 25 img_transformed = self.transform( 26 img, self.phase) # torch.Size([3, 224, 224]) 27 28 # 画像のラベルをファイル名から抜き出す 29 if self.phase == "train": 30 label = img_path[14:16] 31 #print(label) 32 elif self.phase == "val": 33 label = img_path[14:16] 34 #print(label) 35 36 # ラベルを数値に変更する 37 if label == "00": 38 label = 0 39 elif label == "01": 40 label = 1 41 42 #print(type(label)) 43 return img_transformed, label 44 45# 実行 46train_dataset = Dataset( 47 file_list=train_list, transform=ImageTransform(size, mean, std), phase='train') 48 49val_dataset = Dataset( 50 file_list=val_list, transform=ImageTransform(size, mean, std), phase='val') 51 52# 動作確認 53index = 0 54print(train_dataset.__getitem__(index)[0].size()) 55print(train_dataset.__getitem__(index)[1])

出力

output

1torch.Size([3, 96, 96]) 20

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

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

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

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

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

tiitoi

2020/07/09 13:14

torch.utils.Dataset を継承した Dataset クラスの定義がないと、問題の部分がわかりません。
nigo1973

2020/07/09 14:22

失礼しました.データセットの出力を追記しました.
tiitoi

2020/07/09 14:54

追記ありがとうございます。 print(labels.size()) でエラーが出たときの labels の値はどうなっていますか?
nigo1973

2020/07/09 22:34

ありがとうございます. def train_modelを回したときのエラーでしょうか. 'tuple' object has no attribute 'size' と出力されています. train_model にてlabelsを取得したときのタイプが”<class 'tuple'>”となっており,本のコードでは<class 'torch.Tensor'>となっていました. ご指摘のとおり,入力画像やラベルが異なりますので,Datasetの定義が異なるのかと思いますが,データのクラスに違いはなく,調べています.
nigo1973

2020/07/10 00:58

Datasetを作成するとき,valのラベルの選択をTrainと同じにしていましたが間違えており,文字列が含まれていました.ここを解消すればエラーはなくなりました.お騒がせしました.
guest

回答1

0

自己解決

Datasetを作成するとき,valのラベルの選択をTrainと同じにしていましたが間違えており,文字列が含まれていました.ここを解消すればエラーはなくなりました.お騒がせしました.

投稿2020/07/10 00:59

nigo1973

総合スコア14

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問