`### 前提・実現したいこと
Windows10のGoogle colabolatory上で無料でGPUを使い機械学習を行っています。言語はpython3、機械学習フレームワークはPytorchです。Cycleganのコードを実装し、Google driveをマウントしました。マウントしたMydrive/photo2portrait/train/A Mydrive/photo2portrait/train/BのようにAとBというファルダ(データセット)2つを入力として画像のスタイル変換を行おうとしています。そこでGoogle colabでCycleGANを行うための書籍の付録のコードを実行したところ、エラーが出てしまいました。#データローダーの箇所のコードでエラーが起きました。
発生している問題・エラーメッセージ
ValueError: num_samples should be a positive integer value, but got num_samples=0
こちらがエラー内容です。
# 生成器 netG_A2B = Generator(opt.input_nc, opt.output_nc) netG_B2A = Generator(opt.output_nc, opt.input_nc) # 識別器 netD_A = Discriminator(opt.input_nc) netD_B = Discriminator(opt.output_nc) # GPU if not opt.cpu: netG_A2B.cuda() netG_B2A.cuda() netD_A.cuda() netD_B.cuda() # 重みパラメータ初期化 netG_A2B.apply(weights_init_normal) netG_B2A.apply(weights_init_normal) netD_A.apply(weights_init_normal) netD_B.apply(weights_init_normal) # 保存したモデルのロード if opt.load_weight is True: netG_A2B.load_state_dict(torch.load("./output/netG_A2B.pth", map_location="cuda:0"), strict=False) netG_B2A.load_state_dict(torch.load("./output/netG_B2A.pth", map_location="cuda:0"), strict=False) netD_A.load_state_dict(torch.load("./output/netD_A.pth", map_location="cuda:0"), strict=False) netD_B.load_state_dict(torch.load("./output/netD_B.pth", map_location="cuda:0"), strict=False) # 損失関数 criterion_GAN = torch.nn.MSELoss() criterion_cycle = torch.nn.L1Loss() criterion_identity = torch.nn.L1Loss() # Optimizers & LR schedulers optimizer_G = torch.optim.Adam(itertools.chain(netG_A2B.parameters(), netG_B2A.parameters()), lr=opt.lr, betas=(0.5, 0.999)) optimizer_D_A = torch.optim.Adam(netD_A.parameters(), lr=opt.lr, betas=(0.5, 0.999)) optimizer_D_B = torch.optim.Adam(netD_B.parameters(), lr=opt.lr, betas=(0.5, 0.999)) lr_scheduler_G = torch.optim.lr_scheduler.LambdaLR(optimizer_G, lr_lambda=LambdaLR(opt.n_epochs, opt.start_epoch, opt.decay_epoch).step) lr_scheduler_D_A = torch.optim.lr_scheduler.LambdaLR(optimizer_D_A, lr_lambda=LambdaLR(opt.n_epochs, opt.start_epoch, opt.decay_epoch).step) lr_scheduler_D_B = torch.optim.lr_scheduler.LambdaLR(optimizer_D_B, lr_lambda=LambdaLR(opt.n_epochs, opt.start_epoch, opt.decay_epoch).step) # 入出力メモリ確保 Tensor = torch.cuda.FloatTensor if not opt.cpu else torch.Tensor input_A = Tensor(opt.batch_size, opt.input_nc, opt.size, opt.size) input_B = Tensor(opt.batch_size, opt.output_nc, opt.size, opt.size) target_real = Variable(Tensor(opt.batch_size).fill_(1.0), requires_grad=False) target_fake = Variable(Tensor(opt.batch_size).fill_(0.0), requires_grad=False) # 過去データ分のメモリ確保 fake_A_buffer = ReplayBuffer() fake_B_buffer = ReplayBuffer() # データローダー transforms_ = [ transforms.Resize(int(opt.size*1.12), Image.BICUBIC), transforms.RandomCrop(opt.size), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5)) ] dataloader = DataLoader(ImageDataset(opt.dataroot, transforms_=transforms_, unaligned=True), batch_size=opt.batch_size, shuffle=True, num_workers=opt.n_cpu) print("num dataloader= {}".format(len(dataloader))) ここのdataloader = DataLoader(ImageDataset(opt.dataroot, transforms_=transforms_, unaligned=True), batch_size=opt.batch_size, shuffle=True, num_workers=opt.n_cpu) のところがエラー箇所です。 エラー内容は以下の通りです。 /usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:13: UserWarning: nn.init.normal is now deprecated in favor of nn.init.normal_. del sys.path[0] /usr/local/lib/python3.7/dist-packages/torchvision/transforms/transforms.py:281: UserWarning: Argument interpolation should be of type InterpolationMode instead of int. Please, use InterpolationMode enum. "Argument interpolation should be of type InterpolationMode instead of int. " --------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-16-f9c7f2243d46> in <module>() 60 transforms.Normalize((0.5,0.5,0.5), (0.5,0.5,0.5)) ] 61 dataloader = DataLoader(ImageDataset(opt.dataroot, transforms_=transforms_, unaligned=True), ---> 62 batch_size=opt.batch_size, shuffle=True, num_workers=opt.n_cpu) 63 64 print("num dataloader= {}".format(len(dataloader))) 1 frames /usr/local/lib/python3.7/dist-packages/torch/utils/data/sampler.py in __init__(self, data_source, replacement, num_samples, generator) 101 if not isinstance(self.num_samples, int) or self.num_samples <= 0: 102 raise ValueError("num_samples should be a positive integer " --> 103 "value, but got num_samples={}".format(self.num_samples)) 104 105 @property ValueError: num_samples should be a positive integer value, but got num_samples=0
試したこと
GPUの接続を切って何度も実行しましたがこのコードのままでは毎回同じエラーが出てしまいます。初心者のため、変更すべきところがわからないので困っています。
追記
本の名前はPytorchによる画像生成/画像変換のためのGANディープラーニング実装ハンドブック、その中でのCHAPTER5のsection5_2のCYCLEGANのコードを参考にしています。現在手元にないため、すみませんが、ページ数は分かりません。