生死看淡,不服就GAN(八)----WGAN的改进版本WGAN-GP

WGAN的改进点和实操   包含三部分:1、WGAN改进点 2、代码修改 3、训练心得      一、WGAN的改进部分:      判别器最后一层去掉sigmoid (相当于最后一层做了一个y = x的激活)      生成器和判别器的loss不取log      每次更新判别器的参数之后把它们的绝对值截断到不超过一个固定常数c      不要用基于动量的优化算法(包括momentum和Adam),推荐RMS... 阅读详情
WGAN-GP是针对WGAN的存在的问题提出来的,WGAN在真实的实验过程中依旧存在着训练困难、收敛速度慢的 问题,相比较传统GAN在实验上提升不是很明显。WGAN-GP在文章中指出了WGAN存在问题的原因,那就是WGAN在处理Lipschitz限制条件时直接采用了 weight clipping。相关讲解请参考

WGAN-GP的介绍

同往期一样,依然以生成cifar数据集中马的彩色图片为例,关于cifar数据集的读取和生成器模型的验证请参考第6期:

用DCGAN生成马的彩色图片

下面给出WGAN-GP框架
"""
-------------------------------------------------------生死看淡,不服就GAN-------------------------------------------------------------------------
PROJECT: CIFAR10_WGAN-GP
Author: Ephemeroptera
Date:2019-3-19
QQ:605686962

"""
"""
WGAN说明:相比较WGAN,WGAN-GP提出以下改进:
                                        (1)用对判别器梯度惩罚取代WGAN的判决器权值区间截断
                                        (2)判别器取消BN操作
                                        (3)优化器使用ADAM
"""
# 导入包
import numpy as np
import tensorflow as tf
import pickle
import TFRecordTools
import time

############################################### 设置参数 ####################################################################################

real_shape = [-1,32,32,3] # 真实样本尺寸
data_total = 5000 # 真实样本个数
batch_size = 64 # 批大小
noise_size = 128 # 噪声维度
max_iters = 50000 #的最大迭代次数
learning_rate = 5e-5 # 学习率
beta1 = 0.5# ADAM参数1
beta2 = 0.9# ADAM参数2
CRITIC_NUM = 5 # 每次迭代判别器训练次数
lam = 10 #梯度惩罚权重

############################################# 定义生成器和判别器 #############################################################################

# 定义生成器(32x32图片)
def Generator_DC_32x32(z, channel, is_train=True):
    """
    :param z: 噪声信号,tensor类型
    :param channnel: 生成图片的通道数
    :param is_train: 是否为训练状态,该参数主要用于作为batch_normalization方法中的参数使用(训练时候开启)
    """
    # 训练时生成器不允许复用
    with tf.variable_scope("generator", reuse=(not is_train)):

        # layer1: noise_dim --> 4*4*512 --> 4x4x512 -->BN+relu
        layer1 = tf.layers.dense(z, 4 * 4 * 512)
        layer1 = tf.reshape(layer1, [-1, 4, 4, 512])
        layer1 = tf.layers.batch_normalization(layer1, training=is_train,)
        layer1 = tf.nn.relu(layer1)
        # layer1 = tf.nn.dropout(layer1, keep_prob=0.8)# dropout

        # layer2: deconv(ks=3x3,s=2,padding=same):4x4x512 --> 8x8x256 --> BN+relu
        layer2 = tf.layers.conv2d_transpose(layer1, 256, 3, strides=2, padding='same',
                                            kernel_initializer=tf.random_normal_initializer(0, 0.02),
                                            bias_initializer=tf.random_normal_initializer(0, 0.02))
        layer2 = tf.layers.batch_normalization(layer2, training=is_train)
        layer2 = tf.nn.relu(layer2)
        # layer2 = tf.nn.dropout(layer2, keep_prob=0.8)# dropout

        # layer3: deconv(ks=3x3,s=2,padding=same):8x8x256 --> 16x16x128 --> BN+relu
        layer3 = tf.layers.conv2d_transpose(layer2, 128, 3, strides=2, padding='same',
                                            kernel_initializer=tf.random_normal_initializer(0, 0.02),
                                            bias_initializer=tf.random_normal_initializer(0, 0.02))
        layer3 = tf.layers.batch_normalization(layer3, training=is_train)
        layer3 = tf.nn.relu(layer3)
        # layer3 = tf.nn.dropout(layer3, keep_prob=0.8)# dropout

        # layer4: deconv(ks=3x3,s=2,padding=same):16x16x128 --> 32x32x64--> BN+relu
        layer4 = tf.layers.conv2d_transpose(layer3, 64, 3, strides=2, padding='same',
                                            kernel_initializer=tf.random_normal_initializer(0, 0.02),
                                            bias_initializer=tf.random_normal_initializer(0, 0.02))
        layer4 = tf.layers.batch_normalization(layer4, training=is_train)
        layer4 = tf.nn.relu(layer4)
        # layer4 = tf.nn.dropout(layer3, keep_prob=0.8)# dropout

        # logits: deconv(ks=3x3,s=2,padding=same):32x32x64 --> 32x32x3
        logits = tf.layers.conv2d_transpose(layer4, channel, 3, strides=1, padding='same',
                                            kernel_initializer=tf.random_normal_initializer(0, 0.02),
                                            bias_initializer=tf.random_normal_initializer(0, 0.02))
        # outputs
        outputs = tf.tanh(logits)

        return logits,outputs

# 定义判别器(32x32)
def Discriminator_DC_32x32(inputs_img, reuse=False, GAN = False,GP= False,alpha=0.2):
    """
    @param inputs_img: 输入图片,tensor类型
    @param reuse:判别器复用
    @param GP: 使用WGAN-GP时关闭BN
    @param alpha: Leaky ReLU系数
    """

    with tf.variable_scope("discriminator", reuse=reuse):

        # layer1: conv(ks=3x3,s=2,padding=same)+lrelu -->32x32x3 to 16x16x128
        layer1 = tf.layers.conv2d(inputs_img, 128, 3, strides=2, padding='same')
        if GP is False:
            layer1 = tf.layers.batch_normalization(layer1, training=True)
        layer1 = tf.nn.leaky_relu(layer1,alpha=alpha)
        # layer1 = tf.nn.dropout(layer1, keep_prob=0.8)

        # layer2: conv(ks=3x3,s=2,padding=same)+BN+lrelu -->16x16x128 to 8x8x256
        layer2 = tf.layers.conv2d(layer1, 256, 3, strides=2, padding='same')
        if GP is False:
            layer2 = tf.layers.batch_normalization(layer2, training=True)
        layer2 = tf.nn.leaky_relu(layer2, alpha=alpha)
        # layer2 = tf.nn.dropout(layer2, keep_prob=0.8)

        # layer3: conv(ks=3x3,s=2,padding=same)+BN+lrelu -->8x8x256 to 4x4x512
        layer3 = tf.layers.conv2d(layer2, 512, 3, strides=2, padding='same')
        if GP is False:
            layer3 = tf.layers.batch_normalization(layer3, training=True)
        layer3 = tf.nn.leaky_relu(layer3, alpha=alpha)
        layer3 = tf.reshape(layer3, [-1, 4*4* 512])
        # layer3 = tf.nn.dropout(layer2, keep_prob=0.8)

        # logits,output:
        logits = tf.layers.dense(layer3, 1)
        "WGAN:去除sigmoid"
        if GAN:
            outputs = None
        else:
            outputs = tf.sigmoid(logits)

        return logits, outputs

############################################## 定义计算图(网络) #######################################################

#----------------------输入----------------

inputs_real = tf.placeholder(tf.float32, [None, real_shape[1], real_shape[2], real_shape[3]], name='inputs_real') # 真实样本输入
inputs_noise = tf.placeholder(tf.float32, [None, noise_size], name='inputs_noise') # 生成样本输入

#-------------------生成和判别--------------
# 生成样本
_,g_outputs = Generator_DC_32x32(inputs_noise, real_shape[3], is_train=True) # 训练生成器
_,g_test = Generator_DC_32x32(inputs_noise, real_shape[3], is_train=False) # 测试生成器
# 判别样本
'WGAN-GP:判别器废除批归一化'
d_logits_real, _ = Discriminator_DC_32x32(inputs_real,GAN=True,GP=True) #识别真样本
d_logits_fake, _ = Discriminator_DC_32x32(g_outputs,GAN=True,GP=True,reuse=True) #识别假样本

#------------定义原始GAN的损失函数--------------
"WGAN:损失函数去log,采用Wasserstein距离形式"
# 生成器
g_loss = tf.reduce_mean(-d_logits_fake)
# 判别器
d_loss = tf.reduce_mean(d_logits_fake - d_logits_real)
'WGAN-GP:加入判别器梯度惩罚项'
# 判别器梯度惩罚项
alpha_dist = tf.contrib.distributions.Uniform(low=0., high=1.)#获取[0,1]之间正态分布
alpha = alpha_dist.sample((batch_size, 1, 1, 1))
interpolated = inputs_real + alpha*(g_outputs-inputs_real)# 对真实样本和生成样本之间插值
inte_logit,_ = Discriminator_DC_32x32(interpolated, GAN=True,GP=True,reuse=True)
gradients = tf.gradients(inte_logit, [interpolated,])[0]# 求得判别器梯度
grad_l2 = tf.sqrt(tf.reduce_sum(tf.square(gradients), axis=[1,2,3]))
gradient_penalty = tf.reduce_mean((grad_l2-1)**2) # 定义惩罚项
# 加入d_loss
d_loss+=gradient_penalty*lam
#-------------------训练模型-----------------
# 分别获取生成器和判别器的变量空间
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_train_opt = tf.train.AdamOptimizer(learning_rate=learning_rate, beta1=beta1, beta2=beta2).minimize(g_loss, var_list=g_vars)
    d_train_opt = tf.train.AdamOptimizer(learning_rate=learning_rate, beta1=beta1, beta2=beta2).minimize(d_loss, var_list=d_vars)
############################################# 调用TFRecord读取数据 #####################################################

# 读取TFR,不打乱文件顺序,指定数据类型,开启多线程
[data,label] = TFRecordTools.ReadFromTFRecord(sameName= r'.\TFR\class7-*',isShuffle= False,datatype= tf.float64,
                                labeltype= tf.int32,isMultithreading= True)
# 批量处理,送入队列数据,指定数据大小,打乱数据项,设置批次大小64
[data_batch,label_batch] = TFRecordTools.DataBatch(data,label,dataSize= 32*32*3,labelSize= 1,
                                                   isShuffle= True,batchSize= 64)

############################################### 迭代 ###################################################################

# 存储训练过程中生成日志
GenLog = []
# 存储loss
losses = []
# 保存生成器变量(仅保存生成器模型,保存最近5个)
saver = tf.train.Saver(var_list=[var for var in tf.trainable_variables()
                                 if var.name.startswith("generator")],max_to_keep=5)
# 定义批预处理
def batch_preprocess(data_batch):
    # 提取批数据
    batch = sess.run(data_batch)
    # 整理成RGB(Nx32x32x3)
    batch_images = np.reshape(batch, [-1, 3, 32, 32]).transpose((0, 2, 3, 1))  # (-1,32,32,3)
    # scale to -1, 1
    batch_images = batch_images * 2 - 1
    return  batch_images

# 生成相关目录保存生成信息
def GEN_DIR():
    import os
    if not os.path.isdir('ckpt'):
        print('文件夹ckpt未创建,现在在当前目录下创建..')
        os.mkdir('ckpt')
    if not os.path.isdir('trainLog'):
        print('文件夹ckpt未创建,现在在当前目录下创建..')
        os.mkdir('trainLog')

# 开启会话
with tf.Session() as sess:
    # 生成相关目录
    GEN_DIR()

    # 初始化变量
    init = (tf.global_variables_initializer(), tf.local_variables_initializer())
    sess.run(init)

    # 开启协调器
    coord = tf.train.Coordinator()
    # 启动线程
    threads = tf.train.start_queue_runners(sess=sess, coord=coord)

    time_start = time.time() # 开始计时
    for steps in range(max_iters):
        steps += 1

        # 判别器重复训练设置
        if steps < 25 or steps % 500 == 0:
            critic_num = 100
        else:
            critic_num = CRITIC_NUM

        # 重复训练判别器
        for i in range(CRITIC_NUM):
            batch_images = batch_preprocess(data_batch)  # images
            batch_noise = np.random.normal(size=(batch_size, noise_size))  # noise(normal)
            _ = sess.run(d_train_opt, feed_dict={inputs_real: batch_images,
                                                 inputs_noise: batch_noise})

        # 训练生成器
        batch_images = batch_preprocess(data_batch)  # images
        batch_noise = np.random.normal(size=(batch_size, noise_size))  # noise(normal)
        _ = sess.run(g_train_opt, feed_dict={inputs_real: batch_images,
                                             inputs_noise: batch_noise})

        #  记录训练信息
        if steps % 5 == 1:
            # (1)记录损失函数
            train_loss_d = d_loss.eval({inputs_real: batch_images,
                                        inputs_noise: batch_noise})
            train_loss_g = g_loss.eval({inputs_real: batch_images,
                                        inputs_noise: batch_noise})
            losses.append([train_loss_d, train_loss_g,steps])

            # (2)记录生成样本
            batch_noise = np.random.normal(size=(batch_size, noise_size))
            gen_samples = sess.run(g_test, feed_dict={inputs_noise: batch_noise})
            genLog = (gen_samples[0:11] + 1) / 2  # 恢复颜色空间(取10张)
            GenLog.append(genLog)

            # (3)打印信息
            print('step {}...'.format(steps),
                  "Discriminator Loss: {:.4f}...".format(train_loss_d),
                  "Generator Loss: {:.4f}...".format(train_loss_g))

        # (4)保存生成模型
        if steps % 300 ==0:
            saver.save(sess, './ckpt/generator.ckpt', global_step=steps)

    # 关闭线程
    coord.request_stop()
    coord.join(threads)

#计时结束:
time_end = time.time()
print('迭代结束,耗时:%.2f秒'%(time_end-time_start))

# 保存信息
#  保存loss记录
with open('./trainLog/loss_variation.loss', 'wb') as l:
    losses = np.array(losses)
    pickle.dump(losses,l)
    print('保存loss信息..')

# 保存生成日志
with open('./trainLog/GenLog.log', 'wb') as g:
    pickle.dump(GenLog, g)
    print('保存GenLog信息..')





结果展示
最后一次生成样本

训练期间生成日志

损失函数

验证生成器

GAN直觉入门:用博弈思维理解生成对抗网络 生成对抗网络(GAN)本质是分布匹配问题,其核心在于通过生成器与判别器的动态博弈,将抽象的概率分布距离转化为可优化的判别任务。不同于VAE等单模型方法追求平均重建,GAN以对抗机制驱动极值优化,实现更锐利的细节生成。这种零和博弈结构赋予GAN强表达力与像素级可控性,使其在图像编辑、工业仿真、缺陷检测等需精确分布建模的场景中不可替代。理解GAN的关键不在公式推导,而在建立‘生成器骗过判别器’与‘判别器校准真实尺度’的双向直觉——这正是DCGAN架构设计、WGAN梯度惩罚、模式崩溃应对等工程实践背后的统一逻辑。 阅读详情

相关推荐

GAN模型选型与工业落地实操指南

生成对抗网络(GAN)是一类通过对抗学习隐式建模数据分布的生成式AI基础技术,其核心原理在于生成器与判别器的极小极大博弈优化。相较于传统监督模型,GAN在小样本、无配对数据、高保真结构生成等场景具备独特技术价值,广泛应用于医疗影像增强、工业缺陷合成、虚拟试穿及跨域图像转换等实际任务。本文聚焦GAN Models在真实业务中的应用逻辑,摒弃理论堆砌,直击数据稀缺、控制粒度粗、部署资源受限等高频痛点,结合WGAN-GP、StyleGAN2、ProGAN、CycleGAN等主流架构,系统梳理从问题诊断→模型匹配→

weixin_30268071的博客 453

关于wgan-gp的loss值的问题

问题:有人训练的wgan-gp,判别器器损很高,但是生成器的损失函数为0,是否代表生成器效果太好? 个人遇到的问题:生成器逐渐升高,不收敛。但是判别器的loss收敛 回答:That’s not a problem, your charts look okay. The generator loss is actually meaningless by itself, since the critic’s loss is invariant to any constant offset (I.e. A .

weixin_53051863的博客 5256

DCGAN实战:用MNIST深入理解生成对抗网络原理与调优

生成对抗网络(GAN)是一种通过生成器与判别器博弈学习数据分布的核心生成式AI技术。其核心原理在于隐空间映射、min-max优化与梯度动态平衡,技术价值体现在无需显式概率建模即可实现高质量样本合成。典型应用场景涵盖图像生成、数据增强、异常检测及时序建模等。在小规模、高可解释性任务中,MNIST作为经典入门数据集,天然适配DCGAN架构——卷积结构建模局部相关性,tanh-sigmoid激活函数协同保障信号边界稳定性,配合合理初始化、归一化与Adam优化器(β₁=0.5),能高效暴露模式崩溃、梯度消失等底层机

shirlly 411

GAN也有脾气:「太难的部分我就不生成了,在下告退」

点击我爱计算机视觉标星,更快获取CVML新技术本文转载自机器之心。选自arXiv作者:David Bau, Jun-Yan Zhu等机器之心编译参与:Panda W生成对抗网络(GAN...

我爱计算机视觉 289

TransGAN:纯Transformer架构的生成对抗网络原理与实战

生成对抗网络(GAN)是深度学习中图像生成的核心范式,其性能高度依赖特征提取器的归纳偏置。传统CNN-GAN虽效果稳定,但受限于局部感受野,难以建模长程空间关系;而纯Transformer生成模型则面临训练不稳定、小数据易坍塌等挑战。TransGAN提出一种结构对称的双Transformer设计——Generator与Discriminator均摒弃卷积,通过patch embedding、可学习位置编码、Pre-LN归一化及特征空间梯度惩罚等关键技术,在无局部先验前提下实现稳定对抗训练。该方案不仅验证了T

weixin_30800987的博客 406

WGAN合成数据工业实践:表格数据生成的分布保真与产线落地

合成数据是解决真实数据滞后、隐私受限与标注稀缺等核心瓶颈的关键技术,其本质在于对原始数据联合分布的高保真建模。Wasserstein GAN(WGAN)凭借可导的Wasserstein距离、Lipschitz约束下的稳定训练及对高阶依赖关系的隐式学习,成为表格数据合成的工业首选。相比SMOTE等传统方法,WGAN能复现业务噪声、条件概率偏移与非线性特征,显著提升下游风控、医疗与保险模型的鲁棒性与线上AUC。本文聚焦WGAN在结构化数据中的工程落地,涵盖预处理范式、评论家设计、权重裁剪原理、多表一致性保障及四

weixin_34014555的博客 392

【WGAN-GP】

在GAN中,Lipschitz约束通常通过梯度惩罚来实现,这也是WGAN-GP所采用的方法。WGAN-GP的主要思想是通过在判别器的损失函数中添加一个梯度惩罚项来实现Lipschitz约束。具体来说,WGAN-GP使用一个梯度惩罚项来限制判别器的梯度大小,这样可以确保判别器函数是Lipschitz连续的。总的来说,WGAN-GP通过引入Lipschitz约束和WGAN-GP损失函数等改进,可以提高GAN的稳定性和性能,并且具有更好的收敛性能和更准确的距离度量。是从真实数据分布和生成器分布中随机采样的样本,

weixin_45026269的博客 873

DCGAN实战指南:从原理到训练崩溃修复的硬核细节

生成对抗网络(GAN)是一种基于博弈论思想的深度生成模型,其核心在于生成器与判别器之间的动态对抗优化过程。理解GAN不能止步于JS散度或minimax公式,而需深入梯度流动、网络耦合机制与训练不稳定性根源。技术价值体现在小样本数据增强、工业缺陷合成、医疗影像扩增等强约束场景;典型应用包括手写数字生成、票据补全、焊点X光图模拟等落地任务。本文聚焦DCGAN这一经典架构,结合模式崩溃、判别器梯度消失、转置卷积棋盘效应等高频问题,提供可验证的PyTorch实现细节与训练监控方法。

a5199519的博客 387

200行PyTorch实现稳定收敛的WGAN-GP实战指南

生成对抗网络(GAN)是一种基于极小极大博弈原理的无监督生成模型,其核心价值在于学习数据分布的隐式表示而非显式建模。由于原始GAN依赖JS散度导致梯度消失、训练不稳定,Wasserstein GAN(WGAN)引入Earth-Mover距离并施加Lipschitz约束,显著提升收敛性与模式多样性。在工程实践中,WGAN-GP通过梯度惩罚替代权重裁剪,配合全连接架构、LayerNorm、LeakyReLU及[-1,1]归一化等关键设计,可在MNIST等中小规模数据集上实现鲁棒训练。本文聚焦可复现、可调试、可解

weixin_30797199的博客 434

WassersteinGAN(WGAN)及其改进算法原理解析

非常感谢您提供如此详细的要求和任务说明。我将尽我所能按照您的要求,以专业的技术语言和深入的分析,撰写一篇高质量的《WassersteinGAN(WGAN)及其改进算法原理解析》技术博客文章。 WassersteinGAN(WGAN)及其改进算法原理解析 作者:禅与计算机程序设计艺术

AI天才研究院 1449

取证实战:当嫌疑人电脑已关机,如何利用EFDD从休眠文件提取BitLocker密钥?

本文详细介绍了如何利用Elcomsoft Forensic Disk Decryptor(EFDD)从休眠文件(hiberfil.sys)中提取BitLocker密钥的实战技术。通过分析休眠文件中的内存快照,取证人员可以突破已关机加密设备的防线,获取关键解密信息。文章涵盖了工具配置、镜像获取、密钥提取及验证等完整流程,并提供了疑难问题解决方案和法律合规建议。

weixin_29315091的博客 345

GAN实战拆解:从MNIST到WGAN-GP的代码级原理与调参指南

生成对抗网络(GAN)是一种通过生成器与判别器动态博弈来学习数据分布的生成式AI模型。其核心在于极小极大优化框架,而非传统概率密度建模,从而规避模式坍塌与模糊生成等固有缺陷。技术价值体现在对高维复杂数据(如图像)的无监督精细建模能力,支撑图像合成、风格迁移、数据增强等关键应用。本文聚焦GAN落地中最易卡点的三大环节:生成器转置卷积结构设计、判别器梯度稳定性保障、WGAN-GP中梯度惩罚的参数精调,结合MNIST可复现案例,直击训练崩溃、全黑图、loss不降等高频故障。

weixin_29042035的博客 244

二阶高通滤波器硬件设计:5种RC到有源方案对比与选型

在传感器前端和音频信号调理中,二阶高通滤波器是抑制直流偏移与低频干扰的关键模块。其设计核心围绕截止频率、品质因数Q、增益与噪声四个指标展开,其中Q值决定滤波器在转折频率附近的响应形状,如Butterworth最大平坦响应需Q=0.707。从纯无源RC电路到引入运放的有源拓扑,演变逻辑在于解决负载效应、提供增益并借助反馈提升Q值。实际工程中,RC级联、VCVS(Sallen-Key)、状态变量及回转器模拟电感等方案各有适用场景:RC电路简单但Q值受限,Sallen-Key单运放即可实现高Q,状态变量适合Q值独

weixin_32770423的博客 100

GAN生成对抗网络原理与工程实践全解析

生成对抗网络(GAN)是一种基于博弈论的深度生成模型,其核心是通过生成器与判别器的动态对抗,实现对高维数据分布的概率建模与高质量采样。不同于VAE等重建型模型,GAN不追求像素级还原,而是以‘欺骗判别器’为优化目标,在隐空间中学习真实数据的流形结构。这种机制赋予GAN更强的细节生成能力与视觉真实感,在图像合成、数据增强、工业质检等场景展现出独特技术价值。本文结合DCGAN、WGAN-GP等主流架构,深入剖析噪声映射、转置卷积、梯度惩罚、模式崩塌等关键概念,并覆盖CUDA环境配置、数据清洗、训练调参、评估指标

weixin_30876945的博客 361

WebRTC Qos优化杂记

本文是笔者对WebRTC Qos性能研究、优化的一些思考,希望对有兴趣的读者有一些启发。

sonysuqin的专栏 6678

手把手教你复现IEEE 2025高光谱图像盲超分算法DBSR(附开源代码与避坑指南)

本文详细介绍了如何从零复现IEEE 2025高光谱图像盲超分算法DBSR,包括环境配置、数据预处理、核心模块解析、训练策略及常见问题解决方案。特别针对开源代码中的关键步骤和潜在问题提供了实用指南,帮助研究者和开发者高效实现Deep blind super-resolution技术,适用于遥感、医疗等领域的图像增强应用。

weixin_42524708的博客 413

GAN生成对抗网络原理与PyTorch实战详解

生成对抗网络(GAN)是一种基于博弈论思想的无监督生成模型,其核心是生成器与判别器之间的极小-极大对抗优化过程。不同于传统监督学习依赖标注数据,GAN通过噪声输入驱动生成器建模数据分布,判别器提供梯度反馈,实现端到端的创造性建模。该机制赋予GAN强大的图像合成、数据增强与隐空间操控能力,在AI绘画、医学影像生成、风格迁移等场景广泛应用。本文结合MNIST实战,深入解析GAN的数学原理、网络结构设计(如LeakyReLU激活、Tanh输出、.detach()梯度控制)、关键超参数调优(lr=0.0002、be

weixin_34408624的博客 355

将点云坐标转换成世界坐标的demo

将点云坐标转换成世界坐标的demo

howard789的博客 2206

GAN训练稳定性实战指南:从loss曲线读懂模型博弈状态

生成式对抗网络(GAN)的本质不是静态优化,而是判别器与生成器在高维空间中的动态博弈系统。其损失函数并非单纯衡量预测误差,而是反映决策边界演化、梯度流连续性与双方更新相位关系的核心指征。理解BCELoss的梯度饱和机制、Wasserstein距离对Lipschitz约束的要求,是解决模式崩溃、判别器过强、训练震荡等稳定性的底层前提。本文聚焦工程落地视角,结合PyTorch实测日志与27轮消融实验,解析loss数值跳变背后的流形学习本质与系统动力学规律,为图像生成、医学影像、工业缺陷检测等场景提供可复用的调试

weixin_29094539的博客 269

Scratch(四十一):升级版垃圾分类

哈喽,大家好!之前给大家展示过“Scratch(二十四):垃圾分类”。今天呢,给大家展示的Scratch是`升级版垃圾分类`。接下来,我们一起看一下效果吧。

我可以很大侠的博客 6869

【汽车ECU电控数据管理篇】A2L文件在ECU标定中的关键作用与实战解析

本文深入解析A2L文件在汽车ECU标定中的关键作用,详细介绍了其作为'数据字典'的核心功能与实战应用。通过剖析A2L文件的结构、关键标签及常见问题,帮助工程师高效管理电控数据,提升ECU标定效率与准确性。文章特别强调了ASAP2标准下的A2L文件在汽车电控系统中的重要性。

a3b4c5的博客 789

TensorFlow2稳定训练GAN的十大工程化实践

生成对抗网络(GAN)作为深度生成模型的核心范式,其理论原理虽已成熟,但实际训练常因梯度不稳定、模式崩溃和收敛失败而难以落地。根本挑战在于GAN对数值精度、优化动态和架构约束的高度敏感性——从数据归一化范围、权重初始化方式,到判别器Lipschitz约束实现,每个环节都可能成为训练崩塌的导火索。Wasserstein GAN及其梯度惩罚(WGAN-GP)因损失值具备可解释性,成为工业级稳定训练的首选基础;而TensorFlow2与Keras的组合,则通过`add_loss`机制、`tf.function`确

weixin_28678151的博客 346

【乐企文件生成工程】关于乐企文件生成工程的详细介绍

发票文件生成方式有两种思路:1、根据已有的OFD模板,动态替换ofd模板内容;之后将ofd转pdf(局限:单行问题不大)详情可以在此处了解2、根据html模板动态占位:该工程就是这种方式 ,目前效果良好,可看下图。拿去即用的源码!无任何保留,当然也并不是所有票种都支持(时间有限、精力有限、已经连着转了,要冒烟了…)

九七的博客 2031

GANs实战指南:小样本数据生成与工业落地避坑

生成对抗网络(GANs)是一种以对抗博弈为核心思想的无监督生成模型,通过生成器与判别器的动态优化,直接建模高维数据分布,绕过传统概率模型在复杂场景下的积分不可解难题。其技术价值在于以极低数据依赖实现高质量合成,在小样本、跨域对齐、实时生成等工程瓶颈场景中展现出独特优势。典型应用涵盖工业缺陷样本扩增、医疗影像域迁移、AIGC内容增强等。本文聚焦可复现的代码级实践,覆盖DCGAN到StyleGAN2架构选型、WGAN-GP稳定训练、隐空间工程及产线部署关键路径,特别强调判别器设计、梯度惩罚实现与loss诊断逻辑

xpp02的专栏 472

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

CNN/RNN/Transformer/GAN四大架构工程实战解剖

神经网络架构选择是AI落地的核心决策点,本质是数据特性、算力约束与业务指标间的动态平衡。CNN凭借局部感受野与权值共享,在图像识别与工业检测中实现高精度低延迟;RNN及其变体LSTM/GRU通过门控机制建模时序依赖,但需直面梯度消失与硬件功耗挑战;Transformer以自注意力突破局部与顺序限制,却面临O(n²)显存瓶颈,需依赖FlashAttention、ALiBi等工程优化;GAN则在生成任务中依赖对抗动力学稳定性,对损失设计与优化器耦合极为敏感。本文聚焦3×3卷积核选型、RNN梯度裁剪阈值1.0、T

weixin_33884611的博客 389

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

GAN原理与工业实战:从对抗训练到模式坍缩排障

生成对抗网络(GAN)是一种基于零和博弈思想的无监督生成模型,通过生成器与判别器的动态对抗,隐式学习真实数据分布。其核心价值在于不依赖显式概率建模即可实现高保真、锐利边缘与结构一致的图像合成,在工业质检、医疗影像重建、数字孪生等对纹理细节和物理一致性要求严苛的场景中不可替代。相比VAE的模糊输出与自回归模型的计算瓶颈,GAN凭借对抗训练范式在合理算力下达成工业级精度,尤其适用于缺陷检测、风格迁移、跨域转换等任务。本文聚焦GAN底层原理、主流变体选型逻辑、训练稳定性保障及典型崩溃诊断,融合Wasserstei

weixin_34072637的博客 344

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 生死看淡,不服就GAN(七)----用更稳定的生成模型WGAN生成cifar
下一篇: 生死看淡,不服就GAN(九)----英伟达力作PGGAN实战,生成高清图片
QuadraV-Speech
QuadraV-Speech 基于深度神经网络的口音分类方法及其模型专利发明者 基于深度神经网络的口音分类方法及其模型专利发明者
博客等级 码龄8年 4190粉丝 80原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QuadraV-Speech

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值