PyTorch随笔 - 生成对抗网络的改进cGAN和LSGAN

article/2025/11/5 20:41:02

欢迎关注我的CSDN:https://spike.blog.csdn.net/
本文地址:https://blog.csdn.net/caroline_wendy/article/details/129939225

本文介绍GAN的两个常见改进,cGAN和LSGAN,两者一般结合使用。

  • cGAN: Conditional Generative Adversarial Nets,条件GAN
  • LSGAN: Least Squares Generative Adversarial Networks,最小平方GAN

GAN

GAN,即生成对抗网络,是一种基于博弈论的生成模型,由两个神经网络组成:生成器(G)和判别器(D)。生成器的目标是从一个随机噪声向量生成与真实数据分布相似的样本,而判别器的目标是区分输入的样本是真实的还是生成的。两者相互竞争,最终达到一个纳什均衡,即生成器可以欺骗判别器,而判别器无法区分真假样本。

在训练GAN的过程中,建议使用 Spectral Normalization 优化网络层。

  • Spectral Normalization,即谱正则化,可以有效地控制网络的 Lipschitz 常数,从而,提高网络的泛化能力和稳定性。Spectral Normalization 的基本思想是在每一层的权重矩阵W上施加一个谱范数约束,使得其最大奇异值不超过一个预设的阈值,例如1。这样,可以避免网络在训练过程中出现梯度爆炸或消失的问题,也可以防止生成对抗网络中的模式崩溃现象。Spectral Normalization 可以很容易地应用于各种类型的神经网络,包括卷积神经网络、循环神经网络和生成对抗网络,只需要在每一层的前向传播和反向传播中增加一些简单的计算步骤,而不需要改变网络的结构或超参数。

标准GAN源码:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2022. All rights reserved.
Created by C. L. Wang on 2023/4/3
"""import os
import timeimport numpy as np
import torch
import torch.nn as nn
import torchvisionimage_size = [1, 28, 28]
latent_dim = 96
batch_size = 1024
use_gpu = torch.cuda.is_available()
save_dir = "gan_images"
os.makedirs(save_dir, exist_ok=True)class Generator(nn.Module):"""生成器数据torchvision.datasets.MNIST"""def __init__(self):super(Generator, self).__init__()self.model = nn.Sequential(nn.Linear(latent_dim, 128),nn.BatchNorm1d(128),nn.GELU(),nn.Linear(128, 256),nn.BatchNorm1d(256),nn.GELU(),nn.Linear(256, 512),nn.BatchNorm1d(512),nn.GELU(),nn.Linear(512, 1024),nn.BatchNorm1d(1024),nn.GELU(),nn.Linear(1024, np.prod(image_size, dtype=np.int32)),# nn.Tanh(),nn.Sigmoid(),)def forward(self, z):"""shape of z: [batchsize, latent_dim]随机高斯分布z生成图像"""output = self.model(z)image = output.reshape(z.shape[0], *image_size)return imageclass Discriminator(nn.Module):"""判别器"""def __init__(self):super(Discriminator, self).__init__()self.model = nn.Sequential(nn.Linear(np.prod(image_size, dtype=np.int32), 512),nn.GELU(),# nn.Linear(512, 256),nn.utils.spectral_norm(nn.Linear(512, 256)),  # 谱归一化nn.GELU(),# nn.Linear(256, 128),nn.utils.spectral_norm(nn.Linear(256, 128)),nn.GELU(),# nn.Linear(128, 64),nn.utils.spectral_norm(nn.Linear(128, 64)),nn.GELU(),# nn.Linear(64, 32),nn.utils.spectral_norm(nn.Linear(64, 32)),nn.GELU(),# nn.Linear(32, 1),nn.utils.spectral_norm(nn.Linear(32, 1)),nn.Sigmoid())def forward(self, img):"""shape of img: [batchsize, 1, 28, 28]"""prob = self.model(img.reshape(img.shape[0], -1))  # 只保留第0维return prob# Training
transform = torchvision.transforms.Compose([torchvision.transforms.Resize(28),torchvision.transforms.ToTensor(),  # [0, 1]# torchvision.transforms.Normalize(mean=[0.5], std=[0.5])  # [-1, 1]])
dataset = torchvision.datasets.MNIST("mnist_data", train=True, download=True, transform=transform)
print(f"[Info] dataset: {len(dataset)}")
# for i in range(len(dataset)):
#     if i < 5:
#         print(dataset[i][0].shape)dataloader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=True, drop_last=True, num_workers=20)generator = Generator()
discriminator = Discriminator()g_optimizer = torch.optim.Adam(generator.parameters(), lr=0.0003, betas=(0.4, 0.8), weight_decay=0.0001)
d_optimizer = torch.optim.Adam(discriminator.parameters(), lr=0.0003, betas=(0.4, 0.8), weight_decay=0.0001)loss_fn = torch.nn.BCELoss()
labels_one = torch.ones(batch_size, 1)
labels_zero = torch.zeros(batch_size, 1)if use_gpu:print("use gpu for training!")generator = generator.cuda()discriminator = discriminator.cuda()loss_fn = loss_fn.cuda()labels_one = labels_one.to("cuda")labels_zero = labels_zero.to("cuda")num_epoch = 1000for epoch in range(num_epoch):s_time = time.time()for idx, mini_batch in enumerate(dataloader):gt_images, _ = mini_batch# print(f"[Info] gt_images.shape: {gt_images.shape}")z = torch.randn(batch_size, latent_dim)if use_gpu:gt_images = gt_images.cuda()z = z.cuda()pred_images = generator(z)g_optimizer.zero_grad()  # 生成器的优化recons_loss = torch.abs(pred_images - gt_images).mean()  # 重构loss# 预测为真实数据1g_loss = recons_loss * 0.05 + loss_fn(discriminator(pred_images), labels_one)g_loss.backward()g_optimizer.step()d_optimizer.zero_grad()real_loss = loss_fn(discriminator(gt_images), labels_one)fake_loss = loss_fn(discriminator(pred_images.detach()), labels_zero)  # 生成照片d_loss = real_loss + fake_lossd_loss.backward()d_optimizer.step()# 判别器的优化if idx % 50 == 0:print(f"step: {len(dataloader)*epoch + idx}, recons_loss: {recons_loss.item()}, "f"g_loss: {g_loss.item()}, d_loss: {d_loss.item()}, real_loss: {real_loss}, fake_loss: {fake_loss}")if idx % 800 == 0:image = pred_images[:64].data# 保存照片torchvision.utils.save_image(image, f"{save_dir}/image_{str(len(dataloader)*epoch + idx).zfill(6)}.png")

输出image_030044.png,训练效果如下:

GAN

cGAN

论文:cGAN - Conditional Generative Adversarial Nets,条件GAN

  • 引用量4000多次
  • cGAN的作者是Mehdi Mirza和Simon Osindero,加拿大蒙特利尔大学的博士生和博士后。在2014年发表了一篇论文,介绍了CGAN的原理和应用,他们的研究受到了Yann LeCun和Yoshua Bengio等人的指导和支持。

其中,cGAN 与 GAN 的差别是,cGAN 在生成和判别的过程中都加入了条件变量,比如类别标签、图像特征等。这样可以使得生成器能够根据指定的条件生成相应的数据,而判别器能够根据条件判断数据的真实性。cGAN 可以解决 GAN 的一些问题,比如模式崩溃、生成数据的多样性不足等。cGAN 也可以应用于更多的领域,比如图像转换、文本生成、语音合成等。

GAN的公式,如下:

GAN

cGAN的公式,如下:

cGAN

源码如下:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2022. All rights reserved.
Created by C. L. Wang on 2023/4/3
"""import os
import timeimport numpy as np
import torch
import torch.nn as nn
import torchvisionimage_size = [1, 28, 28]
latent_dim = 96
label_emb_dim = 32  # 标签的嵌入维度
batch_size = 1024
use_gpu = torch.cuda.is_available()
save_dir = "cgan_images"  # 输出文件夹
os.makedirs(save_dir, exist_ok=True)class Generator(nn.Module):"""生成器数据torchvision.datasets.MNIST"""def __init__(self):super(Generator, self).__init__()self.embedding = nn.Embedding(10, label_emb_dim)  # 将10维标签映射为嵌入表征self.model = nn.Sequential(nn.Linear(latent_dim + label_emb_dim, 128),  # 输入维度增加nn.BatchNorm1d(128),nn.GELU(),nn.Linear(128, 256),nn.BatchNorm1d(256),nn.GELU(),nn.Linear(256, 512),nn.BatchNorm1d(512),nn.GELU(),nn.Linear(512, 1024),nn.BatchNorm1d(1024),nn.GELU(),nn.Linear(1024, np.prod(image_size, dtype=np.int32)),# nn.Tanh(),nn.Sigmoid(),)def forward(self, z, labels):"""shape of z: [batchsize, latent_dim]随机高斯分布z生成图像"""label_embedding = self.embedding(labels)z = torch.cat([z, label_embedding], dim=-1)  # 将条件也作为输入output = self.model(z)image = output.reshape(z.shape[0], *image_size)return imageclass Discriminator(nn.Module):"""判别器"""def __init__(self):super(Discriminator, self).__init__()self.embedding = nn.Embedding(10, label_emb_dim)self.model = nn.Sequential(nn.Linear(np.prod(image_size, dtype=np.int32) + label_emb_dim, 512),    # 输入维度增加nn.GELU(),# nn.Linear(512, 256),nn.utils.spectral_norm(nn.Linear(512, 256)),  # 谱归一化nn.GELU(),# nn.Linear(256, 128),nn.utils.spectral_norm(nn.Linear(256, 128)),nn.GELU(),# nn.Linear(128, 64),nn.utils.spectral_norm(nn.Linear(128, 64)),nn.GELU(),# nn.Linear(64, 32),nn.utils.spectral_norm(nn.Linear(64, 32)),nn.GELU(),# nn.Linear(32, 1),nn.utils.spectral_norm(nn.Linear(32, 1)),nn.Sigmoid())def forward(self, img, labels):"""shape of img: [batchsize, 1, 28, 28]"""label_embedding = self.embedding(labels)  # 离散变量转换为连续变量model_input = torch.cat([img.reshape(img.shape[0], -1), label_embedding], dim=-1)prob = self.model(model_input)  # 只保留第0维return prob# Training
transform = torchvision.transforms.Compose([torchvision.transforms.Resize(28),torchvision.transforms.ToTensor(),  # [0, 1]# torchvision.transforms.Normalize(mean=[0.5], std=[0.5])  # [-1, 1]])
dataset = torchvision.datasets.MNIST("mnist_data", train=True, download=True, transform=transform)
print(f"[Info] dataset: {len(dataset)}")
# for i in range(len(dataset)):
#     if i < 5:
#         print(dataset[i][0].shape)dataloader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=True, drop_last=True, num_workers=20)generator = Generator()
discriminator = Discriminator()g_optimizer = torch.optim.Adam(generator.parameters(), lr=0.0003, betas=(0.4, 0.8), weight_decay=0.0001)
d_optimizer = torch.optim.Adam(discriminator.parameters(), lr=0.0003, betas=(0.4, 0.8), weight_decay=0.0001)loss_fn = torch.nn.BCELoss()
labels_one = torch.ones(batch_size, 1)
labels_zero = torch.zeros(batch_size, 1)if use_gpu:print("use gpu for training!")generator = generator.cuda()discriminator = discriminator.cuda()loss_fn = loss_fn.cuda()labels_one = labels_one.to("cuda")labels_zero = labels_zero.to("cuda")num_epoch = 1000for epoch in range(num_epoch):s_time = time.time()for idx, mini_batch in enumerate(dataloader):gt_images, labels = mini_batch  # 需要输入标签# print(f"[Info] gt_images.shape: {gt_images.shape}")z = torch.randn(batch_size, latent_dim)if use_gpu:gt_images = gt_images.cuda()labels = labels.cuda()z = z.cuda()pred_images = generator(z, labels)g_optimizer.zero_grad()  # 生成器的优化recons_loss = torch.abs(pred_images - gt_images).mean()  # 重构loss# 预测为真实数据1g_loss = recons_loss * 0.05 + loss_fn(discriminator(pred_images, labels), labels_one)g_loss.backward()g_optimizer.step()d_optimizer.zero_grad()real_loss = loss_fn(discriminator(gt_images, labels), labels_one)fake_loss = loss_fn(discriminator(pred_images.detach(), labels), labels_zero)  # 生成照片d_loss = real_loss + fake_lossd_loss.backward()d_optimizer.step()# 判别器的优化if idx % 50 == 0:print(f"step: {len(dataloader)*epoch + idx}, recons_loss: {recons_loss.item()}, "f"g_loss: {g_loss.item()}, d_loss: {d_loss.item()}, real_loss: {real_loss}, fake_loss: {fake_loss}")if idx % 800 == 0:image = pred_images[:64].data# 保存照片torchvision.utils.save_image(image, f"{save_dir}/image_{str(len(dataloader)*epoch + idx).zfill(6)}.png")

输出image_030044.png,cGAN优于GAN,训练效果如下:

cGAN

LSGAN

论文:LSGAN - Least Squares Generative Adversarial Networks,最小平方GAN

  • 引用量3000多次

其中,LSGAN 和 GAN 是两种生成对抗网络的变体,都可以用于生成逼真的图像。主要区别在于损失函数的设计,GAN 使用了交叉熵损失函数,要求判别器输出生成图像和真实图像的概率。这样的损失函数,可能导致梯度消失的问题,使得生成器难以学习。LSGAN 使用了最小二乘损失函数,要求判别器输出生成图像和真实图像的分数,这样的损失函数可以提供更多的梯度信息,使得生成器更容易学习。LSGAN 还可以减少模式崩溃的现象,即生成器只能生成有限种类的图像。总之,LSGAN 是一种改进了 GAN 的损失函数的方法,可以提高生成图像的质量和多样性。

LSGAN的公式,如下
LSGAN

由于Sigmoid+交叉熵损失导致梯度消失,因此替换为L2损失,即:

import torch
import torch.nn as nn
import matplotlib.pyplot as plt# sigmoid ce 图像
logits = torch.linspace(-10, 10, 2000)loss = []
loss_fn = nn.BCELoss()for lgs in logits:loss.append(loss_fn(torch.sigmoid(lgs), torch.ones_like(lgs)))plt.plot(logits, loss)
plt.show()

Sigmoid+交叉熵损失的效果:

Sigmoid

其中,LSGAN公式中,a、b、c的数值约束:

abc

约束:b - c = 1,b - a = 2,例如:a = -1、b = 1、c = 0 或者 b = c = 1,a = 0,第二种方案更优,也更常见。

同时使用LSGAN + cGAN的源码,如下:

#!/usr/bin/env python
# -- coding: utf-8 --
"""
Copyright (c) 2022. All rights reserved.
Created by C. L. Wang on 2023/4/3
"""import os
import timeimport numpy as np
import torch
import torch.nn as nn
import torchvisionimage_size = [1, 28, 28]
latent_dim = 96
label_emb_dim = 32  # 标签的嵌入维度
batch_size = 1024
use_gpu = torch.cuda.is_available()
save_dir = "ls_cgan_images"  # 输出文件夹
os.makedirs(save_dir, exist_ok=True)class Generator(nn.Module):"""生成器数据torchvision.datasets.MNIST"""def __init__(self):super(Generator, self).__init__()self.embedding = nn.Embedding(10, label_emb_dim)  # 将10维标签映射为嵌入表征self.model = nn.Sequential(nn.Linear(latent_dim + label_emb_dim, 128),  # 输入维度增加nn.BatchNorm1d(128),nn.GELU(),nn.Linear(128, 256),nn.BatchNorm1d(256),nn.GELU(),nn.Linear(256, 512),nn.BatchNorm1d(512),nn.GELU(),nn.Linear(512, 1024),nn.BatchNorm1d(1024),nn.GELU(),nn.Linear(1024, np.prod(image_size, dtype=np.int32)),# nn.Tanh(),nn.Sigmoid(),)def forward(self, z, labels):"""shape of z: [batchsize, latent_dim]随机高斯分布z生成图像"""label_embedding = self.embedding(labels)z = torch.cat([z, label_embedding], dim=-1)  # 将条件也作为输入output = self.model(z)image = output.reshape(z.shape[0], *image_size)return imageclass Discriminator(nn.Module):"""判别器"""def __init__(self):super(Discriminator, self).__init__()self.embedding = nn.Embedding(10, label_emb_dim)self.model = nn.Sequential(nn.Linear(np.prod(image_size, dtype=np.int32) + label_emb_dim, 512),    # 输入维度增加nn.GELU(),# nn.Linear(512, 256),nn.utils.spectral_norm(nn.Linear(512, 256)),  # 谱归一化nn.GELU(),# nn.Linear(256, 128),nn.utils.spectral_norm(nn.Linear(256, 128)),nn.GELU(),# nn.Linear(128, 64),nn.utils.spectral_norm(nn.Linear(128, 64)),nn.GELU(),# nn.Linear(64, 32),nn.utils.spectral_norm(nn.Linear(64, 32)),nn.GELU(),# nn.Linear(32, 1),nn.utils.spectral_norm(nn.Linear(32, 1)),nn.Sigmoid())def forward(self, img, labels):"""shape of img: [batchsize, 1, 28, 28]"""label_embedding = self.embedding(labels)  # 离散变量转换为连续变量model_input = torch.cat([img.reshape(img.shape[0], -1), label_embedding], dim=-1)prob = self.model(model_input)  # 只保留第0维return prob# Training
transform = torchvision.transforms.Compose([torchvision.transforms.Resize(28),torchvision.transforms.ToTensor(),  # [0, 1]# torchvision.transforms.Normalize(mean=[0.5], std=[0.5])  # [-1, 1]])
dataset = torchvision.datasets.MNIST("mnist_data", train=True, download=True, transform=transform)
print(f"[Info] dataset: {len(dataset)}")
# for i in range(len(dataset)):
#     if i < 5:
#         print(dataset[i][0].shape)dataloader = torch.utils.data.DataLoader(dataset, batch_size=batch_size, shuffle=True, drop_last=True, num_workers=20)generator = Generator()
discriminator = Discriminator()g_optimizer = torch.optim.Adam(generator.parameters(), lr=0.0003, betas=(0.4, 0.8), weight_decay=0.0001)
d_optimizer = torch.optim.Adam(discriminator.parameters(), lr=0.0003, betas=(0.4, 0.8), weight_decay=0.0001)# loss_fn = torch.nn.BCELoss()
loss_fn = torch.nn.MSELoss()  # LSGAN Least Squares
labels_one = torch.ones(batch_size, 1)
labels_zero = torch.zeros(batch_size, 1)if use_gpu:print("use gpu for training!")generator = generator.cuda()discriminator = discriminator.cuda()loss_fn = loss_fn.cuda()labels_one = labels_one.to("cuda")labels_zero = labels_zero.to("cuda")num_epoch = 1000for epoch in range(num_epoch):s_time = time.time()for idx, mini_batch in enumerate(dataloader):gt_images, labels = mini_batch  # 需要输入标签# print(f"[Info] gt_images.shape: {gt_images.shape}")z = torch.randn(batch_size, latent_dim)if use_gpu:gt_images = gt_images.cuda()labels = labels.cuda()z = z.cuda()pred_images = generator(z, labels)g_optimizer.zero_grad()  # 生成器的优化recons_loss = torch.abs(pred_images - gt_images).mean()  # 重构loss# 预测为真实数据1g_loss = recons_loss * 0.05 + loss_fn(discriminator(pred_images, labels), labels_one)g_loss.backward()g_optimizer.step()d_optimizer.zero_grad()real_loss = loss_fn(discriminator(gt_images, labels), labels_one)fake_loss = loss_fn(discriminator(pred_images.detach(), labels), labels_zero)  # 生成照片d_loss = real_loss + fake_lossd_loss.backward()d_optimizer.step()# 判别器的优化if idx % 50 == 0:print(f"step: {len(dataloader)*epoch + idx}, recons_loss: {recons_loss.item()}, "f"g_loss: {g_loss.item()}, d_loss: {d_loss.item()}, real_loss: {real_loss}, fake_loss: {fake_loss}")if idx % 800 == 0:image = pred_images[:64].data# 保存照片torchvision.utils.save_image(image, f"{save_dir}/image_{str(len(dataloader)*epoch + idx).zfill(6)}.png")

输出image_030044.png,训练效果如下:
LSGAN

That’s all!


http://chatgpt.dhexx.cn/article/vw2MghTY.shtml

相关文章

CGAN实现过程

本文目录 一、原理二、参数初始化1. G的输入2. D的输入3. 模型参数初始化4. 测试噪声 三、执行过程四、测试 本文用MNIST数据集进行训练&#xff0c;并用图解的方法展示了CGAN与GAN中输入的区别&#xff0c;帮助理解CGAN的运行过程 一、原理 如下图所示&#xff0c;我们在输入…

CGAN

CGAN 生成符合特定描述的输出&#xff0c; 如图&#xff1a;给定描述&#xff0c;生成相应内容图片 CGAN中的negetive情况包含两种&#xff0c;&#xff08;正确的描述&#xff0c;不清晰的图片&#xff09;和&#xff08;不正确的描述&#xff0c;清晰的图片&#xff09;&a…

CGAN 简介与代码实战

1.介绍 原始GAN&#xff08;GAN 简介与代码实战_天竺街潜水的八角的博客-CSDN博客&#xff09;在理论上可以完全逼近真实数据&#xff0c;但它的可控性不强&#xff08;生成小图片还行&#xff0c;生成的大图片可能是不合逻辑的&#xff09;&#xff0c;因此需要对gan加一些约…

CGAN原理分析

1、CGAN原理分析 1.1 网络结构 CGAN是在GAN基础上做的一种改进&#xff0c;通过给原始GAN的生成器Generator&#xff08;下文简记为G&#xff09;和判别器Discriminator&#xff08;下文简记为D&#xff09;添加额外的条件信息y&#xff0c;实现条件生成模型。CGAN原文中作者…

CGAN理论讲解及代码实现

目录 1.原始GAN的缺点 2.CGAN中心思想 3.原始GAN和CGAN的区别 4.CGAN代码实现 5.运行结果 6.CGAN缺陷 1.原始GAN的缺点 生成的图像是随机的&#xff0c;不可预测的&#xff0c;无法控制网络输出特定的图片&#xff0c;生成目标不明确&#xff0c;可控性不强。 针对原始…

GANs系列:CGAN(条件GAN)原理简介以及项目代码实现

一、原始GAN的缺点 生成的图像是随机的&#xff0c;不可预测的&#xff0c;无法控制网络输出特定的图片&#xff0c;生成目标不明确&#xff0c;可控性不强。针对原始GAN不能生成具有特定属性的图片的问题&#xff0c; Mehdi Mirza等人提出了cGAN&#xff0c;其核心在于将属性信…

解决关于Navicat破解安装过程中出现“rsa public key not find”

解决关于Navicat破解安装过程中出现“rsa public key not find” 问题描述解决办法 问题描述 出现“rsa public key not find”的输出框 解决办法 首先先安装Navicat。安装后先不要运行 打开 然后点击 如果出现 则是对的 如果出现这个&#xff1a; 那就请你找到在本地的na…

navicat安装与激活

原文网址&#xff1a;https://www.jianshu.com/p/5f693b4c9468?mTypeGroup 一、Navicat Premium 12下载 Navicat Premium 12是一套数据库开发管理工具&#xff0c;支持连接 MySQL、Oracle等多种数据库&#xff0c;可以快速轻松地创建、管理和维护数据库。 Navicat Premium 12简…

Mac上安装 Navicat

1.下载安装包 Mac版 Navicat Premium 12 v12.0.23.0 官网下载地址&#xff1a; 英文64位 http://download.navicat.com/download/navicat120_premium_en.dmg 中文简体64位 http://download.navicat.com/download/navicat120_premium_cs.dmg 中文简体安装包&#xff1a;链接:h…

Navicat Premium 12.1.21 最新版激活工具及方法

At The Beginning ****** Sincerely regards to the author of the original work ******* 本帖持续更新 Last updated at 21st Aug 2019 Steps navicat_premium原版安装包 官网下载地址&#xff1a;https://www.navicat.com.cn/download/navicat-premium 注册工具下载 git…

Navicat Premium 12.1.16.0安装与激活

一、Navicat Premium 12下载 Navicat Premium 12简体中文下载&#xff1b; 提取码&#xff1a;cgv4 二、Navicat Premium 12安装 双击安装&#xff0c;点击下一步&#xff1a; 同意协议&#xff0c;点击下一步&#xff1a; 选择安装位置&#xff08;可默认&#xff09;&…

Navicat Premium安装和激活

前言 Navicat Premium这个软件是非常的好用&#xff0c;这个软件中包含mysql,SQL Server等等的数据库&#xff0c;受到广大编程爱好者的欢迎&#xff0c;废话不多说&#xff0c;下面就直接进入主题&#xff0c;马上就是Navicat Premium安装和激活的环节。 &#xff08;1&…

Navicat Premium 12破解激活

下载Navicat Premium 12并安装&#xff1b; 蓝奏云下载&#xff1a;Navicat Premium 12注册机 重要提示&#xff1a;该注册机来源于DeltaFoX。一般来说&#xff0c;由于注册机会修改.exe文件或.dll文件&#xff0c;加壳并且没有数字签名&#xff0c;所以杀毒软件会报毒。如需…

Navicat v15

特别注意: 1.断网,否则在安装过程中会失败2.关闭防火墙及杀毒软件   3.选择对应版本:mysql版就选择mysql 出现如下情况&#xff1a; 就卸载,删除注册表,重新安装,出现rsa public key not find的错误 以及 generate first a serial 错误都也是如此删除注册表的办法打开文件&am…

关于Navicat 数据库一直激活不成功的解决方法

首先激活时一直出现 rsa public key not found&#xff0c;说明获取不到激活码&#xff0c;此时就需要检查 - 在Patch的时候是不是没成功 使用破解软件如果出现说已经patch过了的时候赶紧卸载重装&#xff01;&#xff01; - 在激活的时候是不是没有断开网络 解决办法&#…

Navicat安装激活

有条件的同学麻烦不要使用下面的激活步骤&#xff0c;仅供个人学习使用 。。。。。。 。。。。。。 。。。。。。 。。。。。。 一、去官网下载最新Navicat软件https://www.navicat.com.cn/download/navicat-premium 二、去下载激活脚本https://github.com/DoubleLabyrinth/nav…

Navicat 12.1 Macos 激活指南

Navicat 12.1 Navicat从版本11开始使用&#xff0c;一直在macos上表现稳定&#xff0c;速度还快&#xff0c;操作也简单&#xff0c;比Mysql workbench好用多了&#xff0c; workbench总是会发生程序崩溃&#xff0c;修改数据还要点Apply键。对开发来说很不好用. 以下是整个过…

激活navicat提示rsa public key not find的问题

操作顺序先不打开Navicat&#xff0c;注机patch&#xff0c;然后再开Navicat注册 卸载原来的navicat重新安装再次点击patch选择路径就行了 还不行就记得,右键激活工具以管理员权限打开激活再次patch选择navicat的安装好的navicat.exe文件即可

navicat premiun 12激活

注册机&#xff1a; https://download.csdn.net/download/qq_31967985/10545930 步骤&#xff1a; 以管理员身份运行此注册机&#xff1a; 运行注册机 打开注册机后&#xff0c;1) Patch勾选Backup、Host和Navicat v12&#xff0c;然后点击Patch按钮&#xff1a; 默认勾选 …

Navicat安装激活时提示激活失败: 激活次数达到上限,90010003

Navicat安装激活时提示激活失败: 激活次数达到上限&#xff0c;90010003 问题&#xff1a; 概述&#xff1a; 激活失败。原因可能是由于已达到激活次数上限。请检查你是否已在卸载或重新安装 Navicat前取消激活许可证密钥。 90010003解决方法&#xff1a; 通过查看C:\WINDOW…