源码:
https://github.com/carpedm20/DCGAN-tensorflow
原理可以直接参考论文
https://arxiv.org/abs/1511.06434
或者知乎的一个教程:
https://zhuanlan.zhihu.com/p/24767059
操作很简单,官方准备了两个数据集,mnist和celebA,都是需要下载的
$ python download.py mnist celebA
我下载celebA的时候遇到各种莫名其妙的问题,于是就放弃了。
尝试了一下mnist
下载好后
$ python main.py --dataset mnist --input_height=28 --output_height=28 --train
报错:
我把原来安装TensorFlow下载的数据移动到/DCGAN/data/mnist下,再修改一下命名,就没问题了,需要的朋友可以到TensorFlow官网的mnist教程下载
一开始会遇到这个:
[*] Reading checkpoints...
[*] Failed to find a checkpoint
[!] Load failed...
但是好像并不是什么错误,它并不影响继续运行
训练了24个epoch的结果:
接着尝试用自己的图片训练,于是遇到了各式各样千奇百怪的错误
用的是ImageNet一个鸡的类,大概1300张
报错:
ValueError: Trying to share variable discriminator/d_h4_lin/Matrix, but specified shape (8192, 1) and found shape (25088, 1).
大概就是图片的size有问题,训练的时候设置一下输入图片的sizeValueError: Trying to share variable discriminator/d_h4_lin/Matrix, but specified shape (8192, 1) and found shape (25088, 1).
$python ./main.py --dataset /path/to/image --input_height=80 --input_width=128 --output_height=80 --output_width=128 --train --epoch 300
如果只设置高就是默认宽和高一样
报错:
imreadImg = imread(self.data[0]);
IndexError: list index out of range
图片的格式不对,默认的图片是.jpg,格式是严格匹配的,.jpg和.JPEG也是不一样的
$python ./main.py --dataset /path/to/image --input_height=80 --input_width=128 --output_height=80 --output_width=128 --train --input_fname_pattern "*.JPEG" --epoch 300
报错:
ValueError: could not broadcast input array from shape (28,28,3) into shape (28,28)
说明你的图片有一些是RGB三通道的,有一些是灰度图,只有一个通道
方法一:
把所有图都转为灰度图imreadImg = imread(self.data[0]);
把model.py里
imreadImg = imread(self.data[0]);改为imreadImg = Image.open(self.data[0]).convert('L')
但是不要忘了先删除之前生成的checkpoint文件,否则会报错:
tensorflow.python.framework.errors_impl.InvalidArgumentError: Assign requires shapes of both tensors to match. lhs shape= [5,5,1,64] rhs shape= [5,5,3,64]
[[Node: save/Assign_47 = Assign[T=DT_FLOAT, _class=["loc:@generator/g_h4/w"], use_locking=true, validate_shape=true, _device="/job:localhost/replica:0/task:0/cpu:0"](generator/g_h4/w, save/RestoreV2_47)]]
因为之前运行的时候生成的文件是三通道的,现在是一通道
但是这么做也有一个问题,因为输入的图片是灰度图,所以产生的所有图片也都是灰度图,想要彩色图的朋友可以往下看
方法二
把灰度图删掉
因为ImageNet里大多数图都是彩色图,所以把少部分灰度图删掉就可以啦
imreadImg = imread(self.data[0]);后加上:
for im in self.data:
Img = imread(im)
if (Img.shape[-1]!=3):
print im
灰度图的路径就会被打印出来,一个个rm就可以啦
如果又想要灰度图又想要彩色图怎么办?
方法三:
把灰度图转为三通道,最简单的方法是读出灰度值,
R=G=B=灰度值
我比较懒,没有试过,欢迎试了的朋友分享一下
训练了300个epoch,只有简单的轮廓:
可能是样本太少了,只有1300,我又换了ImageNet中的狗,2万多张
大概能有一些样子,就是奇形怪状的很多