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

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

新規登録して質問してみよう
ただいま回答率
85.37%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

PyTorch

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

Python 3.x

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

Q&A

解決済

1回答

6360閲覧

Pytorch 画像+複数入力変数のdataset構築での画像リストエラーを解決したい

hidemomo

総合スコア31

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

PyTorch

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

Python 3.x

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

0グッド

0クリップ

投稿2020/02/19 03:51

Kerasからpytorchへ移行中の初心者です。入力変数は画像+2変数、教師データ1つの
データセットです。このデータセットを学習とバリデイションに分けたいのですが、画像はリストなので下記エラーが出ます。

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

###やりたいこと
画像+2変数の入力値、1つの教師データのデータセットを作りたい。

###データ形状
X_pic = (3, 224,224) #pytorchTensor
X_one = (1,)
X_two = (26,) #one-hotに
y = (1,)

pytorh

1#長くなり恐縮です。 2(ライブラリは省略) 3# 入力画像の前処理①:テンソル変換とimagenet標準化 4 5class ImageTransformPytorch(): 6 7 def __init__(self, resize, mean, std): 8 self.data_transform = ( 9 transforms.Compose([ 10 transforms.Resize(resize), 11 transforms.ToTensor(), # pytorchテンソル変換 12 transforms.Normalize(mean, std) # 標準化 13 ])) 14 15 def __call__(self, X): 16 return self.data_transform(X) 17 18size = 224 19mean = (0.485, 0.456, 0.406) 20std = (0.229,0.224,0.225) 21 22#画像読み込み 23X_pic = [] 24 25#アドバイスコード:画像Noを取り出す 26df = pd.read_csv('./test_df.csv') 27files = list(df["pic_no"].map(lambda x: './demo_picture/{}.jpg'.format(x))) 28 29for file in files: 30 img = Image.open(file) 31 transform = ImageTransformPytorch(size, mean, std) #ImageTransformPytorchモジュール 32 img_ = transform(img) 33 X.append(img_) 34 35#教師データ読み込み 36df_y = df['teacher] 37y = np.array(df_y) 38 39##変数2: 40X_one = df['a'] 41X_one = np.array(X_one) 42 43#変数3: 44X_two = pd.get_dummies(df['b']) 45X_two = np.array(X_two) 46 47#deta_split 48x_pic_train, x_pic_val, y_train, y_val,x_one_train, x_one_val, x_two_train, x_two_val 49 = model_selection.train_test_split( 50 X_pic,y,X_one,X_two,random_state=50,test_size=0.15) 51 52#to_torch 53x_one_train = torch.Tensor(x_one_train) 54x_one_val = torch.Tensor(x_one_val) 55x_two_train = torch.Tensor(x_two_train) 56x_two_val = torch.Tensor(x_two_val) 57y_train = torch.Tensor(y_train) 58y_val = torch.Tensor(y_val) 59 60# 入力と出力を結合 61train_dataset = torch.utils.data.TensorDataset( 62 x_pic_train,x_one_train, x_two_train, y_train) 63val_dataset = torch.utils.data.TensorDataset( 64 x_pic_val,x_one_val, x_two_val, y_val) 65 66#erro 67AttributeError: 'list' object has no attribute 'size'

###他に試行したこと
リストの問題と考えて、ほかの方のコードを用いてランダム整数値でリストを作り上記同様の流れで試行しましたが、こちらはエラーは出ませんでした。

pytorch

1in_oneD, in_twoD, target = [], [], [] 2 3for _ in range(100): 4 in_oneD.append(np.random.randn(3)) 5 in_twoD.append(np.random.randn(1, 15, 20)) 6 target.append(np.random.randn(100)) 7 8in_oneD = np.array(in_oneD) 9in_twoD = np.array(in_twoD) 10target = np.array(target) 11 12# データを学習用とテスト用に分割 13oneD_train, oneD_test, twoD_train, twoD_test, target_train, target_test = model_selection.train_test_split(in_oneD, in_twoD, target, test_size=1/7, random_state=0) 14 15# PyTorchのテンソルに変換 16oneD_train = torch.Tensor(oneD_train) 17oneD_test = torch.Tensor(oneD_test) 18twoD_train = torch.Tensor(twoD_train) 19twoD_test = torch.Tensor(twoD_test) 20target_train = torch.LongTensor(target_train) 21target_test = torch.LongTensor(target_test) 22 23# 入力と出力を結合 24ds_train = torch.utils.data.TensorDataset(oneD_train, twoD_train, target_train) 25ds_test = torch.utils.data.TensorDataset(oneD_test, twoD_test, target_test) 26 27 28コードの表示(ブロック)

両者コードの違いから、画像リストの作り方に問題があるように考えていますが、どうすればよいかわかりません。

冗長でわかりにくい質問で恐縮ですが、ご回答のほどよろしくお願いします。

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

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

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

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

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

tiitoi

2020/02/19 04:50

エラーメッセージだけだとどの行でエラーが発生したのかわからないので、スタックトレースも含めて貼ってください
hidemomo

2020/02/19 07:31

了解しました。よろしくお願いします。 --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-72-4bf15e47a00e> in <module> 1 # 入力と出力を結合 2 ----> 3 train_dataset = torch.utils.data.TensorDataset(x_train,x_bs_train, x_cate_train, y_train) 4 val_dataset = torch.utils.data.TensorDataset(x_val,x_bs_val, x_cate_val, y_val) ~\AppData\Local\Continuum\anaconda3\lib\site-packages\torch\utils\data\dataset.py in __init__(self, *tensors) 156 157 def __init__(self, *tensors): --> 158 assert all(tensors[0].size(0) == tensor.size(0) for tensor in tensors) 159 self.tensors = tensors 160 ~\AppData\Local\Continuum\anaconda3\lib\site-packages\torch\utils\data\dataset.py in <genexpr>(.0) 156 157 def __init__(self, *tensors): --> 158 assert all(tensors[0].size(0) == tensor.size(0) for tensor in tensors) 159 self.tensors = tensors 160 AttributeError: 'list' object has no attribute 'size'
tiitoi

2020/02/19 09:00

x_pic_train,x_one_train, x_two_train, y_train は全部 Tensor オブジェクトになっていますか。 x_pic_train.size(),x_one_train.size(), x_two_train.size(), y_train.size() と size() を print してみて、もしエラーになるものがあれば、その変数が原因です。
hidemomo

2020/02/19 10:21 編集

ありがとうございます。[t.size() for t in x_pic_train]ですと、torch.Size([3, 224, 224])、が行数分表示されます。ただ、現状のリスト形式だと上記エラーが出ますので原因は画像「x_pic_train」「x_pic_test」と考えられます。 x_pic_train = torch.Tensor(x_train)も試行しましたが、 ValueError: only one element tensors can be converted to Python scalars が出ます。 tensor.numpyに変換する必要があるのでしょうか?
tiitoi

2020/02/19 10:18

質問のコードだとX_pic が空のままのように見えますがどうでしょうか? 例えば、x_pic_train が原因なのだとしたら、その変数は train_test_split の返り値なので、X_pic はどうなっているのか、というように逆にたどっていって1つ1つ変数を print してデバッグしてください
hidemomo

2020/02/19 10:35

ありがとうございます。上記編集でメールが行き違いになり失礼しました。 リスト内は空ではなく、行数分格納されています。 datasete構築において、画像がリストのままだと上記エラーとなり、その対処がわからない、ということになります。もう少し、考えてみます。 お忙しいところ、ありがとうございました。
guest

回答1

0

自己解決

Tensor型だとリストは分割されないのでnumpyで分割後にtensor変換するとうまくいきました。

以下、コードのポイント

pytorch

1 2size=224 3 4X_pic=[] 5 6df = pd.read_csv('./test_df.csv') 7files = list(df["pic_no"].map(lambda x: './demo_picture/{}.jpg'.format(x))) 8 9for file in files: 10 img = Image.open(file) 11 img = img.resize((size,size)) 12 img_ = np.array(img) 13 img_ = img_.transpose((2, 0, 1)) #pytroch(色, 高さ, 幅) 14 X_pic.append(img_) 15 16#標準化/他変数省略 17 18x_pic_train, x_pic_val, y_train, y_val,x_one_train, x_one_val, x_two_train, x_two_val 19 = model_selection.train_test_split( 20 21x_pic_train = torch.Tensor(x_pic_train) 22x_pic_test = torch.Tensor(x_pic_test) 23

投稿2020/02/19 13:38

hidemomo

総合スコア31

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問