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

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

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

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

Python

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

Q&A

0回答

627閲覧

Pytorchによる二値分類学習時に生じるnot enough values to unpack (expected 2, got 1)

uh6

総合スコア0

PyTorch

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

Python

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

0グッド

0クリップ

投稿2023/01/26 07:01

前提

pytorchを使って、白黒画像の二値分類を試みています。
学習フェーズで以下のようなエラーメッセージが生じます。
not enough values to unpack (expected 2, got 1)
何かしら入力が足りないという意味かと思いますが、どこに問題があるかご指摘いただきたいです。

実現したいこと

Pytorchを使った白黒画像を二値分類を実装する

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

not enough values to unpack (expected 2, got 1)

エラーメッセージ not enough values to unpack (expected 2, got 1) ### 該当のソースコード # ライブラリ読み込み import glob import cv2 import numpy as np import os from torch.utils.data import DataLoader from torch.utils.data import Dataset as BaseDataset import torch import torch.nn as nn import torch.nn.functional as F import segmentation_models_pytorch as smp import albumentations as albu import matplotlib.pyplot as plt # データ確認用 def visualize(**images): """PLot images in one row.""" n = len(images) plt.figure(figsize=(16, 5)) for i, (name, image) in enumerate(images.items()): plt.subplot(1, n, i + 1) plt.xticks([]) plt.yticks([]) plt.title(' '.join(name.split('_')).title()) plt.imshow(image) plt.show() # データ拡張 def get_training_augmentation(): IMAGE_SIZE = 256 train_transform = [ albu.HorizontalFlip(p=0.5), albu.ShiftScaleRotate(scale_limit=0.5, rotate_limit=0, shift_limit=0.1, p=1, border_mode=0), albu.PadIfNeeded(min_height=IMAGE_SIZE, min_width=IMAGE_SIZE, always_apply=True, border_mode=0), albu.RandomCrop(height=IMAGE_SIZE, width=IMAGE_SIZE, always_apply=True), albu.IAAAdditiveGaussianNoise(p=0.2), albu.IAAPerspective(p=0.5), albu.OneOf( [ albu.CLAHE(p=1), albu.RandomBrightness(p=1), albu.RandomGamma(p=1), ], p=0.9, ), albu.OneOf( [ albu.IAASharpen(p=1), albu.Blur(blur_limit=3, p=1), albu.MotionBlur(blur_limit=3, p=1), ], p=0.9, ), albu.OneOf( [ albu.RandomContrast(p=1), albu.HueSaturationValue(p=1), ], p=0.9, ), ] return albu.Compose(train_transform) # テンソル化 def to_tensor(x, **kwargs): return x.transpose(2, 0, 1).astype('float32') # 前処理 def get_preprocessing(preprocessing_fn): _transform = [ albu.Lambda(image=preprocessing_fn), albu.Lambda(image=to_tensor, mask=to_tensor), ] return albu.Compose(_transform) # データセット class Dataset(BaseDataset): CLASSES = ['background', 'dog'] def __init__( self, images_dir, masks_dir, classes=None, augmentation=None, preprocessing=None, ): self.ids = os.listdir(images_dir) self.images_fps = [os.path.join(images_dir, image_id) for image_id in self.ids] self.masks_fps = [os.path.join(masks_dir, image_id) for image_id in self.ids] # convert str names to class values on masks self.class_values = [classes.index(cls.lower()) for cls in classes] self.augmentation = augmentation self.preprocessing = preprocessing def __getitem__(self, i): # read data image = cv2.imread(self.images_fps[i]) #image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # mask mask = cv2.imread(self.masks_fps[i], 0) masks = [(mask == v) for v in self.class_values] mask = np.stack(masks, axis=-1).astype('float32') # apply augmentations if self.augmentation: sample = self.augmentation(image=image, mask=mask) image, mask = sample['image'], sample['mask'] # apply preprocessing if self.preprocessing: sample = self.preprocessing(image=image, mask=mask) image, mask = sample['image'], sample['mask'] return image, mask def __len__(self): return len(self.ids) # モデルを宣言 ENCODER = 'resnet34' ENCODER_WEIGHTS = 'imagenet' CLASSES = ['dog'] ACTIVATION = 'sigmoid' # could be None for logits or 'softmax2d' for multicalss segmentation DEVICE = 'cuda' DECODER = 'unet' model = smp.Unet( encoder_name=ENCODER, encoder_weights=ENCODER_WEIGHTS, classes=len(CLASSES), activation=ACTIVATION, ) model = model.to("cuda") train_dir = 'train' val_dir = 'val' preprocessing_fn = smp.encoders.get_preprocessing_fn(ENCODER, ENCODER_WEIGHTS) # データセットを作成 train_dataset = Dataset( os.path.join(train_dir, 'images'), os.path.join(train_dir, 'masks'), augmentation=get_training_augmentation(), preprocessing=get_preprocessing(preprocessing_fn), classes=['dog'], ) valid_dataset = Dataset( os.path.join(val_dir, 'images'), os.path.join(val_dir, 'masks'), preprocessing=get_preprocessing(preprocessing_fn), classes=['dog'], ) train_loader = DataLoader(train_dataset, batch_size=1, shuffle=True, num_workers=0) valid_loader = DataLoader(valid_dataset, batch_size=1, shuffle=False, num_workers=0) # データ確認 dataset = Dataset(os.path.join(train_dir, 'images'), os.path.join(train_dir, 'masks'), classes=['dog']) image, mask = dataset[0] # get some sample visualize( image=image, mask=mask.squeeze(), ) # 精度確認指標 metrics = [ smp.utils.metrics.IoU(threshold=0.5), ] # ロス loss = smp.utils.losses.DiceLoss() # 最適化関数 optimizer = torch.optim.Adam([ dict(params=model.parameters(), lr=0.001), ]) # 1Epochトレイン用 train_epoch = smp.utils.train.TrainEpoch( model, loss=loss, metrics=metrics, optimizer=optimizer, device=DEVICE, verbose=True, ) valid_epoch = smp.utils.train.ValidEpoch( model, loss=loss, metrics=metrics, device=DEVICE, verbose=True, ) # 学習 40EPoch 25Epochで学習率を下げる #ここで当該エラーを生じます max_score = 0 for i in range(0, 40): print('\nEpoch: {}'.format(i)) try: train_logs = train_epoch.run(train_loader) val_logs = valid_epoch.run(valid_loader) except Exception as e: print(e) # do something (save model, change lr, etc.) if max_score < val_logs['iou_score']: max_score = val_logs['iou_score'] torch.save(model, f'{DECODER}_{ENCODER}.pth') print('Model saved!') if i == 25: optimizer.param_groups[0]['lr'] = 1e-4 print('Decrease decoder learning rate to 1e-4!') #結果確認 # 画像読み込み val_files = glob.glob('val/images/*') f = val_files[0] image_src = cv2.imread(f) image_src = cv2.cvtColor(image_src, cv2.COLOR_BGR2RGB) # 前処理 image = preprocessing_fn(image_src) image = image.transpose(2, 0, 1).astype('float32') # モデルで推論 image=torch.from_numpy(image).to(DEVICE).unsqueeze(0) predict = model(image) predict = predict.detach().cpu().numpy()[0].reshape((256,256)) # 0.5以上を1とする predict_img = np.zeros([256,256]).astype(np.int8) predict_img = np.where(predict>0.5, 1 , predict_img) # 画像表示 fig = plt.figure(figsize=(12, 6)) ax1 = fig.add_subplot(1, 2, 1) ax2 = fig.add_subplot(1, 2, 2) ax1.imshow(image_src) ax2.imshow(predict_img) ```Python3 ソースコード

試したこと

異なる画像で学習を実施。JPG(RGB)画像で試したところ、学習がうまく進むことを確認しました。
実際に分類したい画像は256×256pixelのTif画像(8bit)です。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

can110

2023/01/26 07:23

まずはエラーは発生場所が分かるように一文ではなく全文(Traceback)を提示ください。 なお、エラー特定するために現時点ではtry~exceptは外したほうがよいと思います。
jbpb0

2023/01/26 10:42

質問に記載のエラーメッセージよりも上に「Traceback」と書かれてたら、そこから下をできるだけ省略せずに質問に記載してください (ここに書くのではなく、質問を編集して追記する) ユーザー名等の個人情報は伏せ字でいいですが、それ以外はできるだけそのまま記載してください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問