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コードの表示(ブロック)
両者コードの違いから、画像リストの作り方に問題があるように考えていますが、どうすればよいかわかりません。
冗長でわかりにくい質問で恐縮ですが、ご回答のほどよろしくお願いします。
回答1件
あなたの回答
tips
プレビュー