【Tensorflow】用Tensorflow API:tf.keras搭建网络八股

【Tensorflow】用Tensorflow API:tf.keras搭建网络八股

  • 六步法

    • 1.import

    • 2.train, test

    • 3.model = tf.keras.models.Sequential

    • 4.model.compile

    • 5.model.fit

    • 6.model.summary

我们对以上六步进行说明:

  1. import :引入相关模块,比如 import tensorflow as tf;
  2. traintest:告知要喂入网络的训练集和测试集分别是什么,即指定训练集的输入特征x_train和训练集的标签y_train以及指定测试集的输入特征x_test和标签y_test;
  3. Sequential中搭建网络结构,逐层描述神经网络,相当于走了一遍前向传播;
  4. compile 中配置训练方法,告知训练时选择哪种优化器,选择哪个损失函数,选择哪种评测指标;
  5. fit 中执行训练过程,告知训练集和测试集的输入特征和标签,告知每个batch是多少,告知要迭代多少次数据集;
  6. summary打印出网络的结构和参数统计。

Sequential

model = tf.keras.models.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(filters = 卷积核个数,kernel_size = 卷积核尺寸,strides = 卷积步长,padding = "valid" or "same")
LSTM层:tf.keras.layers.LSTM()

model.compile

model.compile(optimizer = 优化器,loss = 损失函数,metrics = ["准确率"])
optimizer 可选:
'sgd' or tf.keras.optimizers.SGD(lr = 学习率,momentum = 动量参数)
'adagrad' or tf.keras.optimizers.Adagrad(lr = 学习率)
'adadelta' or tf.keras.optimizers.Adadelta(lr = 学习率)
'adam' or tf.keras.optimizers.Adam(lr = 学习率,beta_1=0.9,beta_2=0.999)
loss 可选:
'mse' or tf.keras.losses.MeanSquaredError()
'sparse_categorical_crossentropy' or tf.keras.losses.SparseCategoricalCrossentropy(from_logits = False)  #神经网络的输出结果经过了概率分布则from_logits = Flase,如果没有经过概率分布则为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_crossentropy':y_是数值,y是独热码,如y_=[1],y=[0.256,0.695,0.048]

model.fit

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

summary

model.summary()  #打印出网络的结构和参数统计,每一层参数个数以及总个数

代码实现

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())
])
# 3个神经元,激活函数用softmax,采用l2正则

model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
              metrics=['sparse_categorical_accuracy'])
# 配置训练方法 优化器选用SGD优化器,设置学习率为0.1,选用SparseCategoricalCrossentropy作为损失函数
# 因为鸢尾花数据集中的标签为0 1 2,是数值,神经网络的前向传播是概率分布,所以metrics选取'sparse_categorical_accuracy' 作为评测指标
model.fit(x_train, y_train, batch_size=32, epochs=500, validation_split=0.2, validation_freq=20)
# 执行训练过程,输入训练特征和标签,以及每一次喂入神经网络多少对特征和标签
# epochs写数据集迭代循环多少次,validation_split告知从训练集中选择20%的数据作为测试集
# validation_freq表示每迭代20次训练集要在测试集中验证一次准确率
model.summary()
# 用summary打印出网络结构和参数统计

epoch是什么?

epoch是要设定的一个参数,可以设定为从1到无穷大,一个epoch意味着训练集中每一个样本都参与训练了一次。

比如训练集有50000个样本,而我设定的batch size是50,也就是说每50个样本才更新一次参数,那么也就意味着一个epoch里会提取1000次bach,这样才会把每个样本都提取了一遍,更新了1000此参数。这是一个epoch里做的,一次类推,我要设定2000个epoch意味着把这个过程重复2000次。也就是训练集里的每个样本都被提取了2000次。1

以后都可以使用这六步进行使用Sequential搭建神经网络结构,但是仅限于上层输出是下层输入的情形,若想出现跳连情况(上层输出可以是下几层部分输入)请见下一篇博客,本文用于记录近期所学内容。

  1. 1 ↩︎

猜你喜欢

转载自blog.csdn.net/qq_45746168/article/details/128032955