前提・実現したいこと
Pytorchを用いてHAM10000という医療画像クラス分類用データセットで学習しています.
jpg画像ファイルおよび{画像のファイル名:label}となっているcsvファイルを用いて,画像のファイル名を毎回batchsize分取り出し,その都度labelと画像を読み込む形で入力データを構築しています.
日本語のアルゴリズムで書くと以下のような感じです.
for batchsize分のファイル名 in 全画像のファイル名: images, labels = ファイル名から画像およびlabelを読み込み,Tensorにして返す関数(batchsize分のファイル名)
最初はうまく学習してくれるのですが,epoch70や80など(不定,そのまま学習が100まで完了してくれることもあります)学習がかなり進んでから入力のbatchsizeとlabelのbatchsizeが合わないといったErrorが起こるので,これをなんとか解決したいです.
発生している問題・エラーメッセージ
以下が発生しているError文です(batchsizeは16です)
epoch : 83 Lerning >>>>>Error size ['ISIC_0028434', 'ISIC_0033912', 'ISIC_0030877_flip', 'ISIC_0029937_flip_mirror', 'ISIC_0029713', 'ISIC_0027190_flip', 'ISIC_0034007_flip_mirror', 'ISIC_0028581', 'ISIC_0029331_flip_mirror', 'ISIC_0029527_mirror', 'ISIC_0034221_mirror', 'ISIC_0025891_flip', 'ISIC_0033993', 'ISIC_0028039', 'ISIC_0031842', 'ISIC_0032860'] images : 7, labels : 16 Traceback (most recent call last): File "train.py", line 113, in <module> loss = criterion(output, labels) File "C:\Users\LabPC_2021\anaconda3\envs\nakai_py37\lib\site-packages\torch\nn\modules\module.py", line 889, in _call_impl result = self.forward(*input, **kwargs) File "C:\Users\LabPC_2021\anaconda3\envs\nakai_py37\lib\site-packages\torch\nn\modules\loss.py", line 1048, in forward ignore_index=self.ignore_index, reduction=self.reduction) File "C:\Users\LabPC_2021\anaconda3\envs\nakai_py37\lib\site-packages\torch\nn\functional.py", line 2690, in cross_entropy return nll_loss(log_softmax(input, 1), target, weight, None, ignore_index, None, reduction) File "C:\Users\LabPC_2021\anaconda3\envs\nakai_py37\lib\site-packages\torch\nn\functional.py", line 2382, in nll_loss "Expected input batch_size ({}) to match target batch_size ({}).".format(input.size(0), target.size(0)) ValueError: Expected input batch_size (7) to match target batch_size (16).
上のエラー文は83epochの途中(真ん中あたり)まで実行がうまく行っていたものです.
最初の方の
Error size ['ISIC_0028434', 'ISIC_0033912', 'ISIC_0030877_flip', 'ISIC_0029937_flip_mirror', 'ISIC_0029713', 'ISIC_0027190_flip', 'ISIC_0034007_flip_mirror', 'ISIC_0028581', 'ISIC_0029331_flip_mirror', 'ISIC_0029527_mirror', 'ISIC_0034221_mirror', 'ISIC_0025891_flip', 'ISIC_0033993', 'ISIC_0028039', 'ISIC_0031842', 'ISIC_0032860'] images : 7, labels : 16
は,自分で中身を詳しく見ようと思い,Errorが起こったときのファイル名,画像のbatchsize(7)およびlabelのbatchsize(16)を表示してみたものです.ただしここも決まったファイル名ではなく,labelは常に16(学習途中なのでこちらはあっていると思うのですが...)で,画像のbatchsizeが毎回不定です.
該当のソースコード
train
1for namelist in train_namelist: 2 images, labels = data_load.main(namelist) 3 images = images.to(device) # to GPU? 4 labels = labels.to(device) 5 6 optimizer.zero_grad() 7 output = net(images) 8 9 if not images.size(0) == labels.size(0): 10 print("Error size") 11 print(namelist) 12 print("images : {}, labels : {}".format(images.size(0), labels.size(0))) 13 14 loss = criterion(output, labels)
2行目のdata_load.mainの中身は以下です.
pandasのread_csv,PILのImageを用いています.
def main(self, namelist, crop_w = 320, crop_h = 320): labels = [] for image_id in namelist: img = Image.open(self.dir_name + 'HAM10000/{}.jpg'.format(image_id)) #img = img.resize((225, 300)) img_w, img_h = img.size img = img.crop(((img_w - crop_w)//2, (img_h - crop_h)//2, (img_w + crop_w)//2, (img_h + crop_h)//2)) img = np.asarray(img) img = torch.tensor(img).to(dtype = torch.float).unsqueeze_(0) img = img.permute(0, 3, 1, 2) try: image_batch = torch.cat((image_batch, img), dim = 0) except: image_batch = img #self.dfはcsvのシートで,['image_id']が画像名,['dx']がラベルになっています basename_column = self.df[self.df['image_id'] == image_id] label = basename_column['dx'].values[0] #self.assign_number_to_labelsは,strで与えられたlabel名を,0,1,2...など決まった数字に割り振る関数です label = self.assign_numbers_to_labels(label) labels.append(label) labels = torch.Tensor(labels).to(dtype = torch.long) return image_batch, labels
試したこと
取得される全namelistに対応する画像およびlabelがあることは確認しています.
また,ニューラルネットには通さずひたすら画像とラベルを読み込んで,サイズを確認するといったことを10000epoch繰り返すといったことをやっても,結果は同じく途中でsize違いのerrorが出ました.
補足情報(FW/ツールのバージョンなど)
Python 3.7.10
pytorch 1.8.0 py3.7_cuda11.1_cudnn8_0 pytorch
pandas 1.2.3 py37h08fd248_0 conda-forge
pillow 8.1.2 py37h4fa10fc_0
回答1件
あなたの回答
tips
プレビュー