深度学习记录

1.背景

鸢尾花的测量数据可以确定鸢尾花的种类,这些花之前已经被植物学专家鉴定为属于 setosa、versicolor 或 virginica 三个品种之一。对于这些测量数据,她可以确定每朵鸢尾花所属的品种。我们假设这位植物学爱好者在野外只会遇到这三种鸢尾花。我们的目标是构建一个机器学习模型,可以从这些已知品种的鸢尾花测量数据中进行学习,从而能够预测新鸢尾花的品种。

 

2.简单神经网络(鸢尾花分类)搭建:

1.数据处理

1.数据集读入

from sklearn import datasets#机器学习常用包,这里提供数据集

x_data=datasets.load_iris().data#从load_iris数据集中导入输入特征 y_data=datasets.load_iris().target#从load_iris数据集中导入标签

2.数据集乱序

np.random.seed(116)#随机数种子
np.random.shuffle(x_data)#打乱数据集输入特征
np.random.seed(116)#随机数种子
np.random.shuffle(y_data)#打乱数据集标签
tf.random.set_seed(116)

3.数据集中分出训练集与测试集

x_train=x_data[:-30]#截取数据集输入特征倒数30行之前作为训练集
y_train=y_data[:-30]#截取数据集标签倒数30行之前作为训练集
x_test=x_data[-30:]#截取数据集标签末尾30行作为训练集
y_test=y_data[-30:]#截取数据集标签末尾30行作为训练集

4.配成[输入特征,标签]对,每次喂入一个batch

train_db=tf.data.Dataset.from_tensor_slices((x_train, y_train)).batch(30)#将训练集输入特征和标签组合成元组,并以30组为一批
test_db=tf.data.Dataset.from_tensor_slices((x_test,y_test)).batch(30)#将测试集输入特征和标签组合成元组,并以30组为一批

2.构建模型:

scikit-learn 中有许多可用的分类算法。这里用的是 k 近邻分类器,这是一个很容易理解的算法。构建此模型只需要保存训练 集即可。要对一个新的数据点做出预测,算法会在训练集中寻找与这个新数据点距离最近 的数据点,然后将找到的数据点的标签赋值给这个新数据点。 k 近邻算法中 k 的含义是,我们可以考虑训练集中与新数据点最近的任意 k 个邻居(比如 说,距离最近的 3 个或 5 个邻居),而不是只考虑最近的那一个。

1.定义神经网络中所有训练的参数

w1=tf.Variable(tf.random.truncated_normal([4,3],stddev=0.1,seed=1))#相当于正态分布产生4*3矩阵
b1=tf.Variable(tf.random.truncated_normal([3],stddev=0.1,seed=1))#相当于正态分布产生3*1矩阵

2.嵌套循环迭代,with更新参数,显示当前loss.

for epoch in range(epoc):#循环500次
    for step,(x_train,y_train) in enumerate(train_db):#枚举每批训练集数据,step为当前批次,将同一批的数据进行相同操作
        with tf.GradientTape() as tape:#tf.GradientTape用来计算梯度
          y=tf.matmul(tf.cast(x_train,dtype=tf.float32), w1)+b1#tf.matmul将x_train和w1相乘,计算出y,将数据类型转换成和w1一致,防止数据类型不一致无法计算
          y=tf.nn.softmax(y)#将y归一化,符合概率分布,使得特征更加明显
          y_=tf.one_hot(y_train,depth=3)#独热码,生成长度为depth位的向量
          loss=tf.reduce_mean(tf.square(y_-y))#redunce_mean计算平均值,square计算平方,计算出损失函数
          loss_all+=loss.numpy()#将tensor变量转换为非tensor变量,累加每批损失值
          grads=tape.gradient(loss,[w1,b1])#计算梯度值
          w1.assign_sub(lr*grads[0])#参数更新为lr*grads[0]
          b1.assign_sub(lr*grads[1])#参数更新为lr*grads[1]
    print("epoch loss")
    print(epoch," ",loss_all/4)#输出平均损失值

3.计算当前函数前向传播后的准确率,显示当前acc。

   for x_test,y_test in test_db:#枚举每批测试集数据
        y=tf.matmul(tf.cast(x_test,dtype=tf.float32),w1)+b1#用之前更新后的w1和b1计算出预测结果
        y=tf.nn.softmax(y)
        pred=tf.argmax(y,axis=1)#axis=1,记录每一行最大值。axis=0,记录每一列最大值。
        pred=tf.cast(pred,dtype=y_test.dtype)#将pred转换成测试集数据类型
        correct=tf.cast(tf.equal(pred,y_test),dtype=tf.int32)#tf.equal比较预测结果和测试集,将返回值转换成int32类型
        correct=tf.reduce_sum(correct)#统计每批正确个数
        total_correct+=int(correct)#累加正确个数
        total_number+=x_test.shape[0]#累加测试数据个数
        acc=total_correct/total_number#正确率
        test_acc.append(acc)#将正确率追加到正确率列表末尾

4.acc/loss可视化

plt.title("标题")#设置标题
plt.xlabel("epoch")#x轴标签
plt.ylabel("loss")#y轴标签
plt.plot(train_loss_result, label="$loss$")
plt.legend()#设置图例
plt.show()#显示图

3.模型评估(可视化):

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值