本文基于北京大学软件与微电子学院曹健老师的Tensorflow笔记整理 ——b站视频教程
tf.keras搭建神经网络
六步法搭建神经网络
- 第一步: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()打印网络结构,统计参数数目。
介绍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
fit 函数用于执行训练过程。
( ( 训练集的输入特征, 训练集的标签, batch _size, epochs,
validation_data = ( ( 测试集的输入特征,测试集的标签) ) ,
validataion_split = 从测试集划分多少比例给训练集,
validation_freq = 测试的 epoch 间隔次数) )
model.summary
summary 函数用于打印网络结构和参数统计。
iris 数据集代码六步法复现
import tensorflow as tf
from sklearn import datasets
import numpy as np
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)
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())
])
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=32, epochs=500, validation_split=0.2, validation_freq=20)
model.summary()
可以看到用六步法写出的代码明显比机器学习入门(6)——神经网络实现鸢尾花分类中的代码精简。
上面的代码使用 Sequential 可以快速搭建网络结构,但是如果网络包含跳连等其他复杂网络结构,Sequential 就无法表示了。这就需要使用 class 来声明网络结构。
使用 class 类封装网络结构,如下所示是一个 class 模板,MyModel 表示声明的神经网络的名字,括号中的 Model 表示创建的类需要继承 tensorflow 库中的 Model 类。类中需要定义两个函数,init()函数为类的构造函数用于初始化类的参数,spuer(MyModel,self).init()这行表示初始化父类的参数。之后便可初始化网络结构,搭建出神经网络所需的各种网络结构块。call()函数中调用init()函数中完成初始化的网络块,实现前向传播并返回推理值。使用 class 方式搭建鸢尾花网络结构的代码如下所示。
class IrisModel(Model):
def __init__(self):
super(IrisModel, self).__init__()
self.d1 = Dense(3, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())
def call(self, x):
y = self.d1(x)
return y
model = IrisModel()
搭建好网络结构后只需要使用 Model=MyModel()构建类的对象,就可以使用该模型了。
训练MNIST数据集
介绍扩大虚拟内存的方法
用六步法实现训练MNIST数据集
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()
练习——用六步法训练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=1, epochs=5, validation_data=(x_test, y_test), validation_freq=1)
model.summary()
Comments NOTHING