【tensorflow】tf.keras + Sequential() 6 步搭建神经网络
tf.keras 是 tensorflow API,可以快速搭建神经网络模型。
六步:
- import 相关模块。
- 指定要喂入网络的训练集和测试集。
- 在 Sequential() 中搭建网络结构。
- 在 compile() 中配置训练方法。
- 在 fit() 中执行训练过程。
- 用 summary() 打印出网络的结构和参数统计。
可以认为是一种容器,这个容器封装了一个神经网络结构。
在 Sequential() 中,要描述从输入层到输出层每一层的网络结构。
model = tf.keras.models.Sequential([网络结构])
每一层的网络结构可以是:
拉直层:不含计算,只是形状转换,把输入特征拉直成一维数组
tf.keras.layers.Flatten()
全连接层:
tf.keras.layers.Dense(神经元个数, activation="激活函数", kernel_regularizer=哪种正则化)
- 激活函数可以选择:“relu”,“softmax”,“sigmoid”,“tanh”(以字符串给出)
- 正则化可以选择:
tf.keras.regularizers.l1()
tf.keras.regularizers.l2()
卷积神经网络层
循环神经网络层
配置神经网络的训练方法,告知训练时选择的优化器、损失函数和评测指标。
model.compile(optimizer=优化器, loss=损失函数, metrics=["评测指标"])
- 优化器可以是字符串形式给出的优化器名字:“sgd”,“adagrad”,“adadelta”,“adam”
还可以是函数形式:
tf.keras.optimizers.SGD(lr=学习率, momentum=动量参数)
tf.keras.optimizers.Adagrad(lr=学习率)
tf.keras.optimizers.Adadelta(lr=学习率)
tf.keras.optimizers.Adam(lr=学习率, beta_1=0.9, beta_2=0.999)
- loss 可以是字符串给出的损失函数名字:“mse”,“sparse_categorical_crossentropy”
也可以是函数形式:
tf.keras.losses.MSE()
tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
有些神经网络的输出是经过了softmax函数的概率分布,有些则不经概率分布直接输出。
可以认为 from_logits 这个参数是在询问:是否是原始输出,即没有经过概率分布的输出。
如果神经网络预测结果输出前经过了概率分布,写False;
如果神经网络预测结果输出前没有经过概率分布,写True。
- metrics 告知网络评测指标:
y_:标签,y:预测结果
“accuracy”:y_和y都是以数字形式给出
“categorical_accuracy”:y_和y都是以独热码(概率分布)的形式给出
“sparse_categorical_accuracy”:y_以数值形式给出,y以独热码形式给出
执行训练过程。
model.fit(训练集的输入特征, 训练集的标签,
batch_size=, epochs=,
validation_data=(测试集的输入特征, 测试集的标签),
validation_split=从训练集中划分多少比例给测试集,
validation_freq=多少次epoch测试一次 )
- validation_data,validation_split 二选其一
summary()
打印出网络的结构和参数统计。
鸢尾花分类代码:(不使用 tf.keras API的代码)
# import 相关模块
import tensorflow as tf
import numpy as np
from sklearn import datasets
# 指定要喂入网络的训练集和测试集
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() 中搭建网络结构
model = tf.keras.models.Sequential(
# 全连接层
# tf.keras.layers.Dense(神经元个数,
# activation="激活函数",
# kernel_regularizer=哪种正则化)
[tf.keras.layers.Dense(3,
activation="softmax",
kernel_regularizer=tf.keras.regularizers.l2())]
)
# 使用 compile() 配置神经网络的训练方法
# model.compile(optimizer=优化器,
# loss=损失函数,
# metrics=["评测指标"])
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=[tf.keras.metrics.sparse_categorical_accuracy])
# 在 fit() 中执行训练过程
# model.fit(训练集的输入特征, 训练集的标签,
# batch_size=, epochs=,
# validation_data={测试集的输入特征, 测试集的标签},
# validation_split=从训练集中划分多少比例给测试集,
# validation_freq=多少次epoch测试一次
# )
model.fit(x_train, y_train,
batch_size=32, epochs=500,
validation_split=0.2,
validation_freq=20)
# 打印出网络的结构和参数统计
model.summary()