一开始参考博客学习笔记:GAN和DCGAN入门 并在github上下载了代码。
根据该博主的教程直接上自己的数据集(很小,一百多张图片)
有几个令人头疼的bug:
目录
NameError: name 'j' is not defined
NameError: name 'j' is not defined
在该链接中找到了组织,也尝试按照大家都说好的解决办法修改
1,2觉得是有用的,但3还是有问题,而且觉得该解决方案给的程序问题很大,cropped_image压根没用啊为啥大家都说好?
于是继续找解决方案,又回到了一开始的博客中,发现po出的代码和现在github上的还是有很大的出入的,尤其是被大家改来改去的transform函数,好歹用上了cropped_image!于是果断复制粘贴,可以成功运行了
每次训练生成的图片呢?
这里一开可能是我没有理解原程序的规则,以为每个epoch都会有图片,而我都训练到了五十多了sample还是空的,就觉得很绝望,到处找解决办法,发现了另一个博客(强推!!),其中po出了四个py文件的全部代码,发现与自己的也有很大出入,于是再一次复制粘贴,解决了一个小bug:main.py中line14改成
flags.DEFINE_float("train_size", np.inf, "The size of train images [np.inf]")
有图片了!然而似乎都是训练后生成的test图片,不是文章中那样的训练过程中生成的图片。
冷静分析,总结如下:
1. 在model.py line288中原程序规定每100个batch保存一次训练图片,而自己的样本数太少,故图像生成频率过低或干脆不生成训练过程中的图像!(可能之前的程序并没问题hhh)
if np.mod(counter, 100) == 1:
2. batch_size需要为完全平方数,不然会出现one_pic_error的报错,也可以根据网友说的修改utils.py的代码:
def image_manifold_size(num_images):
#manifold_h = int(np.floor(np.sqrt(num_images)))
#manifold_w = int(np.ceil(np.sqrt(num_images)))
manifold_w = int(16)
manifold_h = int(num_images/16)
assert manifold_h * manifold_w == num_images
return manifold_h, manifold_w
不懂为什么要是16,应该可以改成别的。 最后打算就用64作为batch_size算了,然后修改生成sample的频率为10
if np.mod(counter, 10) == 1:
自动load之前的checkpoint
如果不是真的要基于前面的训练结果再训练,就把之前的 checkpoint文件删除再重新训练
如何查看训练过程中的损失曲线
一开始以为程序中并没有相关代码,才发现其实是在ops.py中用到了tensorflow自带的tensorboard功能,见https://blog.csdn.net/duanlianvip/article/details/98498826
然而报错:ImportError: cannot import name '_message'
根据文章在cmd输入