EDIT icon indicating copy to clipboard operation
EDIT copied to clipboard

请教复现

Open Decalogue opened this issue 6 years ago • 33 comments

您好! 这个项目非常好!已 star 请问您的代码中部分目录例如 reference 里面的数据有吗?我用的 monet2photo 数据集,在修改了 train.py 里面的路径为自己的路径后,可以训练了.但是预测阶段 test.py 中 reference 目录里面的数据是没有提供下载的.请问您方便上传已经训练好的模型和 reference 里面的图片来让大家参考复现吗? 非常感谢!

Decalogue avatar Nov 26 '19 09:11 Decalogue

您好! 这个项目非常好!已 star 请问您的代码中部分目录例如 reference 里面的数据有吗?我用的 monet2photo 数据集,在修改了 train.py 里面的路径为自己的路径后,可以训练了.但是预测阶段 test.py 中 reference 目录里面的数据是没有提供下载的.请问您方便上传已经训练好的模型和 reference 里面的图片来让大家参考复现吗? 非常感谢!

您好!非常感谢您对我们工作的认可!目前不提供模型,不过欢迎您用我们的代码来进行训练,有什么疑问或建议欢迎与我们沟通。reference文件夹是我自己建的一个文件夹,用来进行各种图片的测试,这里面没有固定的图片,我会根据具体的需要往里面放图片。为了节省存储空间,我一般把reference里用不着的图片就删了,所以您可以把任何自己想要测试的图片放进去,或者改成自己的路径。

ForawardStar avatar Nov 26 '19 09:11 ForawardStar

@ForawardStar 请问epoch 3000 在 monet2photo 就能达到论文效果吗?还是需要更多 epoch? 另外 reference 需要和 testB 一一对应吗?多谢了!

Decalogue avatar Nov 26 '19 10:11 Decalogue

@ForawardStar 请问epoch 3000 在 monet2photo 就能达到论文效果吗?还是需要更多 epoch? 另外 reference 需要和 testB 一一对应吗?多谢了!

如果只有monet2photo数据集,train到200多个epoch应该就行,但如果同时train多个数据集,比如加上edge2shoes或者edge2handbags或者其他的数据集,那么就要train更多epoch。 reference和testB不需要一一对应

ForawardStar avatar Nov 26 '19 10:11 ForawardStar

请问 reference 里面是 photo 风格的图片吗?

Decalogue avatar Nov 26 '19 10:11 Decalogue

请问 reference 里面是 photo 风格的图片吗?

既可以使photo,也可以是paint。比如,如果输入图像是photo,需要把photo转换成paint,并用一个monet的图像做reference image(其他的叫法包括风格图,exemplar),那么就把paint放到reference文件夹里;同理,如果输入图像是paint就把photo放到reference文件夹里。其他的任务比如把线条转换成鞋、包,那个也可以把鞋/包的图像放到reference里。

ForawardStar avatar Nov 26 '19 10:11 ForawardStar

多谢了!请问其他参数如 batch_size 不用改吧?另外这个模型也适用于人脸风格或者属性转换吗?

Decalogue avatar Nov 26 '19 11:11 Decalogue

多谢了!请问其他参数如 batch_size 不用改吧?另外这个模型也适用于人脸风格或者属性转换吗?

不需要改,不过如果调一下参数效果可能会更好。cycleGAN的实现里面batch_size就是设的1,我直接用的它们的参数。人脸风格和属性转换理论上是可行的,不过我们还没有做过这方面的实验。如果可以的话,后面我们会再做一下相关的实验。

ForawardStar avatar Nov 26 '19 11:11 ForawardStar

非常感谢!

Decalogue avatar Nov 26 '19 11:11 Decalogue

reference 里面我放了3张 paint 风格图,train epoch 是 300, checkpoint_interval 是30,跑完在 testB 测试很模糊,不知我哪里弄错了

Decalogue avatar Nov 26 '19 11:11 Decalogue

reference 里面我放了3张 paint 风格图,train epoch 是 300, checkpoint_interval 是30,跑完在 testB 测试很模糊,不知我哪里弄错了

训练过程中的中间结果模糊吗(中间结果存在images/monet2photo/文件夹下),或者能不能上传一下模糊的图片

ForawardStar avatar Nov 26 '19 11:11 ForawardStar

我的 images/monet2photo/ 文件里好像没有图片,训练时不输出 loss 等信息,就是只有模型保存文件夹里有模型产生

Decalogue avatar Nov 26 '19 11:11 Decalogue

我的 images/monet2photo/ 文件里好像没有图片,训练时不输出 loss 等信息,就是只有模型保存文件夹里有模型产生

应该是每隔一定次数会保存中间结果的,并且loss在训练时会一直打印出来,我再检查一下代码

ForawardStar avatar Nov 26 '19 11:11 ForawardStar

正常应该是的.我检查了,发现我的 dataloader 长度为0,我的 datasets 目录下只有 monet2photo, 所以我把 datasets.py 里面 def getitem(self, index): label = random.randint(1, self.domains_num) 改为 label = 3 def len(self): # return max(len(self.sheos_files_A), len(self.sheos_files_B)) return max(len(self.monet_files), len(self.photo_files)) 这样改了.我没有 sheos_files_A/B 和 building_files_A/B 对应的目录

Decalogue avatar Nov 26 '19 11:11 Decalogue

这样训练一个 epoch 应该都需要一定时间吧?原来代码训练300epoch 不到20秒

Decalogue avatar Nov 26 '19 11:11 Decalogue

现在可以跑了.请问这个 sheos_files_A 应该是 shoes_files_A 吧?

Decalogue avatar Nov 26 '19 11:11 Decalogue

正常应该是的.我检查了,发现我的 dataloader 长度为0,我的 datasets 目录下只有 monet2photo, 所以我把 datasets.py 里面 def getitem(self, index): label = random.randint(1, self.domains_num) 改为 label = 3 def len(self):

return max(len(self.sheos_files_A), len(self.sheos_files_B))

return max(len(self.monet_files), len(self.photo_files)) 这样改了.我没有 sheos_files_A/B 和 building_files_A/B 对应的目录

好的,我的这个代码是在三个数据集上同时训练的,用那个label来标识不同的数据集,您如果只想在monet2photo数据集上训练,就没必要读另外两个数据集的图片

ForawardStar avatar Nov 26 '19 11:11 ForawardStar

这样训练一个 epoch 应该都需要一定时间吧?原来代码训练300epoch 不到20秒

这样的话训练一个数据集需要些时间,我估计大约两三天可以得到比较好的结果。之前如果训练300个epoch不到20秒肯定是不合理的

ForawardStar avatar Nov 26 '19 11:11 ForawardStar

请问这个支持多卡吗?

Decalogue avatar Nov 26 '19 11:11 Decalogue

现在可以跑了.请问这个 sheos_files_A 应该是 shoes_files_A 吧?

我这里好像是写错了,估计是我当时把这个数据集解压时的文件夹的命名就写错了。您可以把这个名字改成您自己的路径

ForawardStar avatar Nov 26 '19 11:11 ForawardStar

请问这个支持多卡吗?

可以用多线程,但我一直都是在一块GPU上训练

ForawardStar avatar Nov 26 '19 12:11 ForawardStar

谢谢您耐心的指导!我觉得这个论文和项目思路非常好,即利用多个领域又同一个框架

Decalogue avatar Nov 26 '19 12:11 Decalogue

请问多个领域数据集都有的话就是相当于混合训练同时利用了所有领域信息对吧?

Decalogue avatar Nov 26 '19 12:11 Decalogue

谢谢您耐心的指导!我觉得这个论文和项目思路非常好,即利用多个领域又同一个框架

谢谢您,这是应该的。您也给我们提供了优化代码的方向,后期我也会根据您的反馈优化一下代码

ForawardStar avatar Nov 26 '19 12:11 ForawardStar

请问多个领域数据集都有的话就是相当于混合训练同时利用了所有领域信息对吧?

相当于用一个模型能够学习到多个域(比如monet油画,照片,线条或鞋)的特征分布,不需要为每个数据集分别独立的训练一个模型,只需要用一个公用的模型即可。

ForawardStar avatar Nov 26 '19 12:11 ForawardStar

请问这个操作能保证遍历到所有数据吗? def getitem(self, index): label = random.randint(1, self.domains_num)

Decalogue avatar Nov 26 '19 12:11 Decalogue

请问这个操作能保证遍历到所有数据吗? def getitem(self, index): label = random.randint(1, self.domains_num)

def getitem(self, index):可以遍历到所有数据,这是pytorch内置的一个函数。label = random.randint(1, self.domains_num)是用来随机生成一个label,这个label是用来标识不同的数据集,跟能否遍历某个数据集里所有的图片没关系。后期我会再提供一个更详细的使用说明。

ForawardStar avatar Nov 26 '19 12:11 ForawardStar

那这个就是能保证遍历数据集长度的数据,但是每次是由哪个 label 对应出来的是随机的对吧?那这样就是遍历的数据 = 1/domains_num * 所有数据集总数据 吗?

Decalogue avatar Nov 26 '19 12:11 Decalogue

那这个就是能保证遍历数据集长度的数据,但是每次是由哪个 label 对应出来的是随机的对吧?那这样就是遍历的数据 = 1/domains_num * 所有数据集总数据 吗?

是的。如果有多个数据集的话,在一个epoch遍历的数据不是 1/domains_num * 所有数据集总数据,而是某个数据集的长度,由这段代码计算return max(len(self.monet_files), len(self.photo_files)) (其实这里代码写的不太严谨,这里就是用monet2photo这个数据集的长度所有数据集长度)。不确定一个epoch是否能 遍历某个数据集的所有数据,但多train几个epoch,每个数据集的全部数据应该会被至少读入过一次。 。

ForawardStar avatar Nov 26 '19 12:11 ForawardStar

您好!请问 datasets.py 里面的 domains_num 是 有多少个领域数据集就设置多少吗?还有 label 是从1 到domains_num 吗? models.py 中的 index0 = torch.cuda.FloatTensor([torch.mean(label[0][0])]) index1 = torch.cuda.FloatTensor([torch.mean(label[0][1])]) index2 = torch.cuda.FloatTensor([torch.mean(label[0][2])]) index3 = torch.cuda.FloatTensor([torch.mean(label[0][3])]) 这个的数目是 domains_num+1还是不管对多少个领域都是0,1,2,3? 多谢了!

Decalogue avatar Dec 01 '19 03:12 Decalogue

您好!请问 datasets.py 里面的 domains_num 是 有多少个领域数据集就设置多少吗?还有 label 是从1 到domains_num 吗? models.py 中的 index0 = torch.cuda.FloatTensor([torch.mean(label[0][0])]) index1 = torch.cuda.FloatTensor([torch.mean(label[0][1])]) index2 = torch.cuda.FloatTensor([torch.mean(label[0][2])]) index3 = torch.cuda.FloatTensor([torch.mean(label[0][3])]) 这个的数目是 domains_num+1还是不管对多少个领域都是0,1,2,3? 多谢了!

datasets.py里的self.domain_num设成数据集的个数。models.py里的index个数是domain_num+1

ForawardStar avatar Dec 01 '19 07:12 ForawardStar