步骤:
一.准备数据
1.数据集读入
2.数据集乱序
3.生成训练集和数据集
4.配成对,每次读入一小撮(batch)
二.搭建神经网络:定义神经网络所以可训练参数
三.参数优化:嵌套迭代循环,with结果更新参数,显示当前loss
四.测试效果:计算当前参数前向传播后的准确率,显示当前acc
五.acc/loss可视化
import tensorflow as tf
from sklearn import datasets
from matplotlib import pyplot as plt
import numpy as np
#数据集读入
x_data = datasets.load_iris().data
y_data = datasets.load_iris().target
#数据集乱序
#seed随机种子,一个整数,每次生成的随机数都一样
np.random.seed(116) #使用相同的seed,使输入特征和标签一一对应
np.random.shuffle(x_data)
np.random.seed(116)
np.random.shuffle(y_data)
tf.random.set_seed(116)
#数据集分出训练集和测试集
x_train = x_data[:-30] #前120个数据
y_train = y_data[:-30]
x_test = x_data[-30:] #后30
y_test = y_data[-30:]
#转换x的数据类型,否则后面矩阵相乘时会因数据类型不一样而报错
x_train=tf.cast(x_train,tf.float32)
x_test=tf.cast(x_test,tf.float32)
#配对
train_db = tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(32) #每32对 打包为一个batch
test_db = tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(32)
#生成神经网络参数,4个输入特征,故输入层为4个输入节点;因为分三类,所以输出3个神经元
#定义神经网络所有可训练参数
w1 = tf.Variable(tf.random.truncated_normal([4,3],stddev=0.1,seed=1))
b1 = tf.Variable(tf.random.truncated_normal([3],stddev=0.1,seed=1))
lr = 0.1
train_loss_results = [] #记录每轮的loss
test_acc = [] #记录每轮的acc记录
epoch = 500 #循环500轮
loss_all = 0
#训练部分
#嵌套循环迭代,with结果更新参数,显示当前loss
for epoch in range (epoch): #数据集级别迭代
for step,(x_train,y_train) in enumerate(train_db): #batch级别迭代
with tf.GradientTape() as tape: #记录梯度信息
y=tf.matmul(x_train,w1)+b1 #神经网络乘加运算
y=tf.nn.softmax(y) #使y符合概率分布
y_=tf.one_hot(y_train,depth=3) #将标签值换为独热玛,方便计算loss和acc
loss=tf.reduce_mean(tf.square(y_ -y)) #均方误差损失函数
loss_all+=loss.numpy()
grads = tape.gradient(loss,[w1,b1])
w1.assign_sub(lr*grads[0]) #参数自更新
b1.assign_sub(lr*grads[1])
print("Epoch{},loss:{}".format(epoch,loss_all/4)) #4轮
train_loss_results.append(loss_all/4)#将loss_all/4的结果添加到train_loss_results
loss_all = 0
#测试部分
#total_correct为预测的样本个数,total_number测试样本总数
total_correct,total_number=0,0
for x_test,y_test in test_db:
y=tf.matmul(x_test,w1) + b1 #y为预测结果,matmul矩阵乘
y=tf.nn.softmax(y) #y符合概率分布
#返回y中最大值索引,即预测分类
pred=tf.argmax(y,axis=1)
#将pred转换为y_test的数据类型
pred=tf.cast(pred,dtype=y_test.dtype)
#若分类正确,则correct=1,否则为0,将bool型的结果转换为int型
correct=tf.cast(tf.equal(pred,y_test),dtype=tf.int32) #数据类型转换
# #将每个batch中的correct数加起来
correct=tf.reduce_sum(correct)
#将所有batch中的correct数加起来
total_correct += int(correct)
#total_number为测试样本总数即x_test行数,shape[0]返回变量的行数
total_number += x_test.shape[0]
acc=total_correct / total_number
test_acc.append(acc)
print("test_acc:",acc)
print("***********************************")
#绘制loss曲线
plt.title('Loss Function Curve') #图片标题
plt.xlabel('Epoch') #x轴名称
plt.ylabel('Loss') #y轴名称
plt.plot(train_loss_results,label="$Loss$")
plt.legend()
plt.show()
#绘制Acc曲线
plt.title('Acc Curve') #图片标题
plt.xlabel('Epoch') #x轴名称
plt.ylabel('Acc') #y轴名称
plt.plot(test_acc,label="$Accuracy$")
plt.legend()
plt.show()
结果:
最开始
当epoch达到50
当epoch达到100
当epoch达到180
epoch达到185
499
图像表达: