tensorflow2.0——鸢尾花分类实操(神经网络伪代码)
一、实操
下面进行的模型训练为伪代码,一般用tensorflow不会用到这种方式来训练模型,这个只是用来作为对上一篇常用函数的使用,方便熟悉代码以及训练时梯度是如何计算的。
import tensorflow as tf from sklearn.datasets import load_iris # 读取鸢尾花数据 iris_data = load_iris() x = tf.constant(iris_data.data) y = tf.constant(iris_data.target) x=tf.cast(x,tf.float32) y=tf.cast(y,y.dtype) y = tf.one_hot(y, 3) # 对y进行独热编码 # 构建数据集,分为3批次,每个批次大小为50 dataset = tf.data.Dataset.from_tensor_slices((x, y)).shuffle(30).batch(50) # 构建神经网络的全连接层4*3的结构,详情如下:输入为x的4个特征值,无激活函数;输出层为3,softmax激活函数 # 输入层权重、偏倚 w = tf.Variable(tf.ones([4, 3])) b = tf.Variable(tf.ones([1,3])) # 训练设定迭代5代,每代3个批次,学习率为0.1 epoch = 5 learn_rate = 0.1 for epoch_i in range(epoch): for step, (x_batch, y_batch) in enumerate(dataset): with tf.GradientTape(persistent=True) as tape: a = tf.matmul(x_batch,w) + b # 激活前的值 y_pre = tf.nn.softmax(a) # softmax激活函数后的输出 loss = tf.reduce_mean(tf.square(y_pre - y_batch)) # 均方误差 grads = tape.gradient(loss, [w, b]) # 计算梯度 w.assign_sub(learn_rate * grads[0]) # 更新权重 b.assign_sub(learn_rate * grads[1]) # 更新权重 print('第%d代,第%d批次,loss=%.5f'%(epoch_i+1,step+1,loss))
输出结果:
第1代,第1批次,loss=0.22222 第1代,第2批次,loss=0.24286 第1代,第3批次,loss=0.27031 第2代,第1批次,loss=0.26356 第2代,第2批次,loss=0.20968 第2代,第3批次,loss=0.27439 第3代,第1批次,loss=0.25802 第3代,第2批次,loss=0.23685 第3代,第3批次,loss=0.20936 第4代,第1批次,loss=0.27304 第4代,第2批次,loss=0.21698 第4代,第3批次,loss=0.19768 第5代,第1批次,loss=0.25066 第5代,第2批次,loss=0.22764 第5代,第3批次,loss=0.19781