神经网络搭建——Tensorflow

步骤:

一.准备数据

        1.数据集读入

        2.数据集乱序

        3.生成训练集和数据集

        4.配成对,每次读入一小撮(batch)

二.搭建神经网络:定义神经网络所以可训练参数

三.参数优化:嵌套迭代循环,with结果更新参数,显示当前loss

四.测试效果:计算当前参数前向传播后的准确率,显示当前acc

五.acc/loss可视化

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)

#数据集分出训练集和测试集
x_train = x_data[:-30]       #前120个数据
y_train = y_data[:-30]
x_test = x_data[-30:]      #后30
y_test = y_data[-30:]
#转换x的数据类型,否则后面矩阵相乘时会因数据类型不一样而报错
x_train=tf.cast(x_train,tf.float32)
x_test=tf.cast(x_test,tf.float32)

#配对
train_db = tf.data.Dataset.from_tensor_slices((x_train,y_train)).batch(32) #每32对 打包为一个batch
test_db = tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(32)

#生成神经网络参数,4个输入特征,故输入层为4个输入节点;因为分三类,所以输出3个神经元
#定义神经网络所有可训练参数
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))

lr = 0.1
train_loss_results = []     #记录每轮的loss
test_acc = []        #记录每轮的acc记录
epoch = 500         #循环500轮
loss_all = 0

#训练部分
#嵌套循环迭代,with结果更新参数,显示当前loss
for epoch in range (epoch):     #数据集级别迭代
     for step,(x_train,y_train) in enumerate(train_db):     #batch级别迭代
        with tf.GradientTape() as tape:   #记录梯度信息
            y=tf.matmul(x_train,w1)+b1        #神经网络乘加运算
            y=tf.nn.softmax(y)              #使y符合概率分布
            y_=tf.one_hot(y_train,depth=3)   #将标签值换为独热玛,方便计算loss和acc
            loss=tf.reduce_mean(tf.square(y_ -y))  #均方误差损失函数
            loss_all+=loss.numpy()
        grads = tape.gradient(loss,[w1,b1])
        w1.assign_sub(lr*grads[0])           #参数自更新
        b1.assign_sub(lr*grads[1])
     print("Epoch{},loss:{}".format(epoch,loss_all/4))         #4轮
     train_loss_results.append(loss_all/4)#将loss_all/4的结果添加到train_loss_results
     loss_all = 0

#测试部分
#total_correct为预测的样本个数,total_number测试样本总数
     total_correct,total_number=0,0
     for x_test,y_test in test_db:
        y=tf.matmul(x_test,w1) + b1         #y为预测结果,matmul矩阵乘
        y=tf.nn.softmax(y)         #y符合概率分布
        #返回y中最大值索引,即预测分类
        pred=tf.argmax(y,axis=1)
        #将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)  #数据类型转换
        # #将每个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_results,label="$Loss$")
plt.legend()
plt.show()
#绘制Acc曲线
plt.title('Acc Curve')     #图片标题
plt.xlabel('Epoch')        #x轴名称
plt.ylabel('Acc')          #y轴名称
plt.plot(test_acc,label="$Accuracy$")
plt.legend()
plt.show()

结果:

最开始

当epoch达到50

当epoch达到100

当epoch达到180

epoch达到185

499

图像表达:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值