Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式

  

CGAN的全拼是条件生成对抗网络,条件生成对抗网络,在初始甘的基础上增加了图片的相应信息。

  

这里用传统的卷积方式实现CGAN。

        进口火炬   从torch.utils。数据导入DataLoader   从torchvision。数据导入MNIST   从torchvision导入转换   从火炬进口optim   进口火炬。神经网络是神经网络   进口matplotlib。pyplot作为plt   进口numpy np   从火炬。autograd导入变量   进口泡菜   进口复制      进口matplotlib。gridspec作为gridspec   进口操作系统      def save_model(模型中,文件名):#保存为CPU中可以打开的模型   状态=model.state_dict ()   x=state.copy ()   关键在x:   (例子)=x(例子).clone () .cpu ()   火炬。保存(x,文件名)      def showimg(图片、数量):   图像=images.to (cpu)   .numpy图像=images.detach () ()   图像=图像[[6、12、18、24日,30日,36岁,42岁,48岁,54岁,60岁,66,72,78,84,90,96]]   图像=255 *(0.5 + 0.5)*图像   图像=images.astype (np.uint8)   grid_length=int (np.ceil (np.sqrt (images.shape [0])))   plt.figure (figsize=(4, 4))   宽度=images.shape [2]   gs=gridspec.GridSpec (grid_length、grid_length wspace=0,水平间距=0)   因为我,img在列举(图片):   ax=plt.subplot (gs[我])   ax.set_xticklabels ([])   ax.set_yticklabels ([])   ax.set_aspect(“平等”)   plt.imshow (img.reshape(宽度、宽度),提出=plt.cm.gray)   plt.axis(“了”)   plt.tight_layout ()   # plt.tight_layout ()   plt.savefig (r’。/CGAN/图片/% d。png ' %计算,bbox_inches=敖簟?      def loadMNIST (batch_size): # MNIST图片的大小是28 * 28   trans_img=transforms.Compose ([transforms.ToTensor ()))   小火车=MNIST (=True”。/数据”,火车,变换=trans_img下载=True)   testset=MNIST(“。/数据”,火车=False,变换=trans_img下载=True)   #设备=torch.device(如果torch.cuda.is_available cuda: 0()其他cpu)   装载量=DataLoader(小火车,batch_size=batch_size洗牌=True, num_workers=10)   试验载荷=DataLoader (testset batch_size=batch_size洗牌=False, num_workers=10)   返回小火车,testset,装载量、试验载荷      类鉴别器(nn.Module):   def __init__(自我):   超级(鉴别器,自我). __init__ ()   self.dis=nn.Sequential (   nn.Conv2d(32 5步=1,填充=2),   nn.LeakyReLU(0.2,真的),   nn.MaxPool2d ((2, 2)),      nn.Conv2d(64 5步=1,填充=2),   nn.LeakyReLU(0.2,真的),   nn.MaxPool2d ((2, 2))   )   self.fc=nn.Sequential (   神经网络。线性(7 * 7 * 64,1024),   nn.LeakyReLU(0.2,真的),   神经网络。线性(1024年,10),   nn.Sigmoid ()   )   def向前(自我,x):   x=self.dis (x)   x=x.view (x.size (0) 1)   x=self.fc (x)   返回x      类发生器(nn.Module):   def __init__(自我、input_size num_feature):   超级(发电机,自我). __init__ ()   self.fc=nn.Linear (input_size num_feature) # 1 * 56 * 56   self.br=nn.Sequential (   nn.BatchNorm2d (1),   nn.ReLU(真正的)   )   self.gen=nn.Sequential (   nn.Conv2d(50 3步=1,填充=1),   nn.BatchNorm2d (50),   nn.ReLU(真正的),      nn.Conv2d(50, 25岁,3步=1,填充=1),   nn.BatchNorm2d (25),   nn.ReLU(真正的),      nn.Conv2d(25岁,1、2步=2),   nn.Tanh ()   )   def向前(自我,x):   x=self.fc (x)   x=x.view (x.size(0) 1, 56岁,56)   x=self.br (x)   x=self.gen (x)   返回x      if __name__==癬_main__”:   标准=nn.BCELoss ()   num_img=100   z_dimension=110   D=鉴别器()   G=发生器(z_dimension, 3136) # 1 * 56 * 56   小火车,testset、装载量、试验载荷=loadMNIST (num_img) #数据   D=D.cuda ()   G=G.cuda ()   d_optimizer=optim.Adam (D.parameters (), lr=0.0003)   g_optimizer=optim.Adam (G.parameters (), lr=0.0003)   “‘   交替训练的方式训练网络   先训练判别器网络D再训练生成器网络G   不同网络的训练次数是超参数   也可以两个网络训练相同的次数,   这样就可以不用分别训练两个网络   “‘   数=0   #鉴别器D的训练,固定G的参数   时代=119   gepoch=1   因为我在范围(时代):   在装载量(img标签):   labels_onehot=np.zeros ((num_img 10))   labels_onehot [np.arange (num_img) label.numpy ())=1   # img=img.view (num_img, 1)   # img=np.concatenate (img.numpy (), labels_onehot))   # img=torch.from_numpy (img)   img=变量(img) .cuda ()   real_label=变量(torch.from_numpy (labels_onehot) .float ()) .cuda() #真实标签为1   fake_label=变量(torch.zeros (num_img 10)) .cuda() #假的标签为0      #计算real_img的损失   real_out=D (img) #真实图片送入判别器D输出0 ~ 1   d_loss_real=标准(real_out real_label) #得到的损失   real_scores=real_out #真实图片放入判别器输出越接近1越好      #计算fake_img的损失   z=变量(torch.randn (num_img z_dimension)) .cuda() #随机生成向量   fake_img=G (z) #将向量放入生成网络克生成一张图片   fake_out=D (fake_img) #判别器判断假的图片   d_loss_fake=标准(fake_out fake_label) #假的图片的损失   fake_scores=fake_out #假的图片放入判别器输出越接近0越好      # D bp和优化   d_loss=d_loss_real + d_loss_fake   d_optimizer.zero_grad() #判别器D的梯度归零   d_loss.backward() #反向传播   d_optimizer.step() #更新判别器D参数      #生成器G的训练计算fake_img的损失   j的范围(gepoch):   z=火炬。randn (num_img, 100) #随机生成向量   z=np.concatenate (z.numpy (), labels_onehot),轴=1)   z=变量(torch.from_numpy (z) .float ()) .cuda ()   fake_img=G (z) #将向量放入生成网络克生成一张图片   输出=D (fake_img) #经过判别器得到结果   real_label g_loss=标准(输出)#得到假的图片与真实标签的损失   #英国石油(bp)和优化   g_optimizer.zero_grad() #生成器G的梯度归零   g_loss.backward() #反向传播   g_optimizer.step() #更新生成器G参数   temp=real_label   如果(我% 10==0)和(我!=0):   打印(我)   torch.save (G.state_dict (), r’。/CGAN Generator_cuda_ % d.pkl ' %我)   torch.save (D.state_dict (), r’。/CGAN Discriminator_cuda_ % d。pkl ' % i)   save_model (G, r’。/CGAN Generator_cpu_ % d.pkl ' % i) #保存为CPU中可以打开的模型   save_model (D r’。/CGAN Discriminator_cpu_ % d.pkl ' % i) #保存为CPU中可以打开的模型   打印(“时代[{}/{}],d_loss: {:。6 f}, g_loss: {:。6 f}’   ' D真实:{:。D假6 f}: {: .6f} .format (   时代,我d_loss。数据[0],g_loss.data [0],   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Pytorch使用MNIST数据集实现CGAN和生成指定的数字方式