import tensorflow as tf
import numpy as np
#数据的准备,导入iris数据集
from sklearn.datasets import load_iris #这里导入的是sklearn数据库中的iris数据集,直接载入即可。
data = load_iris()
#本例只需要iris的特征与分类目标,只获取date和target
iris_target = data.target
iris_data = np. float32(data.data) #将其转化为float类型的列表(list)
#数据的处理
iris_target = np.float32(tf.keras.utils.to_categorical(iris_target, num_classes=3))#使用Keras自带的分散化工具对数据进行处理
iris_data = tf.data.Dataset.from_tensor_slices(iris_data).batch(50)#当生成的数据读取到内存中
iris_target = tf.data.Dataset.from_tensor_slices(iris_target).batch(50)#并准备以批量形式打印时
#模型
model = tf.keras.models.Sequential()#创建一个Sequential(顺序)模型,由多个网络层线性堆叠而成的。
# Add layers #之后根据需要逐级向其中添加不同的全连接层
model.add(tf.keras.layers.Dense(32, activation="relu"))
model.add(tf.keras. layers.Dense(64, activation="relu"))
model.add(tf.keras.layers.Dense(3, activation="softmax"))
#直接调用TensorFlow的优化器完成梯度函数的计算,这里用Adam优化器作为优化工具
opt = tf.optimizers.Adam(1e-3)
for epoch in range(1000):
for data, lable in zip(iris_data, iris_target):
with tf.GradientTape() as tape:
#这里的损失函数采用的是交叉熵函数(softmax_crossentroy),使得数据计算分布能够最大限度地拟合目标值
#CategoricalCrossentropy函数用于计算多分类问题的交叉熵
logits = model(data) #固定写法
loss_value = tf.reduce_mean(tf.keras.losses.categorical_crossentropy(y_true=lable, y_pred=logits)) #固定写法
#首先通过模型计算出对应的值(内部采用前向调用函数),之后用tf.reduce_mean计算出损失函数
#梯度更新函数是根据误差的幅度对数据进行更新的方法
grads = tape. gradient(loss_value, model.trainable_variables)
opt.apply_gradients(zip(grads, model.trainable_variables))
#使用的模型直接获取参数的方式对数据进行不断更新而非人为指定
print('Training loss is:', loss_value. numpy())