import numpy as np import tensorflow as tf import matplotlib.pyplot as plt import glob %matplotlib inline 复制代码
H:\Anaconda\lib\site-packages\h5py\__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`. from ._conv import register_converters as _register_converters 复制代码
print("TensorFlow Version: {}".format(tf.__version__)) 复制代码
TensorFlow Version: 1.8.0 复制代码
Generator
def generator(inputs_real, is_train=True, alpha=0.01, name="generator"): # 256*256*3 with tf.variable_scope(name, reuse=(not is_train)): # 128*128*64 conv1 = tf.layers.conv2d(inputs_real, 64, (3,3), padding='same') conv1 = tf.nn.relu(conv1) conv1 = tf.layers.max_pooling2d(conv1, (2,2), (2,2), padding='same') # 64*64*128 conv2 = tf.layers.conv2d(conv1, 128, (3,3), padding='same') conv2 = tf.nn.relu(conv2) conv2 = tf.layers.max_pooling2d(conv2, (2,2), (2,2), padding='same') # 32*32*256 conv3 = tf.layers.conv2d(conv2, 256, (3,3), padding='same') conv3 = tf.nn.relu(conv3) conv3 = tf.layers.max_pooling2d(conv3, (2,2), (2,2), padding='same') # 16*16*512 conv4 = tf.layers.conv2d(conv3, 512, (3,3), padding='same') conv4 = tf.nn.relu(conv4) conv4 = tf.layers.max_pooling2d(conv4, (2,2), (2,2), padding='same') # 8*8*512 conv5 = tf.layers.conv2d(conv4, 512, (3,3), padding='same') conv5 = tf.nn.relu(conv5) conv5 = tf.layers.max_pooling2d(conv5, (2,2), (2,2), padding='same') # 4*4*512 conv6 = tf.layers.conv2d(conv5, 512, (3,3), padding='same') conv6 = tf.nn.relu(conv6) conv6 = tf.layers.max_pooling2d(conv6, (2,2), (2,2), padding='same') # 2*2*512 conv7 = tf.layers.conv2d(conv6, 512, (3,3), padding='same') conv7 = tf.nn.relu(conv7) conv7 = tf.layers.max_pooling2d(conv7, (2,2), (2,2), padding='same') # 1*1*512 conv8 = tf.layers.conv2d(conv7, 512, (3,3), padding='same') conv8 = tf.nn.relu(conv8) conv8 = tf.layers.max_pooling2d(conv8, (2,2), (2,2), padding='same') # 2*2*512 conv9 = tf.layers.conv2d_transpose(conv8, 512, 3, strides=2, padding='same') conv9 = tf.layers.batch_normalization(conv9, training=is_train) conv9 = tf.nn.relu(conv9) conv9 = tf.nn.dropout(conv9, keep_prob=0.5) # 4*4*512 conv10 = tf.concat([conv9,conv7], 3) conv10 = tf.layers.conv2d_transpose(conv10, 512, 3, strides=2, padding='same') conv10 = tf.layers.batch_normalization(conv10, training=is_train) conv10 = tf.nn.relu(conv10) conv10 = tf.nn.dropout(conv10, keep_prob=0.5) # 8*8*512 conv11 = tf.concat([conv10,conv6], 3) conv11 = tf.layers.conv2d_transpose(conv11, 512, 3, strides=2, padding='same') conv11 = tf.layers.batch_normalization(conv11, training=is_train) conv11 = tf.nn.relu(conv11) conv11 = tf.nn.dropout(conv11, keep_prob=0.5) # 16*16*512 conv12 = tf.concat([conv11,conv5], 3) conv12 = tf.layers.conv2d_transpose(conv12, 512, 3, strides=2, padding='same') conv12 = tf.layers.batch_normalization(conv12, training=is_train) conv12 = tf.nn.relu(conv12) # 32*32*256 conv13 = tf.concat([conv12,conv4], 3) conv13 = tf.layers.conv2d_transpose(conv13, 256, 3, strides=2, padding='same') conv13 = tf.layers.batch_normalization(conv13, training=is_train) conv13 = tf.nn.relu(conv13) # 64*64*128 conv14 = tf.concat([conv13,conv3], 3) conv14 = tf.layers.conv2d_transpose(conv14, 128, 3, strides=2, padding='same') conv14 = tf.layers.batch_normalization(conv14, training=is_train) conv14 = tf.nn.relu(conv14) # 128*128*64 conv15 = tf.concat([conv14,conv2], 3) conv15 = tf.layers.conv2d_transpose(conv15, 64, 3, strides=2, padding='same') conv15 = tf.layers.batch_normalization(conv15, training=is_train) conv15 = tf.nn.relu(conv15) # 256*256*3 conv16 = tf.concat([conv15,conv1], 3) conv16 = tf.layers.conv2d_transpose(conv16, 3, 3, strides=2, padding='same') # conv16 = tf.layers.batch_normalization(conv16, training=is_train) # 图片归一化 outputs = tf.nn.tanh(conv16) return outputs 复制代码
Discriminator
def discriminator(inputs_image, reuse=False, alpha=0.01, name="discriminator"): with tf.variable_scope(name, reuse=reuse): layer1 = tf.layers.conv2d(inputs_image, 64, 3, strides=2, padding='same') layer1 = tf.layers.batch_normalization(layer1, training=True) layer1 = tf.maximum(alpha * layer1, layer1) layer2 = tf.layers.conv2d(layer1, 64, 3, strides=2, padding='same') layer2 = tf.layers.batch_normalization(layer2, training=True) layer2 = tf.maximum(alpha * layer2, layer2) layer3 = tf.layers.conv2d(layer2, 128, 3, strides=2, padding='same') layer3 = tf.layers.batch_normalization(layer3, training=True) layer3 = tf.maximum(alpha * layer3, layer3) layer4 = tf.layers.conv2d(layer3, 128, 3, strides=2, padding='same') layer4 = tf.layers.batch_normalization(layer4, training=True) layer4 = tf.maximum(alpha * layer4, layer4) layer5 = tf.layers.conv2d(layer4, 256, 3, strides=2, padding='same') layer5 = tf.layers.batch_normalization(layer5, training=True) layer5 = tf.maximum(alpha * layer5, layer5) layer6 = tf.layers.conv2d(layer5, 256, 3, strides=2, padding='same') layer6 = tf.layers.batch_normalization(layer6, training=True) layer6 = tf.maximum(alpha * layer6, layer6) layer7 = tf.layers.conv2d(layer6, 512, 3, strides=2, padding='same') layer7 = tf.layers.batch_normalization(layer7, training=True) layer7 = tf.maximum(alpha * layer7, layer7) flatten = tf.reshape(layer7, (-1, 2*2*512)) logits = tf.layers.dense(flatten, 1) outputs = tf.sigmoid(logits) return logits, outputs 复制代码
Loss
def get_loss(inputs_images, inputs_cartoons, smooth=0.1): fake_cartoons = generator(inputs_images, name="generatorI2C") fake_images_ = generator(fake_cartoons, name="generatorC2I") fake_images = generator(inputs_cartoons, False, name="generatorC2I") fake_cartoons_ = generator(fake_images, False, name="generatorI2C") discriminator_cartoon_fake, cartoon_fake_logits = discriminator(fake_cartoons, reuse=False, name="discriminator_cartoon") discriminator_image_fake, image_fake_logits = discriminator(fake_images, reuse=False, name="discriminator_image") g_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=cartoon_fake_logits, labels=tf.ones_like(discriminator_cartoon_fake)*(1-smooth))) \ + tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=image_fake_logits, labels=tf.ones_like(discriminator_image_fake)*(1-smooth))) \ + tf.reduce_mean(tf.abs(inputs_images - fake_images_))\ + tf.reduce_mean(tf.abs(inputs_cartoons - fake_cartoons_)) discriminator_cartoon_real, cartoon_real_logits = discriminator(inputs_cartoons, reuse=True, name="discriminator_cartoon") discriminator_image_real, image_real_logits = discriminator(inputs_images, reuse=True, name="discriminator_image") d_cartoon_real_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=cartoon_real_logits, labels=tf.ones_like(discriminator_cartoon_real)*(1-smooth))) d_image_real_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=image_real_logits, labels=tf.ones_like(discriminator_image_real)*(1-smooth))) d_cartoon_fake_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=cartoon_fake_logits, labels=tf.zeros_like(discriminator_cartoon_fake)*(1-smooth))) d_image_fake_loss = tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(logits=image_fake_logits, labels=tf.zeros_like(discriminator_image_fake)*(1-smooth))) d_loss = d_cartoon_real_loss + d_image_real_loss + d_cartoon_fake_loss + d_image_fake_loss return g_loss, d_loss 复制代码
Optimizer
def get_optimizer(g_loss, d_loss, g_loss_tran, learning_rate=0.0001): train_vars = tf.trainable_variables() g_vars = [var for var in train_vars if var.name.startswith("generator")] d_vars = [var for var in train_vars if var.name.startswith("discriminator")] # Optimizer with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)): g_opt = tf.train.AdamOptimizer(learning_rate*5).minimize(g_loss, var_list=g_vars) d_opt = tf.train.AdamOptimizer(learning_rate).minimize(d_loss, var_list=d_vars) return g_opt, d_opt 复制代码
辅助函数,用来在迭代中显示图片
def plot_images(samples): samples = (samples + 1) / 2 fig, axes = plt.subplots(nrows=1, ncols=10, sharex=True, sharey=True, figsize=(10,1)) for img, ax in zip(samples, axes): ax.imshow(img) ax.get_xaxis().set_visible(False) ax.get_yaxis().set_visible(False) fig.tight_layout(pad=0) 复制代码
def show_generator_output(sess, samp_images): samples = sess.run(generator(samp_images, False , name="generatorI2C")) samples = sess.run(tf.reshape(samples, [-1, 256, 256, 3])) return samples 复制代码
Train
# 定义参数 beta1 = 0.4 learning_rate = 0.0001 复制代码
def train(): # 存储loss losses = [] steps = 1000 apple_list = glob.glob('./apple2orange/trainA/*.jpg') orange_list = glob.glob('./apple2orange/trainB/*.jpg') image_que = tf.train.slice_input_producer([apple_list, orange_list], shuffle=True) image_ = tf.read_file(image_que[0]) image = tf.image.decode_jpeg(image_, channels=3) image = tf.image.resize_image_with_crop_or_pad(image, 256, 256) new_img = tf.image.convert_image_dtype(image, tf.float32) new_img = new_img*2 -1 cartoon_ = tf.read_file(image_que[1]) cartoon = tf.image.decode_jpeg(cartoon_, channels=3) cartoon = tf.image.resize_image_with_crop_or_pad(cartoon, 256, 256) new_cartoon = tf.image.convert_image_dtype(cartoon, tf.float32) new_cartoon = new_cartoon*2 -1 batch_size = 10 capacity = 3 + 2 * batch_size image_batch, cartoon_batch = tf.train.batch([new_img, new_cartoon], batch_size=batch_size, capacity=capacity) g_loss, d_loss = get_loss(image_batch, cartoon_batch) g_train_opt, d_train_opt = get_optimizer(g_loss, d_loss, beta1, learning_rate) saver = tf.train.Saver() # model_file=tf.train.latest_checkpoint('../input/cycel-apple-to-orange') with tf.Session() as sess: # saver.restore(sess, model_file) coord = tf.train.Coordinator() threads = tf.train.start_queue_runners(coord=coord) sess.run(tf.global_variables_initializer()) # 迭代epoch for e in range(steps): # run optimizer _ = sess.run(d_train_opt) _ = sess.run(g_train_opt) if e % 100 == 0: # saver.save(sess,'./less96', global_step = e) train_loss_d = d_loss.eval() train_loss_g = g_loss.eval() losses.append((train_loss_d, train_loss_g)) # 显示图片 samples = show_generator_output(sess, image_batch) plot_images(samples) print("Epoch {}/{}....".format(e+1, steps), "Discriminator Loss: {:.4f}....".format(train_loss_d), "Generator Loss: {:.4f}....". format(train_loss_g)) saver.save(sess,'./less96',global_step = steps) coord.request_stop() coord.join(threads) 复制代码
with tf.Graph().as_default(): train() 复制代码
Epoch 1/1000.... Discriminator Loss: 2.9407.... Generator Loss: 2.3714.... Epoch 101/1000.... Discriminator Loss: 2.7470.... Generator Loss: 1.8382.... Epoch 201/1000.... Discriminator Loss: 2.6516.... Generator Loss: 1.6317.... Epoch 301/1000.... Discriminator Loss: 2.6107.... Generator Loss: 1.5520.... Epoch 401/1000.... Discriminator Loss: 2.6936.... Generator Loss: 1.5697.... Epoch 501/1000.... Discriminator Loss: 2.4914.... Generator Loss: 1.5345.... Epoch 601/1000.... Discriminator Loss: 2.4656.... Generator Loss: 1.5393.... Epoch 701/1000.... Discriminator Loss: 2.4099.... Generator Loss: 1.5304.... Epoch 801/1000.... Discriminator Loss: 2.3221.... Generator Loss: 1.4708.... Epoch 901/1000.... Discriminator Loss: 2.3139.... Generator Loss: 1.5180.... 复制代码
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- cycleGAN
- 深度有趣 | 20 CycleGAN性别转换
- CycleGAN通过在生成的图像中隐藏信息来学习作弊
- 官方资源帖!手把手教你在TensorFlow 2.0中实现CycleGAN,推特上百赞
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
程序员代码面试指南:IT名企算法与数据结构题目最优解
左程云 / 电子工业出版社 / 2015-9 / 79.00元
这是一本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一痛点,本书选取将近200道真实出现过的经典代码面试题,帮助广大程序员的面试准备做到万无一失。“刷”完本书后,你就是“题王”!__eol__本书采用题目+解答的方式组织内容,并把面试题类型相近或者解法相近的题目尽量放在一起,读者在学习本书时很容易看出面试题解法之间的联......一起来看看 《程序员代码面试指南:IT名企算法与数据结构题目最优解》 这本书的介绍吧!
HTML 压缩/解压工具
在线压缩/解压 HTML 代码
JS 压缩/解压工具
在线压缩/解压 JS 代码