【tensorflow】tf.keras + Sequential, 6 步搭建神经网络

tf.keras 是 tensorflow API,可以快速搭建神经网络模型。

六步:

  1. import 相关模块。
  2. 指定要喂入网络的训练集和测试集。
  3. 在 Sequential() 中搭建网络结构。
  4. 在 compile() 中配置训练方法。
  5. 在 fit() 中执行训练过程。
  6. 用 summary() 打印出网络的结构和参数统计

Sequential()

可以认为是一种容器,这个容器封装了一个神经网络结构。

在 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()

卷积神经网络层

循环神经网络层

compile()

配置神经网络的训练方法,告知训练时选择的优化器、损失函数和评测指标。

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以独热码形式给出

fit()

执行训练过程。

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()