想把tensor打印在log日志里是个有点麻烦的事情,因为只有string类型的才能接受。师兄建议试试numpy类型的打印,因为tensor与numpy类型可以容易的相互转换,然后发现无法用普通的方法直接打印numpy类型,陷入僵局之时查到numpy库中有一个函数专门用来将自己写进磁盘的txt文件中,曲线救国的通路终于打通。但是由于数据存储读写要用CPU,计算使用GPU,因此还要显式的将数据读写到CPU中。
提示如下:
File "./train.py", line 44, in <module>
visualizer.print_Tensor_encoded(epoch, epoch_iter, tensors)
File "/backup/cjh/BicycleGAN/util/visualizer.py", line 164, in print_Tensor_encoded
v.numpy()
RuntimeError: Can't call numpy() on Variable that requires grad. Use var.detach().numpy() instead.
然后:
File "/backup/cjh/BicycleGAN/util/visualizer.py", line 164, in print_Tensor_encoded
v.detach().numpy()
TypeError: can't convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.
成功代码如下:
def print_Tensor_encoded(self, epoch, i, tensors):
message = '(epoch: %d, iters: %d)' % (epoch, i)
for k, v in tensors.items():
with open(self.log_tensor_name, "a") as log_file:
v_cpu = v.cpu()
log_file.write('%s: ' % message)
np.savetxt(log_file, v_cpu.detach().numpy())
研究改写原代码的过程中总是能学到很多东西,BycleGAN代码的解耦思想真的是贯彻实现,功能分块,整洁的像自带注释。为了抽取编码的中间向量,为了改写visualizer部分,也需要把网络中每一部分的数据源头、流向、定义、调用、作用域搞的清清楚楚明明白白,果然有目的的实战才是学习最有效的方式,希望可以早日能提手写出一套完整的没毛病的复现代码。
10月12号 补充
'np.savetxt' 要求ndarray必须是大于0维的,至少1维,而一个标量直接使用'np.numpy()'会被转成0d的数组,所以这里用这个函数就不合适了
用:
if opt.test_msssim:
m = pytorch_msssim.msssim(fake_B, real_B)
sum_msssim += m
print(m)
m = np.atleast_1d(m)
with open("msssim.txt", "a") as log_file:
np.savetxt(log_file, m)
网友评论