参考教材:人工智能导论(第4版) 王万良 高等教育出版社
实验环境:Python3.7 + Tensor flow 2.1
人工智能导论实验导航
实验一:斑马问题 https://blog.csdn.net/weixin_46291251/article/details/122246347
实验二:图像恢复 https://blog.csdn.net/weixin_46291251/article/details/122561220
实验三:花卉识别 https://blog.csdn.net/weixin_46291251/article/details/122561505
实验四:手写体生成 https://blog.csdn.net/weixin_46291251/article/details/122576478
实验源码: xxx
4.1实验介绍
4.1.1实验背景
深度学习为人工智能核心技术,本章主要围绕深度学习涉及的全连接神经网络、卷积神经网络和对抗神经网络而开设的实验。
生成对抗网络是一种训练生成网络的框架,比如生成图片的深度卷积神经网络。构建一个用来生成图片的GAN模型需要同时具备判别模型和生成模型,判别模型,用来分析一张图片是真实的还是仿造的;生成模型使用反转的卷积层将输入转换为对应像素值的完整二维图像。本实验通过GAN模型的搭建,主要介绍TensorFlow2.0计算的基本流程,以及构建网络的基本要素。
4.1.2实验目的
本章实验的主要目的是掌握深度学习相关基础知识点,了解深度学习相关基础知识,经典全连接神经网络、卷积神经网络和对抗神经网络。掌握不同神经网络架构的设计原理,熟悉使用Tensorflow 2.1深度学习框架实现深度学习实验的一般流程。同时对ModelArts自动学习模块、AI市场有初步认识,对Atlas200DK开发板模型部署相关内容有初步了解。
学习怎么定义和训练一个单独的判别模型,用来学习真假图片之间的不同点
学习怎么定义单独的生成模型,并训练同时具备生成和判别的复合模型
学习怎么评估GAN模型的表现,并使用最终得到的单独的生成模型生成图片
4.1.3实验简介
利用MINIST数据集对构建的GAN网络进行训练,最终使得该网络能够脱离数据集自动生成以假乱真的手写体图像。
4.2概要设计
GAN主要包括了两个部分,即生成器generator与判别器discriminator。生成器主要用来学习真实图像分布从而让自身生成的图像更加真实,以骗过判别器。判别器则需要对接收的图片进行真假判别。在整个过程中,生成器努力地让生成的图像更加真实,而判别器则努力地去识别出图像的真假,这个过程相当于一个二人博弈,随着时间的推移,生成器和判别器在不断地进行对抗,最终两个网络达到了一个动态均衡:生成器生成的图像接近于真实图像分布,而判别器识别不出真假图像,对于给定图像的预测为真的概率基本接近0.5(相当于随机猜测类别)。所以:
对于给定的真实图片(real image),判别器要为其打上标签1;
对于给定的生成图片(fake image),判别器要为其打上标签0;
对于生成器传给辨别器的生成图片,生成器希望辨别器打上标签1。
4.3详细设计
4.3.1 实验数据准备
数据集简介:
1). MNIST数据集来自美国国家标准与技术研究所(National Institute of Standards and
Technology ,简称NIST);
2). 该数据集由来自250个不同人手写的数字构成,其中50%是高中学生,50%来自人口普查局
的工组人员;
3). 数据集可在http://yann.lecun.com/exdb/mnist/ 获取, 它包含了四个部分:
- Training set images: train-images-idx3-ubyte.gz (9.9 MB, 解压后 47 MB, 包含 60,000 个样本)
- Training set labels: train-labels-idx1-ubyte.gz (29 KB, 解压后 60 KB, 包含 60,000 个标签)
- Test set images: t10k-images-idx3-ubyte.gz (1.6 MB, 解压后 7.8 MB, 包含 10,000 个样本)
- Test set labels: t10k-labels-idx1-ubyte.gz (5KB, 解压后 10 KB, 包含 10,000 个标签)
4). mnist是一个入门级的计算机视觉数据集,它包含各种手写数字图片,下图展示了mnist中的一些图片:
数据集加载:
import numpy as np
# ''中为放置mnist.npz的相对路径,改为自己数据集存放的路径
path = r'.\datasets\mnist.npz
f = np.load(path) #加载数据集
trainX = f['x_train'] #训练集数据获取
trainy = f['y_train'] #训练集数据标签获取
testX = f['x_test'] #测试集数据获取
testy = f['y_test'] #测试集数据标签获取
print("Train", trainX.shape, trainy.shape) #查看训练集数据形状及标签形状
print("Test", testX.shape, testy.shape) #查看验证集数据形状及标签形状
输出结果:
Train (60000, 28, 28) (60000,)
Test (10000, 28, 28) (10000,)
可视化训练集前30张图片:
from matplotlib import pyplot #从matplotlib数据库导入pyplot模块
for i in range(30): # 使用range()函数产生0到29这30个数,建立for循环
#使用subplot()构建子图,第一个参数5表示每列有5张图,
第二个参数表示每行有6张图,1+i表示第(1+i张图)
pyplot.subplot(5, 6, 1 + i)
pyplot.axis('off') # 关闭坐标轴("on"为显示坐标轴)