深度学习算法--利用tf.GradientTape自定义鸢尾花神经网络分类模型

利用tensorflow2自动求导机制tf.GradientTape自定义鸢尾花数据集的神经网络分类模型

import tensorflow as tf
from sklearn import datasets  # 导入数据集
import numpy as np

# 构建模型(神经网络的前向传播) --> 定义损失函数 --> 定义优化函数 --> 定义tape --> 模型得到预测值 -->
# 前向传播得到loss --> 反向传播 --> 用优化函数将计算出来的梯度更新到变量上面去。
iris = datasets.load_iris()
data = iris.data
labels = iris.target
data = np.concatenate((data, labels.reshape(150, 1)), axis=-1)
# 将数据打乱:神经网络的拟合能力太强了,如果不乱序的话,同一个组合的batch反复出现,模型有可能会“记住”这些样本的次序,从而影响泛化能力。
np.random.shuffle(data)
# 将数据拆分为数据和标签
Y = data[:, -1]
X = data[:, :4]

# 1.构建模型
# 子类模型
class MyModel(tf.keras.Model):
    def __init__(self):
        super(MyModel, self).__init__()
        self.D1 = tf.keras.layers.Dense(32, activation='relu')
        self.D2 = tf.keras.layers.Dense(32, activation='relu')
        self.D3 = tf.keras.layers.Dense(3, activation='softmax')

    def call(self, inputs):
        x = self.D1(inputs)
        x = self.D2(x)
        x = self.D3(x)
        return x

model = MyModel()
# 2.定义损失函数
# 如果目标是数字编码,比如[1,3,4]每个数字即是label,
# 使用SparseCategoricalCrossentropy(),Sparse是稀疏的意思,在对稀疏的目标值预测时有用。与多类交叉熵相同,适用于稀疏情况
# from_logits=False,output为经过softmax输出的概率值。
# from_logits=True,output为经过网络直接输出的 logits张量。
loss_object = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
# 3.定义优化函数
# 随机梯度下降
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)
batch_size = 32
# from_tensor_slices()把给定的元组、列表和张量等数据进行特征切片。切片的范围是从最外层维度开始的。如果有多个特征进行组合,
# 那么一次切片是把每个组合的最外维度的数据切开,分成一组一组的。
train_dataset = tf.data.Dataset.from_tensor_slices((X, Y))
train_dataset = train_dataset.shuffle(buffer_size=64).batch(batch_size)
# 在Keras中,官方内置了几种评价函数。
# 对于二分类问题,评价指标可以用 binary_accuracy,就是最直观上讲的准确率。
# 当面对多分类或者多标签的任务时,评价度量可能会用到这两个 categorical_accuracy和 sparse_categorical_accuracy
train_acc_metric = tf.keras.metrics.SparseCategoricalAccuracy()
epochs = 100
for epoch in range(epochs):
    for step, (x_batch_train, y_batch_train) in enumerate(train_dataset):
        # 定义tape计算梯度
        with tf.GradientTape() as tape:
            # 运行该模型的前向传播。 模型应用于其输入的操作将记录在GradientTape上。
            logits = model(x_batch_train)  # 这个minibatch的预测值
            # 计算这个minibatch的损失值
            loss_value = loss_object(y_batch_train, logits)

        grads = tape.gradient(loss_value, model.trainable_weights)
        optimizer.apply_gradients(zip(grads, model.trainable_weights))
        # 更新训练集的metrics
        train_acc_metric(y_batch_train, logits)

    train_acc = train_acc_metric.result()
    print('Training acc over epoch: %s' % (float(train_acc),))

猜你喜欢

转载自blog.csdn.net/fgg1234567890/article/details/115190779