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

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

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

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Python

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

Q&A

解決済

1回答

8282閲覧

処理後の配列の次元を変えるとエラーがでる

Hiro051

総合スコア9

PyTorch

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Python

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

0グッド

0クリップ

投稿2020/05/15 09:51

編集2020/05/15 11:23

前提・実現したいこと

Python初心者です。
独自のデータセット'/home/selen/downloads/'を用いて
PyTorchでファインチューニングを行いたいと思っています。

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

Traceback (most recent call last):
File "Arashi/arashi.py", line 52, in <module>
datasets = torch.utils.data.TensorDataset(img_datas, labels)
File "/home/selen/.pyenv/versions/3.7.3/lib/python3.7/site-packages/torch/utils/data/dataset.py", line 36, in init
assert all(tensors[0].size(0) == tensor.size(0) for tensor in tensors)
File "/home/selen/.pyenv/versions/3.7.3/lib/python3.7/site-packages/torch/utils/data/dataset.py", line 36, in <genexpr>
assert all(tensors[0].size(0) == tensor.size(0) for tensor in tensors)
AttributeError: 'list' object has no attribute 'size'

該当のソースコード

import torch, torchvision
import torch.nn as nn
import torch.nn.functional as F
from torchvision import transforms
import pytorch_lightning as pl
from pytorch_lightning import Trainer

from PIL import Image
import glob

fold_path = '/home/selen/downloads/'
imgs = []
for imgs_path in glob.glob(fold_path + ''):
imgs.append(glob.glob(imgs_path + '/
'))

from torchvision.models import resnet18
resnet = resnet18(pretrained=True)

transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
])

labels = []
img_datas = torch.tensor([])

for i,imgs_arr in enumerate(imgs):

for img_path in imgs_arr: labels.append(i) img = Image.open(img_path) tensor_img = transform(img) tensor_img = tensor_img.unsqueeze(0) img_datas = torch.cat([img_datas, tensor_img],dim=0)

datasets = torch.utils.data.TensorDataset(img_datas, labels)

n_train = int(len(datasets) * 0.85)
n_val = len(datasets) - n_train
torch.manual_seed(0)
train,val = torch.utils.data.random_split(datasets,[n_train,n_val])

class TrainNet(pl.LightningModule):
@pl.data_loader
def train_dataloader(self):
return torch.utils.data.DataLoader(train, self.batch_size,shuffle=True)

def training_step(self, batch, batch_nb): x, t = batch y = self.forward(x) loss = self.lossfun(y, t) results = {'loss': loss} return results

class ValidationNet(pl.LightningModule):

@pl.data_loader def val_dataloader(self): return torch.utils.data.DataLoader(val, self.batch_size) def validation_step(self, batch, batch_nb): x, t = batch y = self.forward(x) loss = self.lossfun(y, t) y_label = torch.argmax(y, dim=1) acc = torch.sum(t == y_label) * 1.0 / len(t) results = {'val_loss': loss, 'val_acc': acc} return results def validation_end(self, outputs): avg_loss = torch.stack([x['val_loss'] for x in outputs]).mean() avg_acc = torch.stack([x['val_acc'] for x in outputs]).mean() results = {'val_loss': avg_loss, 'val_acc': avg_acc} return results

class FineTuningNet(TrainNet, ValidationNet):

def __init__(self, batch_size=256): super().__init__() self.batch_size = batch_size self.conv = resnet18(pretrained=True) self.fc1 = nn.Linear(1000, 100) self.fc2 = nn.Linear(100, 5) for param in self.conv.parameters(): param.requires_grad = False def lossfun(self, y, t): return F.cross_entropy(y, t) def configure_optimizers(self): return torch.optim.SGD(self.parameters(), lr=0.01) def forward(self, x): x = self.conv(x) x = self.fc1(x) x = F.relu(x) x = self.fc2(x) return x
### 試したこと いろいろ調べてみましたがよくわかりません。 間違っている箇所あれば指摘していただけますと幸いです。

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

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

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

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

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

tiitoi

2020/05/15 10:42

どこでエラーが起こっているのでしょうか? assert all(tensors[0].size(0) == tensor.size(0) for tensor in tensors) というアサートから察するに、入力の形状に問題があるように思いますが、動かせないので具体的なことは言えません。 画像であれば、入力の形状が (N, C, H, W) になっているかどうか (画像サイズがバラバラだったりしないか) などの観点で確認してみてはどうでしょうか
meg_

2020/05/15 11:20

エラーメッセージは省略せずに全部載せてください。
Hiro051

2020/05/15 11:26

失礼いたしました。 エラーメッセージを全て記載いたしました。 入力データはGoogleでスクレイピングし、OpenCVで顔部分のみ切り取った全て同じサイズの物を用意しています。
Hiro051

2020/05/15 14:38

変更いたしましたが以下のようなエラーが出てしまいました。 Traceback (most recent call last): File "Arashi/arashi.py", line 31, in <module> labels.append(i) AttributeError: 'Tensor' object has no attribute 'append'
guest

回答1

0

ベストアンサー

labelsがリストであることが原因ではありませんか? tensorに変換して渡せば良いかと思われます。


【追記】下記で出来ませんか?

Python

1datasets = torch.utils.data.TensorDataset(img_datas, torch.tensor(labels))

投稿2020/05/15 12:37

編集2020/05/15 17:30
meg_

総合スコア10760

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

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

Hiro051

2020/05/15 14:40

変更いたしましたが以下のようなエラーが出てしまいました。 Traceback (most recent call last): File "Arashi/arashi.py", line 31, in <module> labels.append(i) AttributeError: 'Tensor' object has no attribute 'append'
Hiro051

2020/05/15 14:44

30for img_path in imgs_arr: 31 labels.append(i) 32 img = Image.open(img_path) 33 tensor_img = transform(img) 34 tensor_img = tensor_img.unsqueeze(0) 35 img_datas = torch.cat([img_datas, tensor_img],dim=0)
Hiro051

2020/05/15 14:45

コードは上記の通りです。
meg_

2020/05/15 17:31

回答に追記しました。 リストをテンソルに変換するのはtorch.utils.data.TensorDataset()に渡す時で良いです。
Hiro051

2020/05/16 01:27

解決できました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問