ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

TensorFlow神经网络实现鸢尾花的分类(初学者)

2022-01-31 12:00:37  阅读:205  来源: 互联网

标签:loss plt test train 初学者 tf TensorFlow 鸢尾花 data


本文是为了初步接触神经网络结构的代码及解释,利用tensorflow实现

整体架构:

1、先准备数据集,并拆分数据集,模拟人类认识过程,将数据集做乱序处理

2、准备网络参数,并建立网络结构

3、开始训练过程,

4、开始验证过程

5、实现准确率acc和损失loss的可视化

一、数据集的处理及了解数据集

代码如下:

#导入所需模块
from  sklearn  import datasets
from pandas import DataFrame
import pandas as pd

#数据集是从sklearn的datasets下载的
x_data =datasets.load_iris().data
y_data =datasets.load_iris().target
print("x_data from datasets:\n",x_data)
print("y_data from datasets:\n",y_data)

#为了增加数据可读性,将刚才的数据整理成表格
x_data = DataFrame(x_data,columns=['花萼长度','花萼宽度','花瓣长度','花瓣宽度'])
pd.set_option('display.unicode.east_asian_width',True) #设置列对齐
print("x-data add index:\n",x_data)

#在x列表中加入新的类别y
x_data['类别'] = y_data
print("x_data add a column:\n",x_data)

这段代码会让我们初步了解到我们下载的数据集的结构和类型

二、进入主题,如何实现分类问题

因为我们所下载的数据中输入有4个特征,分别是花萼长、花萼宽、花瓣长、花瓣宽,输出是3个鸢尾花种类,分别是狗尾草、杂色、佛吉尼亚鸢尾花。那我们简单的建立一个4输入3输出不包含隐藏层的传统神经网络。为了初学者了解函数,每一行代码都会加上注释,代码函数是别人已经定义好的,我们要做的是如何学会并使用。代码如下:

#导入所需模块
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)

#将打乱后的数据集分割为训练集和测试集,训练集为前120行,测试集为后30行
x_train = x_data[:-30] #表示0至去掉后面30个
y_train = y_data[:-30]
x_test = x_data[-30:]
y_test = y_data[-30:]

#转换x的数据类型,否则后面矩形相乘时会因数据类型不一致报错
x_train = tf.cast(x_train,tf.float32)   #tf.cast强转换类型
x_test = tf.cast(x_test,tf.float32)

#from_tensor_slices函数使输出特征和标签值一一对应,并分batch批次进入网络
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)

#生成神经网络的参数,4个输入特征,所以输入层有4个输入节点,3分类问题,输出为3个神经元
#要用tf.Variable()标记参数可训练
#使用seed使每次生成的随机数相同(实际上不用强调seed),保证xy一致即可
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))

ir = 0.1 #学习率为0.1
train_loss_result = []  #将每轮的loss记录在此列表中,为后续画loss曲线提供数据
test_acc=[]  #将每轮的acc记录在此列表中,为后续画acc曲线提供数据
epoch = 500 #循环500轮
loss_all = 0  #每轮分为4个step,loss_all记录四个step生成4个loss的和,现在
              #只是先定义这个量

#开始训练部分
for epoch in range(epoch):   #数据集级别的循环,每个epoch循环一次数据集
    for step,(x_train,y_train) in enumerate(train_db):  #batch级别的循环,
                                                        # 每个step循环一次
        with  tf.GradientTape() as  tape:    #with 结构记录梯度信息
            y = tf.matmul(x_train,w1) + b1   #神经网络的算法 y=w*x+b
            y = tf.nn.softmax(y)    #因为上一条结果是数,要转换成概率的形式
            y_ = tf.one_hot(y_train ,depth=3)  #将标签值转换为独热码格式,
                                               #方便计算loss
            loss = tf.reduce_mean(tf.square(y_- y))  #y是预测值,y_是实际标签
                                                     #这样y_-y的平方就是loss函数
            loss_all += loss.numpy()  #将所有loss加起来,等一会求平均
        grads = tape.gradient(loss,[w1,b1]) #计算loss对每个参数的梯度
        #实现梯度更新w1 = w1-ir*w1_grad b=b1-ir*b1_grad
        w1.assign_sub(ir*grads[0])   #w1自更新
        b1.assign_sub(ir*grads[1])   #b1 自更新

    #每个epoch,打印一次loss信息
    print("Epoch{},loss:{}".format(epoch,loss_all/4))
    train_loss_result.append(loss_all/4)    #将4个step的loss求平均记录到这里
    loss_all = 0  #loss_all归零 ,记录下一个epoch的loss做准备

    #开始测试部分
    #total_correct为预测对的样本个数,total_number为测试的总样本数,将两个变量初始值设为0
    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) #找到y概率最高的索引
        #将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) #equal判断是否相等
        #将每个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_result,label="$loss$")
plt.legend()   #画出曲线图标
plt.show()     #画出图像

#绘制Accuracy曲线
plt.title("Acc Curacv")  #图片的标题
plt.xlabel("Epoch")  #x轴的名称
plt.ylabel("ACC")  #y轴的名称
plt.plot(test_acc,label="$Accuracy$")   #画出acc
plt.legend()  #画出曲线图标
plt.show()    #画出图像

标签:loss,plt,test,train,初学者,tf,TensorFlow,鸢尾花,data
来源: https://blog.csdn.net/m0_63647082/article/details/122758850

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有