在复现或者是说尝试运行代码的过程中,遇到了相当多的问题,并且都没有找到直接对应的解决方法,因此准备撰写一下在过程中遇到的问题,以及对应的解决方法,供大家参考,由于目前还在持续尝试中,因此先罗列出自己遇到的问题,后续找到解决方法后会更新文章。
相信搜到这篇文章的读者应该都多多少少看过GANimation这篇论文,具体就不介绍他的内容了。可以自己去看论文或者是看看讲述论文的网址例如这篇:
0.源代码地址
先把源代码地址放上,
1.训练问题
1.1.EmotioNet数据集问题
GANimation论文中说他们的模型是利用EmotioNet的数据集实现的,但是EmotioNet的数据集我到目前为止也给数据集团队发过邮件,找不到任何申请方式,但是在github上找到了一个项目是提供了30个epoch的GANimation预训练模型,而且还提供了一个剪裁好的数据集Celeba十分nice
2.代码问题
这部分问题,先讲述一下因为我在前面代码中插入了很多注释,可能行数有点问题,可以参看函数名称来找到对应的问题
2.1.'ascii' codec can't decode byte 0xe1 in position 0
完整的报错信息:
File "/root/autodl-fs/AU_detection/GANimation-master/data/dataset_aus.py", line 103, in _read_conds return pickle.load(f) UnicodeDecodeError: 'ascii' codec can't decode byte 0xe1 in position 0: ordinal not in range(128)
找了很多方法,最后可以参看stackoverflow中这个问题:
Pickle incompatibility of numpy arrays between Python 2 and 3 - Stack Overflowhttps://stackoverflow.com/questions/11305790/pickle-incompatibility-of-numpy-arrays-between-python-2-and-3也就是说这个问题的产生应该是由于python2和python3中numpy数组的pickle不兼容性导致的,可能ganimation当时团队的运行环境应该是py2.x但是现在不都是py3.x了,就会产生这个问题,具体的修改方式:
在dataset_aus.py中Line 100 _read_conds这个函数修改为:
def _read_conds(self, file_path):
with open(file_path, 'rb') as f:
return pickle.load(f, encoding='latin1') #修改为这个而不是原来的encoding方式
#return pickle.load(f)
2.2 invalid index of a 0-dim tensor
完整的报错信息:
File "/root/autodl-fs/AU_detection/GANimation-master/models/ganimation.py", line 401, in get_current_errors ('g_m1_s', self._loss_g_mask_1_smooth.data[0]), IndexError: invalid index of a 0-dim tensor. Use `tensor.item()` in Python or `tensor.item<T>()` in C++ to convert a 0-dim tensor to a number
这部分可以将ganimation.py中Line 383 get_current_errors函数的修改成这样,
def get_current_errors(self):
'''获取目前的损失误差'''
loss_dict = OrderedDict([('g_fake', self._loss_g_fake.data[0]),
('g_cond', self._loss_g_cond.data[0]),
('g_mskd_fake', self._loss_g_masked_fake.data),
#('g_mskd_fake', self._loss_g_masked_fake.data[0]),
('g_mskd_cond', self._loss_g_masked_cond.data),
#('g_mskd_cond', self._loss_g_masked_cond.data[0]),
('g_cyc', self._loss_g_cyc.data),
#('g_cyc', self._loss_g_cyc.data[0]),
('g_rgb', self._loss_rec_real_img_rgb.data[0]),
('g_rgb_un', self._loss_g_unmasked_rgb.data[0]),
('g_rgb_s', self._loss_g_fake_imgs_smooth.data[0]),
('g_m1', self._loss_g_mask_1.data),
#('g_m1', self._loss_g_mask_1.data[0]),
('g_m2', self._loss_g_mask_2.data),
#('g_m2', self._loss_g_mask_2.data[0]),
('g_m1_s', self._loss_g_mask_1_smooth.data),
#('g_m1_s', self._loss_g_mask_1_smooth.data[0]),
('g_m2_s', self._loss_g_mask_2_smooth.data),
#('g_m2_s', self._loss_g_mask_2_smooth.data[0]),
('g_idt', self._loss_g_idt.data[0]),
('d_real', self._loss_d_real.data),
#('d_real', self._loss_d_real.data[0]),
('d_cond', self._loss_d_cond.data),
#('d_cond', self._loss_d_cond.data[0]),
('d_fake', self._loss_d_fake.data),
#('d_fake', self._loss_d_fake.data[0]),
('d_gp', self._loss_d_gp.data)])
#('d_gp', self._loss_d_gp.data[0])])
return loss_dict
2.3 Cannot handle this data type
完整的报错信息:
File "/root/autodl-fs/AU_detection/GANimation-master/utils/tb_visualizer.py", line 39, in display_current_results self._writer.add_image(sum_name, image_numpy, it) File "/root/miniconda3/lib/python3.8/site-packages/tensorboardX/writer.py", line 667, in add_image image(tag, img_tensor, dataformats=dataformats), global_step, walltime) File "/root/miniconda3/lib/python3.8/site-packages/tensorboardX/summary.py", line 288, in image image = make_image(tensor, rescale=rescale) File "/root/miniconda3/lib/python3.8/site-packages/tensorboardX/summary.py", line 328, in make_image image = Image.fromarray(tensor) File "/root/miniconda3/lib/python3.8/site-packages/PIL/Image.py", line 2830, in fromarray raise TypeError("Cannot handle this data type: %s, %s" % typekey) from e TypeError: Cannot handle this data type: (1, 1, 480), |u1
这部分是由于pytorch版本的问题,用目前版本的pytorch会有这样的问题,可以按如下方式修改tb_visualizer.py中line 24 display_current_results函数:
def display_current_results(self, visuals, it, is_train, save_visuals=False):
for label, image_numpy in visuals.items():
sum_name = '{}/{}'.format('Train' if is_train else 'Test', label)
#self._writer.add_image(sum_name, image_numpy, it)
self._writer.add_image(sum_name, np.transpose(image_numpy,(2,0,1)), it)
if save_visuals:
util.save_image(image_numpy,
os.path.join(self._opt.checkpoints_dir, self._opt.name,
'event_imgs', sum_name, '%08d.png' % it))
self._writer.export_scalars_to_json(self._tb_path)
2.4 no attribute 'iteritems', 'iterkeys'
完整的报错信息:
File "train.py", line 151, in _display_visualizer_val for k, v in errors.iteritems(): AttributeError: 'collections.OrderedDict' object has no attribute 'iteritems'
iterkeys也是这个问题:
这部分问题也是由于python2.x和python3.x中写法不同的问题,python3中没有iteritems/iterkeys这个对象了,去掉iter前缀即可
具体的修改方式train.py line131 _display_visualizer_val函数中:
for k in val_errors.keys():
#for k in val_errors.iterkeys(): 这是原始的
val_errors[k] /= self._opt.num_iters_validate
对应的,iteritems也这样修改
train.py我遇到的所有问题就是这些了
先写这几个问题,后续的问题再更新...
欢迎来找我讨论有关GANimation的问题!