用 Tensorflow API:tf.keras 搭建网络八股 class
博主微信公众号(左)、Python+智能大数据+AI学习交流群(右):欢迎关注和加群,大家一起学习交流,共同进步!
目录
一、import 导入相关模块(导包)
二、导入数据集
三、Class() 搭建网络结构
四、compile() 配置训练方法
五、fit() 执行训练过程
六、summary() 输出网络结构和参数统计
七、完整代码
# 模块导入
import numpy as np
import tensorflow as tf
from sklearn import datasets
from tensorflow.keras.layers import Dense
from tensorflow.keras import Model
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。
# 搭建网络结构
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()
使用 Sequential() 可以搭建出上层输出就是下层输入的顺序网络结构,但是无法写出一些带有跳连的非顺序网络结构,这个时候我们可以选择用类 class 搭建神经网络结构。
用类 class 搭建网络结构:
class MyModel(Model):
def __init__(self):
super(MyModel, self).__init__()
# 定义网络结构快
pass
def call(self, x):
# 调用网络结构快
pass
return y
model = MyModel()
# 配置训练方法
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] 表示。
# 执行训练过程
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 二选一。
# 打印出网络结构和参数统计
model.summary()
示例:鸢尾花分类神经网络是四输入三输出的一层网络,这一层是 Dense 全连接。
共有 15 个参数,可训练参数 15 个,不可训练参数 0 个。
# 模块导入
import numpy as np
import tensorflow as tf
from sklearn import datasets
from tensorflow.keras.layers import Dense
from tensorflow.keras import Model
# 导入数据集,分别为输入特征和标签
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)
# 搭建网络结构
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.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()