TensorFlow实现GAN时常用函数

TensorFlow实现GAN时常用函数

1、tf.random_normal() 函数用于从服从指定正太分布的数值中取出指定个数的值。

  tf.random_normal(shape,mean, stddev) 
  mean: 正态分布的均值,默认为0,stddev: 正态分布的标准差,默认为1.0;

2、tf.random_uniform(shape, minval, maxval)#从均匀分布中输出随机值.随机值在[minval, maxval)之间;

3、tf.variable_scope() 用来指定变量的作用域,,支持嵌套

with tf.variable_scope("g_deconv0",reuse=None):指定该卷积层作用域是g_deconv0,
当前环境的作用域可以通过函数 **tf.get_variable_scope()**获取。
reuse有三种取值:None,True,AUTO_REUSE
	None:创建函数tf.get_variable()函数只能创建新的变量,当同名变量已经存在时,函数就报错;
	True:即该空间下的所有tf.get_variable()函数将直接获取已经创建的变量,如果参数不存在tf.get_variable()函数将会报错;
	AUTO_REUSE:若参数空间的参数不存在就创建他们,如果已经存在就直接获取它们。

4、tf.get_variable_scope(name,shape,dtype,initializer,trainable):获取已经存在的变量,如果不存在,就新建一个

initializer:初始化值,可以使用各种初始化方法;
trainable:是否训练变量,bool类型:True训练,False不训练。

5、tf.truncated_normal_initializer(mean,stddev,seed,dtype):从截断的正态分布中输出随机值。 生成的值服从具有指定平均值和标准偏差的正态分布,如果生成的值大于平均值2个标准偏差的值则丢弃重新选择

mean:要生成的随机值的均值;
stddev:要生成的随机值的标准偏差;
seed:于创建随机种子.

6、tf.nn.conv2d_transpose(x, W, output_shape, strides=[1, stride_h, stride_w, 1], padding=padding):反卷积操作

第一个参数:指需要做反卷积的输入图像
第二个参数:卷积核
第三个参数output_shape:反卷积操作输出的shape,
第四个参数strides:反卷积时在图像每一维的步长
第五个参数padding:string类型的量,只能是"SAME","VALID"其中之一

7、tensorflow.contrib.layers.batch_norm():tensorflow中批量归一化(BN)的简单用法

8、tf.nn.conv2d(input, filter, strides, padding):卷积操作

9、tf.reduce_mean():求平均值,第一个参数是一个集合;第二个参数指定在哪个维度上面求平均值。

10、tf.nn.sigmoid_cross_entropy_with_logits(_sentinel=None,labels=None,logits=None,name=None):对于给定的logits计算sigmoid的交叉熵,

11、**tf.ones_like()**函数可以让您在TensorFlow中创建一个将所有元素都设置为1的张量,

12、tf.trainable_variables():返回所有可训练的变量。

13、compute_gradients(loss,var_list)函数:计算loss中可训练的var_list中的梯度,返回(gradient, variable)对的list

14、tf.clip_by_norm(grad, clip_norm):对梯度进行裁剪,通过控制梯度的最大范式,防止梯度爆炸的问题,grad输入的梯度,clip_norm裁剪率

15、tf.clip_by_value(v,a,b) :可以将一个张量中的数值限制在一个范围之内。

v:input数据,a、b是对数据的限制。
当v小于a时,输出a; 
当v大于a小于b时,输出原值; 
当v大于b时,输出b;

16、tf.nn.moments():函数本身是用来计算均值mean和方差var,使用在BN中

17、tf.layers.flatten(inputs):在保留第0轴的情况下对输入的张量进行Flatten(扁平化)

18、tf.GraphKeys:包含所有graph collection中的标准集合名,创建图的过程中,TensorFlow的Python底层会自动用一些collection对op进行归类,方便之后的调用。这部分collection的名字被称为tf.GraphKeys。

**GLOBAL_VARIABLES**: 该collection默认加入所有的Variable对象,并且在分布式环境中共享。
**tf.GraphKeys.GLOBAL_VARIABLES**

19、tf.get_collection() 返回当前计算图中手动添加的张量集合

 g_vars=tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='generator')
 d_vars=tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='discriminator')
TensorFlow实现CycleGAN的步骤大致如下: 1.准备数据集:收集苹果和橙子的图片,将它们分别放在两个文件夹中。 2.构建模型:使用TensorFlow中的Keras API,构建一个CycleGAN模型。CycleGAN由两个生成器和两个判别器组成。其中,一个生成器将苹果图片转换为橙子图片,另一个生成器将橙子图片转换为苹果图片;两个判别器用于判别生成的图片是否真实。 3.定义损失函数:CycleGAN使用对抗损失函数和循环一致性损失函数。对抗损失函数用于训练判别器,循环一致性损失函数用于训练生成器。 4.训练模型:使用定义的损失函数,训练CycleGAN模型。在训练过程中,生成器和判别器交替训练。 5.测试模型:使用训练好的CycleGAN模型,将测试集中的苹果图片转换为橙子图片,或将测试集中的橙子图片转换为苹果图片。 下面是一个示例代码,实现了苹果和橙子的转换: ``` import tensorflow as tf from tensorflow import keras from tensorflow.keras import layers # 构建生成器 def make_generator_model(): model = keras.Sequential() model.add(layers.Dense(7*7*256, use_bias=False, input_shape=(100,))) model.add(layers.BatchNormalization()) model.add(layers.LeakyReLU()) model.add(layers.Reshape((7, 7, 256))) assert model.output_shape == (None, 7, 7, 256) model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False)) assert model.output_shape == (None, 7, 7, 128) model.add(layers.BatchNormalization()) model.add(layers.LeakyReLU()) model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False)) assert model.output_shape == (None, 14, 14, 64) model.add(layers.BatchNormalization()) model.add(layers.LeakyReLU()) model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh')) assert model.output_shape == (None, 28, 28, 1) return model # 构建判别器 def make_discriminator_model(): model = keras.Sequential() model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same', input_shape=[28, 28, 1])) model.add(layers.LeakyReLU()) model.add(layers.Dropout(0.3)) model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same')) model.add(layers.LeakyReLU()) model.add(layers.Dropout(0.3)) model.add(layers.Flatten()) model.add(layers.Dense(1)) return model # 定义损失函数 cross_entropy = keras.losses.BinaryCrossentropy(from_logits=True) def discriminator_loss(real_output, fake_output): real_loss = cross_entropy(tf.ones_like(real_output), real_output) fake_loss = cross_entropy(tf.zeros_like(fake_output), fake_output) total_loss = real_loss + fake_loss return total_loss def generator_loss(fake_output): return cross_entropy(tf.ones_like(fake_output), fake_output) # 定义优化器 generator_optimizer = keras.optimizers.Adam(1e-4) discriminator_optimizer = keras.optimizers.Adam(1e-4) # 实例化生成器和判别器 generator = make_generator_model() discriminator = make_discriminator_model() # 训练模型 @tf.function def train_step(images): noise = tf.random.normal([BATCH_SIZE, 100]) with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape: generated_images = generator(noise, training=True) real_output = discriminator(images, training=True) fake_output = discriminator(generated_images, training=True) gen_loss = generator_loss(fake_output) disc_loss = discriminator_loss(real_output, fake_output) gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables) gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables) generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables)) discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables)) # 测试模型 def generate_and_save_images(model, epoch, test_input): predictions = model(test_input, training=False) fig = plt.figure(figsize=(4, 4)) for i in range(predictions.shape[0]): plt.subplot(4, 4, i+1) plt.imshow(predictions[i, :, :, 0] * 127.5 + 127.5, cmap='gray') plt.axis('off') plt.savefig('image_at_epoch_{:04d}.png'.format(epoch)) plt.show() # 加载数据集 train_images = load_apple_orange_dataset() # 训练模型 for epoch in range(EPOCHS): for batch in train_dataset: train_step(batch) if epoch % 15 == 0: generate_and_save_images(generator, epoch + 1, seed)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值