pytorch实战-图像生成与对抗

1 概述

what:给定一句话,或一些要求,按要求生成需要的图像。

本篇总结主要包含反卷积和GAN(generative adversial network, GAN)

2 反卷积与图像生成

what:反卷积可以看成卷积的反操作,但不完全一样,不是把卷积反过来就是反卷积。即给定特征,反向生成输入。但反卷积运算的卷积核与卷积运算的不同

效果:卷积是大图像越来越小,反卷积可以图像越来越大

2.1 反卷积运算

卷积核不同:卷积卷积核旋转180度可得到反卷积运算的卷积核

padding:如果希望反卷积运算后,图像大小保持不变,需要计算padding并给输入图像补padding

2.2 反池化运算

反池化有很多方法,有一种卷积运算方法可以近似省略池化(因为效果相近),即给卷积运算加步伐。即每一个卷积核在原图像运算完,朝下一个运算窗口移动的步数。默认步数是1.步数大于1的效果很接近卷积+池化运算效果。这样的卷积运算,可以看成步数为1的卷积运算+池化运算,即省略了池化运算

步伐>2的卷积效果:卷积得到的图像比步伐小的图像更小。因此反卷积时,也需要处理此种情况

2.3 反卷积和分数步伐

步伐>2的卷积,可以通过分数步伐的反卷积恢复。即对输入图像每个像素点之间补充空白点,卷积步长越大,反卷积补的像素间空白点就越多

2.4 批正则化技术

概念:是每一层神经网络层和非线性运算层之间加入的一个线性运算层,逻辑为y=ax+b。a,b为要学习的参数,x为一批里归一化处理后的输入:(x-mean(x))/std

3 图像生成-最小均方差模型

3.1 思路

输入是一个数字,输出是一个数字的手写图像。通过反卷积网络实现这样的输入与输出

3.2 代码实现

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F

import torchvision.datasets as datasets
import torchvision.transforms as transforms
import torchvision.utils as util

import matplotlib.pyplot as pyplot
import numpy as np
import os

output_img_size = 28
input_dim = 100
channel_num = 1
features_num = 64
batch_size = 64

print(f'prepare datasets begin')
use_cuda = torch.cuda.is_available()
dtype = torch.cuda.FloatTensor if use_cuda else torch.FloatTensor
itype = torch.cuda.LongTensor if use_cuda else torch.LongTensor

train_dataset = datasets.MNIST(root='./data', train=True, transform=transforms.ToTensor(), download=True)
test_dataset = datasets.MNIST(root='./data', train=False, transform=transforms.ToTensor())

train_loader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)
index_verify = range(len(test_dataset))[:5000]
index_test = range(len(test_dataset))[5000:]

sampler_verify = torch.utils.data.sampler.SubsetRandomSampler(index_verify)
sampler_test = torch.utils.data.sampler.SubsetRandomSampler(index_test)

verify_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, sampler=sampler_verify)
test_loader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, sampler=sampler_test)

class AntiCNN(nn.Module):
    def __init__(self):
        super(AntiCNN, self).__init__()
        self.model = nn.Sequential()
        self.model.add_module('deconv1', nn.ConvTranspose2d(input_dim, features_num * 2, 5, 2, 0, bias=False))
        self.model.add_module('batch_norm1', nn.BatchNorm2d(features_num * 2))
        self.model.add_module('relu1', nn.ReLU(True))
        self.model.add_module('deconv2', nn.ConvTranspose2d(features_num * 2, features_num, 5, 2, 0, bias=False))
        self.model.add_module('batch_norm2', nn.BatchNorm2d(features_num))
        self.model.add_module('relu2', nn.ReLU(True))
        self.model.add_module('deconv3', nn.ConvTranspose2d(features_num, channel_num, 4, 2, 0, bias=False))
        self.model.add_module('sigmoid', nn.Sigmoid())
    
    def forward(self, input):
        output = input
        for _, module in self.model.named_children():
            output = module(output)
        return output
    
def weight_init(module):
    class_name = module.__class__.__name__
    if class_name.find('conv') != -1:
        module.weight.data.normal_(0, 0.02) # convey mean and std
    if class_name.find('norm') != -1:
        module.weight.data.normal_(1, 0.02)
        
def resize_to_img(img):
    return img.data.expand(batch_size, 3, output_img_size, output_img_size)

def imgshow(input, title=None):
    if input.size()[0] > 1:
        input = input.numpy().transpose((1, 2, 0))
    else:
        input = input[0].numpy()
    min_val, max_val = np.amin(input), np.amax(input)
    if max_val > min_val:
        input = (input - min_val) / (max_val - min_val)
    pyplot.imshow(input)
    if title:
        pyplot.title(title)
    pyplot.pause(0.001)

def main():
    net = AntiCNN()
    net = net.cuda() if use_cuda else net
    criterion = nn.MSELoss()
    optimizer = optim.SGD(net.parameters(), lr=0.0001, momentum=0.9)
    
    samples = np.random.choice(10, batch_size)
    samples = torch.from_numpy(samples).type(dtype)
    
    step = 0
    num_epoch = 2
    record = []
    print('train begin')
    for epoch in range(num_epoch):
        print(f'the no.{epoch} epoch')
        train_loss = []
        for batch_index, (data, target) in enumerate(train_loader):
            target, data = data.clone().detach().requires_grad_(True), target.clone().detach()
            #target, data = target.cuda(), data.cuda() if use_cuda else target, data
            if use_cuda:
                target, data = target.cuda(), data.cuda()
            data = data.type(dtype)
            data = data.resize(data.size()[0], 1, 1, 1)
            data = data.expand(data.size()[0], input_dim, 1, 1)
            
            net.train()
            output = net(data)
            loss = criterion(output, target)
            optimizer.zero_grad()
            loss.backward()
            optimizer.step()
            step += 1
            loss = loss.cpu() if use_cuda else loss
            train_loss.append(loss.data.numpy())
            if batch_index % 300 == 0:
                net.eval()
                verify_loss = []
                index = 0
                for data, target in verify_loader:
                    target, data = data.clone().detach().requires_grad_(True), target.clone().detach()
                    index += 1
                    # target, data = target.cuda(), data.cuda() if use_cuda else target, data
                    if use_cuda:
                        target, data = target.cuda(), data.cuda()
                    data = data.type(dtype)
                    data = data.resize(data.size()[0], 1, 1, 1)
                    data = data.expand(data.size()[0], input_dim, 1, 1)
                    output = net(data)
                    loss = criterion(output, target)
                    loss = loss.cpu() if use_cuda else loss
                    verify_loss.append(loss.data.numpy())
                print(f'now no.{batch_index} batch. train loss:{np.mean(train_loss):.4f}, verify loss:{np.mean(verify_loss):.4f}')
                record.append([np.mean(train_loss), np.mean(verify_loss)])
    with torch.no_grad():
        samples.resize_(batch_size, 1, 1, 1)
    samples = samples.data.expand(batch_size, input_dim, 1, 1)
    # samples = samples.cuda() if use_cuda else samples
    if use_cuda:
        samples = samples.cuda()
    fake_u = net(samples)
    # fake_u = fake_u.cuda() if use_cuda else fake_u
    if use_cuda:
        fake_u = fake_u.cuda()
    img = resize_to_img(fake_u)
    os.makedirs(os.path.realpath('./pytorch/jizhi/image_generate/temp1'), exist_ok=True)
    util.save_image(img, os.path.realpath(f'./pytorch/jizhi/image_generate/temp1/fake{epoch}.png'))
    pyplot.show()

if __name__ == '__main__':
    main()

发现图片很模糊,可能是均方误差算的是所有手写数字的平均值,且每个图像没有明显模式,倒是平均值就是很模糊。咋整呢?可以尝试用之前的手写数字图像识别器帮助矫正MSE

4 图像生成-生成器-识别器模型

5 图像生成-GAN

6 小结

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《PyTorch生物医学视觉深度学习入门与实战--豪华版》是一本针对生物医学领域的深度学习入门教材。它涵盖了PyTorch框架下的生物医学图像处理、分割、分类、检测等任务,并提供了相关实战案例。 这本书首先介绍了生物医学视觉深度学习的基础知识,包括卷积神经网络、深度学习模型的优化和训练等。接着,书中详细解释了PyTorch框架的基本用法和相关工具,帮助读者在实践中理解和应用深度学习算法。 在实战部分,本书结合生物医学图像处理的具体问题,介绍了数据预处理、模型构建和训练、结果评估等关键步骤。读者可以通过实例学习使用PyTorch框架处理生物医学图像,如医学图像的分割、肿瘤检测和分类等任务,并了解如何应对不同情况下的挑战。 此外,书中还介绍了一些扩展内容,如生成对抗网络(GAN)在生物医学领域的应用、迁移学习等,以帮助读者深入理解和拓展知识。 综上所述,《PyTorch生物医学视觉深度学习入门与实战--豪华版》是一本全面介绍生物医学图像处理深度学习的教材,适合对生物医学领域感兴趣的学习者,通过学习本书的内容可以提高在生物医学图像处理方面的能力和应用水平。 ### 回答2: 《PyTorch生物医学视觉深度学习入门与实战--豪华版》是一本针对深度学习在生物医学视觉领域应用的学习和实践指南。 深度学习在生物医学视觉中具有重要的应用价值,例如通过图像识别和分割等技术来辅助医生进行疾病诊断和治疗。而PyTorch作为一种强大的深度学习框架,为进行生物医学视觉深度学习提供了方便和高效的工具。 《PyTorch生物医学视觉深度学习入门与实战--豪华版》从初级到高级提供了全面而系统的学习内容。书中首先介绍了深度学习的基础知识和常用算法,以及PyTorch的基本使用方法。然后,详细探讨了如何在生物医学视觉领域中应用深度学习,包括图像分割、图像分类、目标检测等任务的具体方法和实践。 此外,《PyTorch生物医学视觉深度学习入门与实战--豪华版》还提供了大量的实际案例和代码示例,读者可以通过实践来巩固所学知识。书中也讨论了一些生物医学数据集的特点和处理方法,以及常用性能评估指标的使用。 总的来说,《PyTorch生物医学视觉深度学习入门与实战--豪华版》旨在帮助读者快速入门和应用深度学习技术解决生物医学视觉问题。无论是初学者还是有一定基础的研究人员都可以从中获得深入的学习和实践经验,从而在生物医学领域取得更好的成果。 ### 回答3: 《PyTorch生物医学视觉深度学习入门与实战--豪华版》是一本关于使用PyTorch进行生物医学图像处理和深度学习的书籍。本书旨在帮助读者从零开始了解如何使用PyTorch来处理生物医学图像,并深入学习深度学习算法在生物医学图像分析中的应用。 该书首先介绍了PyTorch这一热门的深度学习框架的基本概念和使用方法,包括Tensor、模型构建、前向传播、反向传播等。然后,书中讲解了生物医学图像处理的基础知识,如图像预处理、增强和分割等技术。 在掌握了基础知识之后,读者将逐步学习应用深度学习算法处理生物医学图像的方法。书中以一系列实战项目为例,涵盖了多个生物医学图像处理任务,如肺部结节检测、乳腺癌识别、皮肤病分类等。每个项目都介绍了该任务的背景和重要性,然后详细讲解了使用PyTorch实现的具体步骤。 此外,该书还特别强调了实践的重要性。每个实战项目都包括了详细的代码示例和完整的代码实现,读者可以根据书中的指导逐步实现项目,并通过实践加深对深度学习和生物医学图像处理的理解。 总之,《PyTorch生物医学视觉深度学习入门与实战--豪华版》是一本全面介绍如何使用PyTorch进行生物医学图像处理和深度学习的书籍。它可以帮助读者从零开始学习并掌握相关知识和技能,并通过实际项目的实战经验,进一步提升自己在生物医学视觉深度学习领域的能力。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值