tensorflow2.0: 鸢尾花分类

这一系列的文章是【北京大学】Tensorflow2.0_哔哩哔哩_bilibili的笔记,这个课程讲得很好,推荐观看。话不多说直接放代码:

# 第一步:加载所需的库:
import tensorflow as tf
import numpy as np
from sklearn.datasets import load_iris
import matplotlib.pyplot as plt

# 第二步:读取数据:
X= load_iris().data #特征
y= load_iris().target #标签

type(X), type(y) #读取的数据是numpy数组

np.random.seed(116) #设定随机种子
np.random.shuffle(X) #打乱X的顺序
np.random.seed(116) #再次设定随机种子,一定要和上面的一样,否则y的顺序会和X不匹配
np.random.shuffle(y) #打乱y的顺序
tf.random.set_seed(116) #这个种子是为了神经网络的运行结果可复现

#分割训练集和测试集
X_train= X[:-30] 
X_test= X[-30:] #最后30个数据作为测试集,下同
y_train= y[:-30]
y_test= y[-30:]

#下面这个是将数据分批输入神经网络,每批为32个数据
train_db= tf.data.Dataset.from_tensor_slices((X_train, y_train)).batch(32)
test_db= tf.data.Dataset.from_tensor_slices((X_test, y_test)).batch(32)

#第三步:建模
lr= 0.1 #学习率
train_loss_results= [] #记录训练损失
loss_all= 0 #在每个epoch中记录总损失
test_acc= [] #记录测试准确率
epoch= 500 #每条数据将会放入网络中500次,即迭代次数为500
#初始化权重:
w1= tf.Variable(tf.random.truncated_normal([4, 3], stddev= 0.1, seed= 1, dtype= tf.float64))
b1= tf.Variable(tf.random.truncated_normal([3], stddev= 0.1, seed= 1, dtype= tf.float64))
for epoch in range(epoch):
    for step, (X_train, y_train) in enumerate(train_db): #因为有120条训练集数据,而batch=32,因此每次迭代会分为4个step
        with tf.GradientTape() as tape: #梯度下降
            y= tf.matmul(X_train, w1)+ b1
            y= tf.nn.softmax(y) #将输出放进softmax激活函数中
            y_= tf.one_hot(y_train, depth= 3, dtype= tf.float64) #将真实标签进行独热编码
            loss= tf.reduce_mean(tf.square(y_-y)) #使用均方误差损失
            loss_all+= loss.numpy() #将每个step产生的损失加到loss_all中作为这一个epoch的总损失
        grads= tape.gradient(loss, [w1, b1]) #参数更新
        w1.assign_sub(lr*grads[0])
        b1.assign_sub(lr*grads[1])
    print(f'epoch: {epoch}, loss: {loss_all/4}') #因为我们需要的是平均损失,因此要除以step数
    train_loss_results.append(loss_all/4) #记录下这一个epoch的损失以备画图
    loss_all= 0 #将此次epoch的损失重置为0以便记录下一个epoch的损失
    
    
#测试:
    total_correct, total_number= 0, 0 #记录正确预测数与测试集大小
    for X_test, y_test in test_db:
        y= tf.matmul(X_test, w1)+ b1
        y= tf.nn.softmax(y)
        pred= tf.argmax(y, axis= 1)
        pred= tf.cast(pred, dtype= y_test.dtype)
        correct= tf.cast(tf.equal(pred, y_test), dtype= tf.int32) #将布尔型张量转化为整形张量
        correct= tf.reduce_sum(correct) #将correct的各个分量加总得到这一个step中正确预测的数目
        total_correct+= int(correct) #得到所有step预测正确的总数
        total_number+= X_test.shape[0] #因此此时的X_test已不再是整个测试集,而只是测试集的一个step,因此要将各个step的X_test
        #的大小加起来才得到整个测试集的大小
    acc= total_correct/total_number #正确预测的条数除以测试集大小得到准确率
    test_acc.append(acc) #记录准确率

#第四步:画图
#画损失曲线:
plt.title('loss function curve') #图表标题
plt.xlabel('Epoch') #X轴标签
plt.ylabel('Loss') #y轴标签
plt.plot(train_loss_results, label= 'Loss') #将每个epoch的损失连起来
plt.legend() #标注出图例
plt.show() #展示出来

#画准确率曲线:
plt.title('accuracy curve')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.plot(test_acc, label= 'Accuracy')
plt.legend() 
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值