TensorFlow/对抗网络DCGAN生成图片

源码:

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


报错:

No such file or directory: './data/mnist/train-images-idx3-ubyte'
应该是下载网页的数据集更改了

我把原来安装TensorFlow下载的数据移动到/DCGAN/data/mnist下,再修改一下命名,就没问题了,需要的朋友可以到TensorFlow官网的mnist教程下载


一开始会遇到这个:

 [*] Reading checkpoints...
 [*] Failed to find a checkpoint
 [!] Load failed...

但是好像并不是什么错误,它并不影响继续运行


训练了24个epoch的结果:

TensorFlow/对抗网络DCGAN生成图片_第1张图片


接着尝试用自己的图片训练,于是遇到了各式各样千奇百怪的错误

用的是ImageNet一个鸡的类,大概1300张

$python ./main.py --dataset /path/to/image --train --epoch 300

报错:

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万多张


大概能有一些样子,就是奇形怪状的很多

你可能感兴趣的:(TensorFlow)