1.背景
鸢尾花的测量数据可以确定鸢尾花的种类,这些花之前已经被植物学专家鉴定为属于 setosa、versicolor 或 virginica 三个品种之一。对于这些测量数据,她可以确定每朵鸢尾花所属的品种。我们假设这位植物学爱好者在野外只会遇到这三种鸢尾花。我们的目标是构建一个机器学习模型,可以从这些已知品种的鸢尾花测量数据中进行学习,从而能够预测新鸢尾花的品种。
2.简单神经网络(鸢尾花分类)搭建:
1.数据处理
1.数据集读入
from sklearn import datasets#机器学习常用包,这里提供数据集
x_data=datasets.load_iris().data#从load_iris数据集中导入输入特征 y_data=datasets.load_iris().target#从load_iris数据集中导入标签
2.数据集乱序
np.random.seed(116)#随机数种子
np.random.shuffle(x_data)#打乱数据集输入特征
np.random.seed(116)#随机数种子
np.random.shuffle(y_data)#打乱数据集标签
tf.random.set_seed(116)
3.数据集中分出训练集与测试集
x_train=x_data[:-30]#截取数据集输入特征倒数30行之前作为训练集
y_train=y_data[:-30]#截取数据集标签倒数30行之前作为训练集
x_test=x_data[-30:]#截取数据集标签末尾30行作为训练集
y_test=y_data[-30:]#截取数据集标签末尾30行作为训练集
4.配成[输入特征,标签]对,每次喂入一个batch
train_db=tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(30)#将训练集输入特征和标签组合成元组,并以30组为一批
test_db=tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(30)#将测试集输入特征和标签组合成元组,并以30组为一批
2.构建模型:
scikit-learn 中有许多可用的分类算法。这里用的是 k 近邻分类器,这是一个很容易理解的算法。构建此模型只需要保存训练 集即可。要对一个新的数据点做出预测,算法会在训练集中寻找与这个新数据点距离最近 的数据点,然后将找到的数据点的标签赋值给这个新数据点。 k 近邻算法中 k 的含义是,我们可以考虑训练集中与新数据点最近的任意 k 个邻居(比如 说,距离最近的 3 个或 5 个邻居),而不是只考虑最近的那一个。
1.定义神经网络中所有训练的参数
w1=tf.Variable(tf.random.truncated_normal([4,3],stddev=0.1,seed=1))#相当于正态分布产生4*3矩阵
b1=tf.Variable(tf.random.truncated_normal([3],stddev=0.1,seed=1))#相当于正态分布产生3*1矩阵
2.嵌套循环迭代,with更新参数,显示当前loss.
for epoch in range(epoc):#循环500次
for step,(x_train,y_train) in enumerate(train_db):#枚举每批训练集数据,step为当前批次,将同一批的数据进行相同操作
with tf.GradientTape() as tape:#tf.GradientTape用来计算梯度
y=tf.matmul(tf.cast(x_train,dtype=tf.float32), w1)+b1#tf.matmul将x_train和w1相乘,计算出y,将数据类型转换成和w1一致,防止数据类型不一致无法计算
y=tf.nn.softmax(y)#将y归一化,符合概率分布,使得特征更加明显
y_=tf.one_hot(y_train,depth=3)#独热码,生成长度为depth位的向量
loss=tf.reduce_mean(tf.square(y_-y))#redunce_mean计算平均值,square计算平方,计算出损失函数
loss_all+=loss.numpy()#将tensor变量转换为非tensor变量,累加每批损失值
grads=tape.gradient(loss,[w1,b1])#计算梯度值
w1.assign_sub(lr*grads[0])#参数更新为lr*grads[0]
b1.assign_sub(lr*grads[1])#参数更新为lr*grads[1]
print("epoch loss")
print(epoch," ",loss_all/4)#输出平均损失值
3.计算当前函数前向传播后的准确率,显示当前acc。
for x_test,y_test in test_db:#枚举每批测试集数据
y=tf.matmul(tf.cast(x_test,dtype=tf.float32),w1)+b1#用之前更新后的w1和b1计算出预测结果
y=tf.nn.softmax(y)
pred=tf.argmax(y,axis=1)#axis=1,记录每一行最大值。axis=0,记录每一列最大值。
pred=tf.cast(pred,dtype=y_test.dtype)#将pred转换成测试集数据类型
correct=tf.cast(tf.equal(pred,y_test),dtype=tf.int32)#tf.equal比较预测结果和测试集,将返回值转换成int32类型
correct=tf.reduce_sum(correct)#统计每批正确个数
total_correct+=int(correct)#累加正确个数
total_number+=x_test.shape[0]#累加测试数据个数
acc=total_correct/total_number#正确率
test_acc.append(acc)#将正确率追加到正确率列表末尾
4.acc/loss可视化
plt.title("标题")#设置标题
plt.xlabel("epoch")#x轴标签
plt.ylabel("loss")#y轴标签
plt.plot(train_loss_result, label="$loss$")
plt.legend()#设置图例
plt.show()#显示图
3.模型评估(可视化):