Deep-Learning-with-PyTorch

Deep-Learning-with-PyTorch-2.2.3

2020-09-08  本文已影响0人  追求科技的足球

2.2.3将马匹变成斑马的网络

我们现在可以使用此模型。 CycleGAN网络已经在从ImageNet数据集中提取的(不相关的)马图像和斑马图像的数据集中进行了训练。 网络学习如何拍摄一匹或多匹马的图像并将它们全部变成斑马,而图像的其余部分则尽可能保持不变。 在过去的几千年中,人类并没有这种可以将马匹变成斑马的工具,但这项任务展示了这些体系结构能够在远程监督下为复杂的现实过程建模的能力。 尽管它们有其局限性,但有迹象表明,在不久的将来,我们将无法在实时视频供稿中从假冒中分辨出真相,这将打开一罐蠕虫,我们将立即关闭它们。

体验经过预训练的CycleGAN,将使我们有机会更进一步,并研究如何实现网络(在这种情况下为生成器)的实现。 我们将使用我们的老朋友ResNet。 我们将在屏幕外定义一个ResNet Generator类。 该代码位于3_cyclegan.ipynb文件的第一个单元格中,但是该实现目前不相关,并且在我们获得更多PyTorch经验之前,它太复杂了以至于无法遵循。 目前,我们专注于它可以做什么,而不是它如何做到。 让我们使用默认参数(code / p1ch2 / 3_cyclegan.ipynb)实例化该类:

# In[2]:
etG = ResNetGenerator()

netG模型已创建,但包含随机权重。 前面我们提到过,我们将运行在horse2zebra数据集上进行过预训练的生成器模型,该模型的训练集分别包含两组马和斑马的1068和1335图像。 该数据集位于http://mng.bz/8pKP。 模型的权重已保存在.pth文件中,该文件不过是模型的张量参数的pickle文件。 我们可以使用模型的load_state_dict方法将其加载到ResNetGenerator中:

# In[3]:
model_path = '../data/p1ch2/horse2zebra_0.4.0.pth'
model_data = torch.load(model_path)
netG.load_state_dict(model_data)

至此,netG已经获得了训练期间获得的所有知识。 注意,这完全等同于在2.1.3节中从Torchvision加载resnet101时发生的情况; 但是torchvision.resnet101函数隐藏了我们的加载过程。

让我们将网络置于评估模式,就像对resnet101所做的那样:

# In[4]:
netG.eval()
# Out[4]:
ResNetGenerator(
    (model): Sequential(
...
    )
)

像我们之前所做的那样打印模型,考虑到它的作用,我们可以欣赏到它实际上非常简洁。 它拍摄图像,通过查看像素识别一匹或多匹马,并单独修改这些像素的值,以使输出的图像看起来像是可靠的斑马。 我们不会在打印输出中(或在源代码中)识别出任何类似斑马的东西:那是因为其中没有任何类似斑马的东西。 网络是一个脚手架-果汁是权重。

我们已经准备好加载随机的一匹马的图像,并查看生成器产生的结果。 首先,我们需要导入PIL和Torchvision:

# In[5]:
from PIL import Image
from torchvision import transforms

然后,我们定义一些输入转换,以确保数据以正确的形状和大小进入网络:

# In[6]:
preprocess = transforms.Compose([transforms.Resize(256),transforms.ToTensor()])

让我们打开一个马文件(见图2.7):

# In[7]:
img = Image.open("../data/p1ch2/horse.jpg")
img
图2.7 一个男人骑马。 那匹马没有接住它

好吧,那匹马有一个家伙。 (不太久,根据图片来判断。)无论如何,让我们通过预处理,然后将其变成形状合适的变量:

# In[8]:
img_t = preprocess(img)
batch_t = torch.unsqueeze(img_t, 0)

我们现在不应该担心细节。 重要的是我们要远距离跟随。 此时,可以将batch_t发送到我们的模型:

# In[9]:
batch_out = netG(batch_t)

现在,batch_out是生成器的输出,我们可以将其转换回图像:

# In[10]:
out_t = (batch_out.data.squeeze() + 1.0) / 2.0
out_img = transforms.ToPILImage()(out_t)
# out_img.save('../data/p1ch2/zebra.jpg')
out_img

# Out[10]:
<PIL.Image.Image image mode=RGB size=316x256 at 0x23B24634F98>

天啊,谁这样骑斑马? 生成的图像(图2.8)不是完美的,但考虑到网络中发现有人骑着马是有点不寻常的。 值得一提的是,学习过程还没有经过直接的监督,人类已经划定了数以万计的马匹或用Photoshop加工了成千上万的斑马条纹。 生成器已经学会了产生一个图像,该图像会使鉴别者误以为是斑马线,而且图像上没有任何东西可疑(显然,鉴别者从未去过牛仔竞技场)。


图2.8 一个男人骑斑马。 那匹斑马没有承受它

已经使用对抗训练或其他方法开发了许多其他有趣的生成器。 其中一些人有能力制造不存在的个人的可靠人脸。 其他人则可以将草图转换为虚构景观的逼真的图片。 还正在探索生成模型,以产生真实的音频,可信的文本和令人愉悦的音乐。 这些模型可能会成为支持创作过程的未来工具的基础。

认真地说,很难夸大这种工作的含义。 诸如我们刚刚下载的工具之类的工具只会变得质量更高,更普及。 尤其是换脸技术已经引起了媒体的广泛关注。 搜索“深度伪造品”将显示大量示例内容(尽管我们必须注意,有大量这样的不安全的工作内容标记为此类;对于互联网上的所有内容,请仔细单击)。

到目前为止,我们已经有机会使用可以看到图像的模型和可以生成新图像的模型。 我们将以一个涉及更多基本要素的模型(自然语言)结束旅程。

上一篇下一篇

猜你喜欢

热点阅读