用 Tensorflow API:tf.keras 搭建网络八股 sequential
博主微信公众号(左)、Python+智能大数据+AI学习交流群(右):欢迎关注和加群,大家一起学习交流,共同进步!
目录
一、import 导入相关模块(导包)
# 模块导入
import numpy as np
import tensorflow as tf
from sklearn import datasets
import 相关模块。比如 import tensorflow as tf
二、导入数据集
# 导入数据集,分别为输入特征和标签
x_train = datasets.load_iris().data
y_train = datasets.load_iris().target
告知要喂入网络的训练集和测试集是什么,也就是要指定 训练集的输入特征x_train 和 训练集的标签y_train,还可以指定 测试集的输入特征x_test 和 测试集的标签y_test。
三、Sequential() 搭建网络结构
# 搭建网络结构
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(3, activation="softmax", kernel_regularizer=tf.keras.regularizers.l2())
])
在 Sequential 中搭建网络结构,逐层描述每层网络。相当于走了一遍前向传播。
搭建网络结构:
model = tf.keras.models.Sequential([网络结构]) # 描述各层网络
(1)Sequential() 可以认为是个容器,这个容器里封装了一个神经网络结构。
(2)在 Sequential() 中,要描述从输入层到输出层每一层的网络结构。每一层的网络结构可以是:拉直层、全连接层、卷积层、LSTM层。
网络结构举例:
(1)拉直层:tf.keras.layers.Flatten()
拉直层 Flatten 不含计算,只是形状转换,把输入特征拉直变成一维数组。
(2)全连接层:tf.keras.layers.Dense(神经元个数, activation="激活函数", kernel_regularizer=哪种正则化)
activation(字符串给出)可选:relu、softmax、sigmoid、tanh
kernel_regularizer 可选:tf.keras.regularizers.l1()、tf.keras.regularizers.l2()
(3)卷积层:tf.keras.layers.Conv2D(filters=卷积核个数, kernel_size=卷积核尺寸, strides=卷积步长, padding="valid" or "same")
(4)LSTM层:tf.keras.layers.LSTM()
四、compile() 配置训练方法
# 配置训练方法
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=["sparse_categorical_accuracy"])
训练方法配置:
model.compile(optimizer=优化器,
loss=损失函数,
metrics=["准确率"]
)
optimizer 可选:
(1)"sgd" or tf.keras.optimizers.SGD(lr=学习率, momentum=动量参数)
(2)"adagrad" or tf.keras.optimizers.Adagrad(lr=学习率)
(3)"adadelta" or tf.keras.optimizers.Adadelta(lr=学习率)
(4)"adam" or tf.keras.optimizers.Adam(lr=学习率, beta_1=0.9, beta_2=0.999)
loss 可选:
(1)"mse" or tf.keras.losses.MeanSquaredError()
(2)"sparse_categorical_crossentropy" or tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
有些神经网络的输出,是经过了softmax 等函数的概率分布;有些则不经过概率分布直接输出。
from_logits=False:神经网络预测结果输出前经过了概率分布。
from_logits=True:神经网络预测结果输出前没有经过概率分布,直接输出了。
坑:运行结果显示的网络评测指标和蒙的概率一样,比如,十分类我们的正确率是十分之一,网络结构又没有什么问题,很可能是 from_logits 参数设置错了。
metrics 可选:
(1)"accuracy":y_ 和 y 都是数值,比如 y_=[1] y=[1]
示例:鸢尾花分类标签是第1类鸢尾花用数值 [1] 表示,网络输出结果是第1类鸢尾花也用数值 [1] 表示。
(2)"categorical_accuracy" :y_ 和 y 都是独热码(概率分布),如 y_=[0, 1, 0] y=[0.256, 0.695, 0.04]
示例:鸢尾花分类标签是第1类鸢尾花用独热码 [0, 1, 0] 表示,网络输出结果是第1类鸢尾花也用概率分布 [0.256, 0.695, 0.04] 表示。
(3)"sparse_categorical_accuracy":y_ 是数值,y 是独热码(概率分布),如y_=[1] y=[0.256, 0.695, 0.04]
示例:鸢尾花分类标签是第1类鸢尾花用数值 [1] 表示,网络输出结果是第1类鸢尾花也用概率分布 [0.256, 0.695, 0.04] 表示。
五、fit() 执行训练过程
# 执行训练过程
model.fit(x_train,
y_train,
batch_size=32,
epochs=500,
validation_split=0.2,
validation_freq=20
)
执行训练过程:
model.fit(训练集的输入特征,
训练集的标签,
batch_size=每次喂入神经网络的样本数,
epochs=迭代多少次数据集,
validation_data=(测试集的输入特征, 测试集的标签),
validation_split=从训练集划分多少比例的数据给测试集,
validation_freq=每多少次epoch迭代使用测试集验证一次结果
)
validation_data / validation_split 二选一。
六、summary() 输出网络结构和参数统计
# 打印出网络结构和参数统计
model.summary()
示例:鸢尾花分类神经网络是四输入三输出的一层网络,这一层是 Dense 全连接。
共有 15 个参数,可训练参数 15 个,不可训练参数 0 个。
七、完整代码
# 模块导入
import numpy as np
import tensorflow as tf
from sklearn import datasets
# 导入数据集,分别为输入特征和标签
x_train = datasets.load_iris().data
y_train = datasets.load_iris().target
# 随机打乱数据(因为原始数据是顺序的,顺序不打乱会影响准确率)
# seed:随机种子,是一个整数,当设置之后,每次生成的随机数都一样
np.random.seed(116) # 使用相同的seed,保证输入特征和标签一一对应
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()