Tensorflow2.x框架-用 Tensorflow API:tf.keras 搭建网络八股 class

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

博主微信公众号(左)、Python+智能大数据+AI学习交流群(右):欢迎关注和加群,大家一起学习交流,共同进步!

目录

一、import 导入相关模块(导包)

二、导入数据集

三、Class() 搭建网络结构

四、compile() 配置训练方法

五、fit() 执行训练过程

六、summary() 输出网络结构和参数统计

七、完整代码


一、import 导入相关模块(导包)

# 模块导入
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() 搭建网络结构

# 搭建网络结构
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() 

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

你可能感兴趣的:(Tensorflow2.x框架-用 Tensorflow API:tf.keras 搭建网络八股 class)