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

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

新規登録して質問してみよう
ただいま回答率
85.35%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

11180閲覧

AttributeError: 'tuple' object has no attribute 'to' にはまった

mmmw

総合スコア23

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/06/30 12:42

前提・実現したいこと

学習済みモデルでの未知データに対しての推論を行い、
データを格納する処理を行いたい。

inputs = inputs.to(DEVICE) で
AttributeError: 'tuple' object has no attribute 'to'が発生...

どなたか詳しいかた抜け道を教えて下さい。

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

AttributeError: 'tuple' object has no attribute 'to'

該当のソースコード

python

1DEVICE='cpu' 2pred = [] 3 4# データの取り出し 5for i,(inputs, labels) in enumerate(test_dataloader): 6 7 inputs = inputs.to(DEVICE) <-----ここでerror発生 8 9 # 学習済みモデルを推論モードに設定 10 loaded_model.eval() 11 12 # 学習済みモデルにデータをインプットし、推論をさせる 13 outputs = loaded_model(inputs) 14 15 # アウトプットから推定されたラベルを取得 16 _, preds = torch.max(outputs, 1) 17 18 # 事前に用意したリストに推論結果(0 or 1)を格納 19 pred.append(preds.item()) 20 21df_test['pred'] = pred

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

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

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

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

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

toast-uz

2021/06/30 14:30

test_dataloaderのイテレーション要素であるinputsがtensorになっておらずtupleになっている、ということですね。原因追求には、test_dataloaderを定義しているコード、さらにDatasetを定義しているコードまで遡ることが必要です。その部分を提示願います。
toast-uz

2021/06/30 14:33

少し前に回答のコメントでinputsを表示していただいていますが、やはりtensorになっていないですね。 リスト(タプル、tensor)という変則な形になっています。Datasetのコードが怪しいです。
mmmw

2021/06/30 14:41

下記がDataSet作成とDataloader部分のコードになります。 何かおかしな箇所はありますでしょうか? ----------------------------------------------------------------------------------------------------------- # dataset作成 class Test_Datasets(Dataset): def __init__(self, data_transform): #csvファイルの指定カラムを読み取ってDataFrameに変換 #self.df = pd.read_csv('./df_test.csv',names=['filename']) self.df = pd.read_csv('./df_test.csv') self.data_transform = data_transform def __len__(self): return len(self.df) def __getitem__(self, index): #file = self.df['filename'][index] #↓ここの処理が分からない file = self.df['filename'][index] image = Image.open('./test_data/' + file) image = self.data_transform(image) return file,image # datasetのインスタンス作成 #推論用データのアノテーションを行っている。 test_dataset = Test_Datasets(data_transform=test_transforms) # dataloader作成 test_dataloader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size= 1 , shuffle= False , num_workers= 0 , drop_last= True )
toast-uz

2021/06/30 14:48 編集

def __getitem__(self, index): の return file,image を return image にしてください。ファイル名は学習データには不要ですよね。このファイル名が邪魔で、tensorが崩れています。 また、もとソースコードの for i,(inputs, labels) in enumerate(test_dataloader): は for i, inputs in enumerate(test_dataloader): にしましょう。未知データなのでDataset側にlabelが無いため、こっちもlabel無しで受ける必要があります。
toast-uz

2021/06/30 22:06

上記で修正されることを動作確認しましたので、回答として記載します。
guest

回答2

0

ベストアンサー

PyTorchのDatasets、Dataloaderの取り回しが微妙に間違っていたため、エラーが発生しているようです。

Datasetsの__getitem__の返り値を、file, imageとしているにも関わらず、Dataloaderの取り出しで、inputs, labelsの逆順に記述しているため、inputsがファイル名のタプル列(batch_size=1なので要素は1つ)になっており、ご報告のエラーが発生しています。

なお、inputsの内容の報告が別回答の質疑にありますが、エラーメッセージと私の再現結果から、報告内容が間違っているものと思います。報告内容はDataLoaderからの取り出しのアンパック前の値になっています。実際に再現させてinputsを確認してみると、ファイル名のタプル列になっており、ご報告とは違っています。

対処としては、非常に簡単には、Datasetsのreturn file,imageを、return image,fileに書き換えて、パックとアンパックの順番を揃えることです。(動作確認済)

より本質的には、Datasetsでfileを返すことをやめることです。Datasetsは、説明変数,目的変数 を返すべきですが、ファイル名は目的変数ではありません。今回の場合、目的変数がわからない未知データですので、return image,_として目的変数をダミーにするか、return imageとして説明変数のみを返り値にするのが、よいです。なお、説明変数のみを返り値にする場合、アンパックできませんので、Dataloaderからの取り出しコードも修正する必要があります。(動作確認済)

投稿2021/06/30 22:26

編集2021/06/30 22:30
toast-uz

総合スコア3266

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

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

0

inputsには、toというアトリビュートがない、というエラーです

inputsにはなにがはいってるつもりなんでしょうか。

投稿2021/06/30 13:26

y_waiwai

総合スコア88042

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

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

mmmw

2021/06/30 13:44

画像データ(テストデータ)が入っていると考えています。 filename 0 1009937.jpeg 1 109996.jpeg 2 119892.jpeg 3 129893.jpeg 4 139981.jpeg ... ... 95 969983.jpeg 96 979891.jpeg 97 989921.jpeg 98 99851.jpeg 99 999921.jpeg
y_waiwai

2021/06/30 13:47

で、実際にはそいつにはなにが入ってますか。 エラーメッセージによれば、'tuple'だそうですが
mmmw

2021/06/30 14:13

print(inputs) 実行結果下記となりました。 --------------------------------------------------------------------------------- [('1009937.jpeg',), tensor([[[[0.8447, 0.8447, 0.8447, ..., 0.4851, 0.4508, 0.4337], [0.8447, 0.8447, 0.8447, ..., 0.4851, 0.4508, 0.4337], [0.8618, 0.8447, 0.8447, ..., 0.4679, 0.4508, 0.4508], ..., [0.7762, 0.7933, 0.7933, ..., 0.2796, 0.2796, 0.2796], [0.7762, 0.7933, 0.7933, ..., 0.2796, 0.2796, 0.2796], [0.7762, 0.7933, 0.7933, ..., 0.2967, 0.2967, 0.2967]], [[0.9930, 0.9930, 0.9930, ..., 0.6254, 0.5903, 0.5728], [0.9930, 0.9930, 0.9930, ..., 0.6254, 0.5903, 0.5728], [1.0105, 0.9930, 0.9930, ..., 0.6078, 0.5903, 0.5903], ..., [0.9230, 0.9405, 0.9405, ..., 0.4153, 0.4153, 0.4153], [0.9230, 0.9405, 0.9405, ..., 0.4153, 0.4153, 0.4153], [0.9230, 0.9405, 0.9405, ..., 0.4328, 0.4328, 0.4328]], [[1.2108, 1.2108, 1.2108, ..., 0.8448, 0.8099, 0.7925], [1.2108, 1.2108, 1.2108, ..., 0.8448, 0.8099, 0.7925], [1.2282, 1.2108, 1.2108, ..., 0.8274, 0.8099, 0.8099], ..., [1.1411, 1.1585, 1.1585, ..., 0.6356, 0.6356, 0.6356], [1.1411, 1.1585, 1.1585, ..., 0.6356, 0.6356, 0.6356], [1.1411, 1.1585, 1.1585, ..., 0.6531, 0.6531, 0.6531]]]])]
y_waiwai

2021/06/30 14:18

画像データには見えないですね。。
mmmw

2021/06/30 14:22

# 推論用のtransforms作成 test_transforms = transforms.Compose([ transforms.Resize(256), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]), ]) 前処理でTensor型になっていると考えているのですが...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問