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

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

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

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

Python 3.x

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

解決済

3Dテンソルとして読み込ませたい。

matsuda794
matsuda794

総合スコア12

PyTorch

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

Python 3.x

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

1回答

0評価

0クリップ

313閲覧

投稿2022/07/27 14:28

前提

PyTorchでセグメンテーションのタスクをしています。
しかし学習させようとすると
RuntimeError: only batches of spatial targets supported (3D tensors) but got targets of size: : [4, 3, 512, 512]
というエラーが出てうまくいきません。

実現したいこと

ここに実現したいことを箇条書きで書いてください。
学習できるように3Dテンソルで読み込める3次元の形でNNにデータを渡したい。

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

python

使用デバイス: cuda:0 ------------- Epoch 1/30 ------------- (train) /usr/local/lib/python3.7/dist-packages/torch/optim/lr_scheduler.py:136: UserWarning: Detected call of `lr_scheduler.step()` before `optimizer.step()`. In PyTorch 1.1.0 and later, you should call them in the opposite order: `optimizer.step()` before `lr_scheduler.step()`. Failure to do this will result in PyTorch skipping the first value of the learning rate schedule. See more details at https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate "https://pytorch.org/docs/stable/optim.html#how-to-adjust-learning-rate", UserWarning) --------------------------------------------------------------------------- RuntimeError Traceback (most recent call last) <ipython-input-12-d290d3cdc9e6> in <module>() 1 num_epochs = 30 ----> 2 train_loss_list, val_loss_list = train_model(net, dataloaders_dict, criterion, optimizer, scheduler, num_epochs) 3 frames <ipython-input-11-4b1cf2875693> in train_model(net, dataloaders_dict, criterion, optimizer, scheduler, num_epochs) 69 with torch.set_grad_enabled(phase == 'train'): 70 outputs = net(imges) ---> 71 loss = criterion(outputs, anno_class_imges.long()) / batch_multiplier 72 73 # 訓練時はバックプロパゲーション /usr/local/lib/python3.7/dist-packages/torch/nn/modules/module.py in _call_impl(self, *input, **kwargs) 1128 if not (self._backward_hooks or self._forward_hooks or self._forward_pre_hooks or _global_backward_hooks 1129 or _global_forward_hooks or _global_forward_pre_hooks): -> 1130 return forward_call(*input, **kwargs) 1131 # Do not call functions when jit is used 1132 full_backward_hooks, non_full_backward_hooks = [], [] <ipython-input-9-ce874e9e94eb> in forward(self, outputs, targets) 24 """ 25 ---> 26 loss = F.cross_entropy(outputs[0], targets, reduction='mean') 27 loss_aux = F.cross_entropy(outputs[1], targets, reduction='mean') 28 /usr/local/lib/python3.7/dist-packages/torch/nn/functional.py in cross_entropy(input, target, weight, size_average, ignore_index, reduce, reduction, label_smoothing) 3012 if size_average is not None or reduce is not None: 3013 reduction = _Reduction.legacy_get_string(size_average, reduce) -> 3014 return torch._C._nn.cross_entropy_loss(input, target, weight, _Reduction.get_enum(reduction), ignore_index, label_smoothing) 3015 3016 RuntimeError: only batches of spatial targets supported (3D tensors) but got targets of size: : [4, 3, 512, 512]

該当のソースコード

python

from utils.dataloader import make_datapath_list, DataTransform, Dataset makepath = make_datapath_list() train_img_list, val_img_list, test_img_list, train_anno_list, val_anno_list, test_anno_list, = makepath.get_list() train_dataset = Dataset(train_img_list, train_anno_list, phase="train", transform=DataTransform(input_size=512)) val_dataset = Dataset(val_img_list, val_anno_list, phase="val", transform=DataTransform(input_size=512)) print(train_dataset.__getitem__(0)[0].shape)#torch.Size([3, 512, 512]) print(train_dataset.__getitem__(0)[1].shape)#torch.Size([3, 512, 512]) #ここからdata_augumentation.py import os.path as osp from PIL import Image from pathlib import Path import torch.utils.data as data import torch import torchvision.datasets as datasets from torchvision import transforms import random from utils.data_augumentation import Compose, Resize, Normalize_Tensor class make_datapath_list(): def get_list(self): #事前準備 cwd_path = Path.cwd() img_dir = cwd_path / 'images'#検索するファイル label_dir = cwd_path / 'labels'#検索するファイル #画像のパスをリストに格納 img_dir_g = img_dir.iterdir() img_paths = [ str(x) for x in img_dir_g] img_paths.sort() #ラベルのパスをリストに格納 label_dir_g = label_dir.iterdir() label_paths = [ str(y) for y in label_dir_g] label_paths.sort() p = list(zip(img_paths, label_paths)) random.shuffle(p) img_paths, label_paths = zip(*p) train_len = int(len(img_paths)*0.7) val_len = len(img_paths) - train_len #画像 train_img_list = img_paths[:train_len] val_img_list = img_paths[train_len:train_len+val_len] test_img_list = img_paths[train_len+val_len:] #ラベル train_anno_list = label_paths[:train_len] val_anno_list = label_paths[train_len:train_len+val_len] test_anno_list = label_paths[train_len+val_len:] return train_img_list, val_img_list, test_img_list, train_anno_list, val_anno_list, test_anno_list, class DataTransform(): """ 画像のサイズをinput_size x input_sizeにする。 Attributes ---------- input_size : int リサイズ先の画像の大きさ。 """ def __init__(self, input_size): self.data_transform = { 'train': Compose([ Resize(input_size), Normalize_Tensor([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]), 'val': Compose([ Resize(input_size), Normalize_Tensor([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) } def __call__(self, phase, img, anno_class_img): """ Parameters ---------- phase : 'train' or 'val' 前処理のモードを指定。 """ return self.data_transform[phase](img, anno_class_img) class Dataset(data.Dataset): """ Datasetを作成するクラス。PyTorchのDatasetクラスを継承。 Attributes ---------- img_list : リスト 画像のパスを格納したリスト anno_list : リスト アノテーションへのパスを格納したリスト phase : 'train' or 'test' 学習か訓練かを設定する。 transform : object 前処理クラスのインスタンス """ def __init__(self, img_list, anno_list, phase, transform): self.img_list = img_list self.anno_list = anno_list self.phase = phase self.transform = transform def __len__(self): '''画像の枚数を返す''' return len(self.img_list) def __getitem__(self, index): ''' 前処理をした画像のTensor形式のデータとアノテーションを取得 ''' img, anno_class_img = self.pull_item(index) return img, anno_class_img def pull_item(self, index): '''画像のTensor形式のデータ、アノテーションを取得する''' # 1. 画像読み込み image_file_path = self.img_list[index] img = Image.open(image_file_path) # [高さ][幅][色RGB] # 2. アノテーション画像読み込み anno_file_path = self.anno_list[index] anno_class_img = Image.open(anno_file_path) # [高さ][幅] # 3. 前処理を実施 img, anno_class_img = self.transform(self.phase, img, anno_class_img) return img, anno_class_img

補足情報(FW/ツールのバージョンなど)

GoogleColab環境
PyTorch 1.12.0+cu113

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

matsuda794

2022/07/28 01:54

はい!その通りです。
jbpb0

2022/07/28 06:37

書籍の第3章の通りにVOCデータセットを使っても、質問に記載のエラーになるのでしょうか? それとも、書籍の通りだと実行できるけど、他のデータセットだとエラーになるのでしょうか?
matsuda794

2022/07/28 06:45

書籍の通りだと実行できるけど自作データセットだとエラーになります。 自作データセットは 画像:jpg 512*512 ラベル画像:png 512*512 青色でラベリングして背景を黒で塗りつぶしています。 書籍では print(val_dataset.__getitem__(0)[1].shape)#torch.Size([512, 512]) となっているのですが、自作データでは print(val_dataset.__getitem__(0)[1].shape)#torch.Size([3, 512, 512]) と3次元になっているようです。 (画像のindex_sizeを457→512に変更しています。)
matsuda794

2022/07/28 07:25

ありがたい助言です。 リンク先の内容をまとめると 学習に使う画像サイズが(281, 500, 3)ではない場合に次元が増えることがあるため、画像サイズを(281, 500, 3)に変換して学習させる必要があるということでしょうか。ひとまず試してみようと思います。 私のコードでは、データトランスフォームでscaleに関する記述を削除しています。 入力の画像サイズを変えずに学習させる方法はございますでしょうか。
matsuda794

2022/07/28 07:37

誤解しておりました。 class VOCDataset(data.Dataset):内の def pull_item(self, index): '''画像のTensor形式のデータ、アノテーションを取得する''' # 1. 画像読み込み image_file_path = self.img_list[index] img = Image.open(image_file_path) # [高さ][幅][色RGB] # 2. アノテーション画像読み込み anno_file_path = self.anno_list[index] anno_class_img = Image.open(anno_file_path) # [高さ][幅]     ここに追記    np.array(anno_class_img)としたら良いでしょうか # 3. 前処理を実施 img, anno_class_img = self.transform(self.phase, img, anno_class_img) return img, anno_class_img
matsuda794

2022/07/28 08:35

ありがとうございます!無事このエラーは出なくなりました。 print(val_dataset.__getitem__(0)[1].shape)#torch.Size([512, 512]) 次はRuntimeError: CUDA error: device-side assert triggered CUDA kernel errors might be asynchronously reported at some other API call,so the stacktrace below might be incorrect. For debugging consider passing CUDA_LAUNCH_BLOCKING=1. のエラーが出たので別に質問しようと思います。
matsuda794

2022/07/29 08:23

ありがとうございます。 同じ問題だと思われます。 アノテーションラベルの色の数が問題でした。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

PyTorch

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

Python 3.x

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