GAN学习 ACGAN TensorFlow代码解读_acgan代码

收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。
img
img

如果你需要这些资料,可以戳这里获取

需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人

都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

    plt.imshow(sample.reshape(28, 28), cmap='Greys_r')  # cmp:

return fig

**line 37-40 定义xavier 初始化函数**



def xavier_init(size):
in_dim = size[0]
xavier_stddev = 1. / tf.sqrt(in_dim / 2.)
return tf.random_normal(shape=size, stddev=xavier_stddev)


**line 43-45 定义占位符**



X = tf.placeholder(tf.float32, shape=[None, X_dim])
y = tf.placeholder(tf.float32, shape=[None, y_dim])
z = tf.placeholder(tf.float32, shape=[None, z_dim])


**line 47-66 定义D & G**



G_W1 = tf.Variable(xavier_init([z_dim + y_dim, h_dim]))
G_b1 = tf.Variable(tf.zeros(shape=[h_dim]))
G_W2 = tf.Variable(xavier_init([h_dim, X_dim]))
G_b2 = tf.Variable(tf.zeros(shape=[X_dim]))

def generator(z, c):
inputs = tf.concat(axis=1, values=[z, c]) # ACGAN 把噪音和标签concat作为G的输入
G_h1 = tf.nn.relu(tf.matmul(inputs, G_W1) + G_b1)
G_log_prob = tf.matmul(G_h1, G_W2) + G_b2 # logit值
G_prob = tf.nn.sigmoid(G_log_prob) # 返回图像G_prob
return G_prob

D_W1 = tf.Variable(xavier_init([X_dim, h_dim]))
D_b1 = tf.Variable(tf.zeros(shape=[h_dim]))
D_W2_gan = tf.Variable(xavier_init([h_dim, 1])) # 判断0/1的GAN的Weight
D_b2_gan = tf.Variable(tf.zeros(shape=[1])) # 判断0/1的GAN的Bias
D_W2_aux = tf.Variable(xavier_init([h_dim, y_dim])) # 判断类别 Weight
D_b2_aux = tf.Variable(tf.zeros(shape=[y_dim])) # 判断类别 Bias

def discriminator(X):
D_h1 = tf.nn.relu(tf.matmul(X, D_W1) + D_b1)
out_gan = tf.nn.sigmoid(tf.matmul(D_h1, D_W2_gan) + D_b2_gan) # 输出fake/real 的概率值
out_aux = tf.matmul(D_h1, D_W2_aux) + D_b2_aux # 输出class 的概率值
return out_gan, out_aux

theta_G = [G_W1, G_W2, G_b1, G_b2]
theta_D = [D_W1, D_W2_gan, D_W2_aux, D_b1, D_b2_gan, D_b2_aux]


**line 80-85 定义随机噪音函数 & 交叉熵函数**



def sample_z(m, n): # 产生随机噪音
return np.random.uniform(-1., 1., size=[m, n])

def cross_entropy(logit, y): #定义交叉熵
return -tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logit, labels=y))


**line 8`8`-85 定义随机噪音函数 & 交叉熵函数**



G_sample = generator(z, y) # G产生的fake image

D_real, C_real = discriminator(X)
D_fake, C_fake = discriminator(G_sample)

Cross entropy aux loss # 标签误差

C_loss = cross_entropy(C_real, y) + cross_entropy(C_fake, y)

GAN D loss

D_loss = tf.reduce_mean(tf.log(D_real + eps) + tf.log(1. - D_fake + eps)) # +eps 加上一个很小的数 防止为0
DC_loss = -(D_loss + C_loss)

GAN’s G loss

G_loss = tf.reduce_mean(tf.log(D_fake + eps))
GC_loss = -(G_loss + C_loss)

D_solver = (tf.train.AdamOptimizer(learning_rate=lr)
.minimize(DC_loss, var_list=theta_D))
G_solver = (tf.train.AdamOptimizer(learning_rate=lr)
.minimize(GC_loss, var_list=theta_G))


**line 88-108 (ACGAN的关键部分) 定义D&G的loss [DC\_loss, GC\_loss]**


用Adam优化器优化G\D参数



G_sample = generator(z, y) # G产生的fake image

D_real, C_real = discriminator(X)
D_fake, C_fake = discriminator(G_sample)

Cross entropy aux loss # 标签误差

C_loss = cross_entropy(C_real, y) + cross_entropy(C_fake, y)

GAN D loss

D_loss = tf.reduce_mean(tf.log(D_real + eps) + tf.log(1. - D_fake + eps)) # +eps 加上一个很小的数 防止为0
DC_loss = -(D_loss + C_loss)

GAN’s G loss

G_loss = tf.reduce_mean(tf.log(D_fake + eps))
GC_loss = -(G_loss + C_loss)

D_solver = (tf.train.AdamOptimizer(learning_rate=lr)
.minimize(DC_loss, var_list=theta_D))
G_solver = (tf.train.AdamOptimizer(learning_rate=lr)
.minimize(GC_loss, var_list=theta_G))


**line118-146 py主体运行部分**



or it in range(1000000):
X_mb, y_mb = mnist.train.next_batch(mb_size)
z_mb = sample_z(mb_size, z_dim) # 产生batch的噪音z

_, DC_loss_curr = sess.run(
    [D_solver, DC_loss],
    feed_dict={X: X_mb, y: y_mb, z: z_mb}
)

_, GC_loss_curr = sess.run(
    [G_solver, GC_loss],
    feed_dict={X: X_mb, y: y_mb, z: z_mb}
)

if it % 1000 == 0:
    idx = np.random.randint(0, 10)  # MNIST数据一共10类
    c = np.zeros([16, y_dim])
    c[range(16), idx] = 1  # 产生16个随机one-hot行向量

    samples = sess.run(G_sample, feed_dict={z: sample_z(16, z_dim), y: c})  # 用 it 次的G产生16张图像并plot

    print('Iter: {}; DC_loss: {:.4}; GC_loss: {:.4}; Idx: {}'
          .format(it, DC_loss_curr, GC_loss_curr, idx))

    fig = plot(samples)
    plt.savefig('out/{}.png'
                .format(str(idx)+'_'+str(i).zfill(3)), bbox_inches='tight')
    i += 1
    plt.close(fig)

GitHub地址如下:[ACGAN TensorFlow代码解读](https://bbs.csdn.net/topics/618679757)


### 小白总结如下


#### 1.接下来工作


* ACGAN 不同于 CGAN, 仅在生成器部分concat 标签和随机噪音,而在判别器处没有输入标签。后续可以从网络结构和目标函数处下手进行改进。
* 该代码没有记录G\D cost的图节点,去找tensorboard基础上的GAN实现,并照写。
* 自己的数据尝试。


#### 2.可借鉴的代码块写法



![img](https://img-blog.csdnimg.cn/img_convert/9ae26d2b2d2bd0e8ae7e6a44e79fbfa8.png)
![img](https://img-blog.csdnimg.cn/img_convert/b7d728f6598117a8fc281894814d6e9a.png)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

95%以上物联网嵌入式知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、电子书籍、讲解视频,并且后续会持续更新**

**需要这些体系化资料的朋友,可以加我V获取:vip1024c (备注嵌入式)**

**[如果你需要这些资料,可以戳这里获取](https://bbs.csdn.net/topics/618679757)**

  • 27
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CycleGAN是一个无监督的图像转换模型,可以将一种领域的图像转换成另一种领域的图像,而无需手动标注数据集。其核心思想是通过两个生成器和两个判别器,来实现两个领域之间的图像转换。下面我们来看一下CycleGAN的源代码解读。 CycleGAN的主要代码在`models`文件夹下,其中`cycle_gan_model.py`定义了CycleGAN的模型结构,`networks.py`定义了生成器和判别器的网络结构。其中生成器采用U-Net结构,判别器采用PatchGAN结构。`options`文件夹下的`base_options.py`定义了模型的一些基本参数,包括训练数据路径、模型保存路径、学习率等。`train_options.py`继承了`base_options.py`,并添加了一些训练相关的参数,比如迭代次数、是否使用L1损失等。`test_options.py`同样继承了`base_options.py`,并添加了一些测试相关的参数,比如测试数据路径、输出结果路径等。 在`train.py`文件中,我们可以看到CycleGAN的训练流程。首先定义了模型、数据加载器、优化器等,然后开始训练。在训练过程中,先通过生成器将A领域的图片转换成B领域的图片,然后将转换后的图片与B领域的真实图片送入判别器,计算判别器的损失。同时,也计算生成器的损失,包括对抗损失、循环一致性损失和L1损失。最后通过反向传播更新生成器和判别器的参数。 在`test.py`文件中,我们可以看到CycleGAN的测试流程。首先定义了模型和数据加载器,然后通过生成器将A领域的图片转换成B领域的图片,并将转换后的图片保存到输出结果路径中。 总之,CycleGAN的源代码实现了一个完整的无监督图像转换模型,包括模型结构、数据加载、训练和测试流程。如果想要深入了解CycleGAN,可以从源代码入手,逐步理解其实现原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值