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

 

posted @ 2020-11-17 20:13  我不是高斯分布  阅读(919)  评论(0编辑  收藏  举报