使用tf.keras快速搭建神经网络

1、keras介绍

  tf.keras 是 tensorflow2 引入的高封装度的框架,可以用于快速搭建神经网 络模型,keras 为支持快速实验而生,能够把想法迅速转换为结果,是深度学习 框架之中最终易上手的一个,它提供了一致而简洁的 API,能够极大地减少一般 应用下的工作量,提高代码地封装程度和复用性。

  文档地址:https://tensorflow.google.cn/api_docs/python/tf

image-20220512211540725

  文档挺全的,想查哪个APi就去翻翻官网。

2、搭建神经网络六步法

  • 第一步:import 相关模块,如 import tensorflow as tf

  • 第二步:指定输入网络的训练集和测试集,如指定训练集的输入 x_train 和标签 y_train,测试集的输入 x_test 和标签 y_test。

  • 第三步:逐层搭建网络结构,model = tf.keras.models.Sequential()

  • 第四步:在 model.compile()中配置训练方法,选择训练时使用的优化器、损失 函数和最终评价指标。

  • 第五步:在 model.fit()中执行训练过程,告知训练集和测试集的输入值和标签、 每个 batch 的大小(batchsize)和数据集的迭代次数(epoch)。

  • 第六步:使用 model.summary()打印网络结构,统计参数数目。

3、关键函数的用法介绍

tf.keras.models.Sequential()

  Sequential 函数是一个容器,描述了神经网络的网络结构,在 Sequential 函数的输入参数中描述从输入层到输出层的网络结构。

拉直层tf.keras.layers.Flatten()

  拉直层可以变换张量的尺寸,把输入特征拉直为一维数组,是不含计算参数的层。

全连接层tf.keras.layers.Dense( 神经元个数, activation=”激活函数”, kernel_regularizer=”正则化方式”)

activation(字符串给出)可选 relu、softmax、sigmoid、tanh 等

kernel_regularizer 可选 tf.keras.regularizers.l1()、 tf.keras.regularizers.l2()。

卷积层tf.keras.layers.Conv2D( filter = 卷积核个数, kernel_size = 卷积核尺寸, strides = 卷积步长, padding = “valid” or “same”)

LSTM 层tf.keras.layers.LSTM()

Model.compile( optimizer = 优化器, loss = 损失函数, metrics = [“准确率”])

  Compile 用于配置神经网络的训练方法,告知训练时使用的优化器、损失函 数和准确率评测标准。

  optimizer 可以是字符串形式给出的优化器名字,也可以是函数形式,使用函数 形式可以设置学习率、动量和超参数。

可选项包括:

 ‘sgd’ or tf.optimizers.SGD( lr=学习率, decay=学习率衰减率, momentum=动量参数) 
 ‘adagrad’ or tf.keras.optimizers.Adagrad(lr=学习率, decay=学习率衰减率) 

‘adadelta’ or tf.keras.optimizers.Adadelta(lr=学习率, decay=学习率衰减率)

 ‘adam’ or tf.keras.optimizers.Adam (lr=学习率, decay=学习率衰减率)
 

Loss 可以是字符串形式给出的损失函数的名字,也可以是函数形式。

可选项包括:

 ‘mse’or tf.keras.losses.MeanSquaredError() 

‘sparse_categorical_crossentropy or tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)

损失函数常需要经过 softmax 等函数将输出转化为概率分布的形式。

from_logits 则用来标注该损失函数是否需要转换为概率的形式,取 False 时表 示转化为概率分布,取 True 时表示没有转化为概率分布,直接输出。

Metrics 标注网络评测指标。

可选项包括:

‘accuracy’:y_和 y 都是数值,如 y_=[1] ,y=[1]。

‘categorical_accuracy’:y_和 y 都是以独热码和概率分布表示。如 y_=[0, 1, 0], y=[0.256, 0.695, 0.048]。

‘sparse_ categorical_accuracy’:y_是以数值形式给出,y 是以独热码形式 给出。如 y_=[1],y=[0.256, 0.695, 0.048]。

model.fit(训练集的输入特征,
训练集的标签,
batch_size, epochs, 
validation_data = (测试集的输入特征,测试集的标签), 
validataion_split = 从测试集划分多少比例给训练集, 
validation_freq = 测试的 epoch 间隔次数)

fit 函数用于执行训练过程。

model.summary()

  summary 函数用于打印网络结构和参数统计

image-20220512212558903

上图是 model.summary()对鸢尾花分类网络的网络结构和参数统计,对于一 个输入为 4 输出为 3 的全连接网络,共有 15 个参数。

4、快速搭建网络实现鸢尾花数据集分类

#第一步:import 相关模块:
import tensorflow as tf
from sklearn import datasets
import numpy as np
# 第二步:指定输入网络地训练集和测试集
# 其中测试集的输入特征 x_test 和标签 y_test 可以像 x_train 和 y_train 
#一样直接从数据集获取,也可以如上述在 fit 中按比例从训练集中划分,本例选择
#从训练集中划分,所以只需加载 x_train,y_train 即可。
x_train = datasets.load_iris().data
y_train = datasets.load_iris().target

# 数据集乱序
np.random.seed(116)
np.random.shuffle(x_train)
np.random.seed(116)
np.random.shuffle(y_train)
tf.random.set_seed(116)

#第三步:逐层搭建网络结构
# 本例使用了单层全连接网络,第一个参数表示神经元个数,第二个参数表示网络所使用的激活函数,第三个参数表示选用的正则化方法。
# 使用 Sequential 可以快速搭建网络结构,但是如果网络包含跳连等其他复
#杂网络结构,Sequential 就无法表示了。就需要使用 class 来声明网络结构。
model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())
])
# 第四步:在 model.compile()中配置训练方法
# 本例使用 SGD 优化器,并将学习率设置为 0.1 ,选择
#SparseCategoricalCrossentrop 作为损失函数。由于神经网络输出使用了
#softmax 激活函数,使得输出是概率分布,而不是原始输出,所以需要将
#from_logits 参数设置为 False。鸢尾花数据集给的标签是 0,1,2 这样的数值,
#数据集中的标签是数值,神经网络输出y是概率分布,所以 metrics 需要设置为sparse_categorical_accuracy。
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),      loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=['sparse_categorical_accuracy'])
# 第五步:在 model.fit()中执行训练过程
# x_train,y_train 分别表示网络的输入特征和标签
# batch_size 表示一次喂入神经网络的数据量
# epochs 表示数据集的迭代次数
# validation_split 表示数据集中测试集的划分比例,validation_split=0.2 从训练集中选取20%的数据作为测试集
# validation_freq=20 每迭代20次训练集要在测试集中验证一次准确率
model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20)

#第六步:使用 model.summary()打印网络结构,统计参数数目
model.summary()

image-20220512213015146

image-20220512213000941

5、快速实现MNIST手写体数字识别

5.1 MNIST数据集介绍

  MNIST 数据集一共有 7 万张图片,是 28×28 像素的 0 到 9 手写数字数据集, 其中 6 万张用于训练,1 万张用于测试。每张图片包括 784(28×28)个像素点, 使用全连接网络时可将 784 个像素点组成长度为 784 的一维数组,作为输入特征。数据集图片如下所示。

image-20220512213727010

image-20220512214328642

5.2 查看MNIST数据集结构

  导入数据集:keras 函数库中提供了使用 mnist 数据集的接口,代码如下所示,可以使用 load_data()直接从 mnist 中读取测试集和训练集。

import tensorflow as tf
from matplotlib import pyplot as plt

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()

  输入全连接网络时需要先将数据拉直为一维数组,把 784 个像素点的灰度值作为输入特征输入神经网络。

tf.keras.layers.Flatten()

image-20220512215109124

  使用 plt 库中的两个函数可视化训练集中的图片。

plt.imshow(x_train[0],cmap=’gray’)	# 绘制灰度图
plt.show()

image-20220512214741721

  使用 print 打印出训练集中第一个样本以二位数组的形式打印出来,如下所示。

# 打印出训练集输入特征的第一个元素
print("x_train[0]:\n", x_train[0])

image-20220512214840057

  打印出第一个样本的标签,为 5。

print(“y_train[0]:,y_train[0])

image-20220512214912019

  打印出测试集样本的形状,共有 10000 个 28 行 28 列的三维数据。

# 打印出整个测试集输入特征的形状
print("x_test.shape:\n", x_test.shape)

image-20220512214958656

5.3 训练MNIST数据集

  使用Sequential实现手写数字识别。

import tensorflow as tf

mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 归一化
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=['sparse_categorical_accuracy'])

model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)
model.summary()

  模型摘要:

image-20220512215151814

image-20220512215212878

  值得注意的是训练时需要将输入特征的灰度值归一化到[0,1]区间,这可以 使网络更快收敛。

  训练时每个 step 给出的是训练集 accuracy 不具有参考价值,有实际评判价值的是 validation_freq 中设置的隔若干轮输出的测试集 accuracy。如下图所示。

image-20220512215505712

6、训练Fashion_mnist数据集

  Fashion_mnist 数据集具有 mnist 近乎所有的特征,包括 60000 张训练图片 和 10000 张测试图片,图片被分为十类,每张图像为 28×28 的分辨率。

image-20220512220721302

  类别如下所示:

Label Description
0 T恤(T-shirt/top)
1 裤子(Trouser)
2 套头衫(Pullover)
3 连衣裙(Dress)
4 外套(Coat)
5 凉鞋(Sandal)
6 衬衫(Shirt)
7 运动鞋(Sneaker)
8 包(Bag)
9 靴子(Ankle boot)

训练该数据集:

   由于 Fashion_mnist 数据集和 mnist 数据集具有相似的属性,所以对于 mnist 只需讲 mnist 数据集的加载换成 Fashion_mnist 就可以训练 Fashion 数据集了

import tensorflow as tf

fashion = tf.keras.datasets.fashion_mnist
(x_train, y_train),(x_test, y_test) = fashion.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(),
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=['sparse_categorical_accuracy'])

model.fit(x_train, y_train, batch_size=32, epochs=5, validation_data=(x_test, y_test), validation_freq=1)
model.summary()

image-20220512221112817

  模型摘要如下:

image-20220512221124978

   到底,使用tf.keras快速搭建神经网络模型的方法就介绍完了。

猜你喜欢

转载自blog.csdn.net/qq_43753724/article/details/124741375