前提・実現したいこと
機械学習のため最近Pythonを触り始めたのですが躓いてしまいました。
google-colaboratory(python 3.6.9)においてPyTorch(1.6.0)でファインチューニングに取り組んでいます。
pytorch_lightning(v 0.9.0)を用いて検証用や訓練用、テスト用のクラスを定義したのですが
デコレータ部分でエラーが出ます。
何が問題なのでしょうか。
2020/09/12
@pl.data_loaderの使用できるバージョンでpytorch_lightningをinstallすることで解決いたしました。
v0.9.0でどうすべきなのか、知っている方がいらっしゃいましたら回答お願いします。
発生している問題・エラーメッセージ
AttributeError Traceback (most recent call last) <ipython-input-25-579be5e31971> in <module>() 1 #訓練用のモデル定義 ----> 2 class TrainNet(pl.LightningModule): 3 4 @pl.data_loader 5 def train_dataloader(self): <ipython-input-25-579be5e31971> in TrainNet() 2 class TrainNet(pl.LightningModule): 3 ----> 4 @pl.data_loader 5 def train_dataloader(self): 6 return torch.utils.data.DataLoader(train, self.batch_size, shuffle=True) AttributeError: module 'pytorch_lightning' has no attribute 'data_loader'
該当のソースコード
import matplotlib.pyplot as plt import numpy as np import copy import os from tqdm import tqdm import cv2 import torchvision.transforms as transforms import torchvision.models as models import torchvision import torch import torch.nn as nn import torch.nn.functional as F from torch.utils.data import DataLoader import shutil import pytorch_lightning as pl from pytorch_lightning import Trainer #画像の前処理' '内の文言によって処理内容を変えている transform_dict = { 'train': transforms.Compose( [ transforms.Resize((224,224)), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ]), 'test': transforms.Compose( [ transforms.Resize((224,224)), #transforms.Grayscale(num_output_channels = 1), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]), ])} #ディレクトリ内のデータチェック 不要なファイルがあれば削除 l = os.listdir('/content/drive/My Drive/my_data_set/train/') os.chdir('/content/drive/My Drive/my_data_set/train/') target_dir = '.ipynb_checkpoints' #余計なファイルが生成されていた場合に削除する if os.path.exists(target_dir): shutil.rmtree(target_dir) #データを読み込み、フォルダ名でラベルを付ける data_folder = os.path.join('/content/drive/My Drive/my_data_set/train/') data = torchvision.datasets.ImageFolder(root = data_folder, transform = transform_dict["train"]) train_ratio = 0.8 train_size = int(train_ratio * len(data)) val_size = len(data) - train_size data_size = {"train":train_size, "val":val_size} data_train, data_val = torch.utils.data.random_split(data, [train_size, val_size]) #エポック数,バッジサイズ epoch = 120 BATCH_SIZE = 2 LR = 0.001 #学習率 train_loader = torch.utils.data.DataLoader(data_train, batch_size = BATCH_SIZE, shuffle = True) val_loader = torch.utils.data.DataLoader(data_val, batch_size = BATCH_SIZE, shuffle = False) dataloaders = {"train":train_loader, "val":val_loader} mobile_Net = torchvision.models.mobilenet_v2(pretrained=True, progress=True) #訓練用のモデル定義 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.val_dataloader 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 TestNet(pl.LightningModule): @pl.test_dataloader def test_dataloader(self): return torch.utils.data.DataLoader(test, self.batch_size) def test_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 = {'test_loss': loss, 'test_acc': acc} return results def test_end(self, outputs): avg_loss = torch.stack([x['test_loss'] for x in outputs]).mean() avg_acc = torch.stack([x['test_acc'] for x in outputs]).mean() results = {'test_loss': avg_loss, 'test_acc': avg_acc} return results
試したこと
PyTorch Lightningを利用したネット上のソースコードを試したのですが同様のエラーが出ました
@pl.LightningDataModule.train_dataloaderと書き換えたところ(他部分もLightningDataModuleを挟むことで)エラーは解決しましたが、本方法が間違っている可能性があるため、回答受け付け状態にしておきます。
補足情報(FW/ツールのバージョンなど)
python 3.6.9
PyTorch(1.6.0)
pytorch_lightning(v 0.9.0)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/04 08:45