本blog为观看MOOC视频与网易云课堂所做的笔记
课堂链接:
人工智能实践:TensorFlow笔记
吴恩达机器学习

疑问与思考

为什么按照batch喂入数据

之前看的视频里面处理数据都是一次性将所有数据喂入,现在看的这个视频对数据进行了分组投入。这是为何?
参考链接:

深度学习中的batch理解(batch size一次喂给神经网络的数据大小量)
用CNN做图像分类的时候,为什么要一批一批地输入数据?

对样本数据的处理方法:
传统的梯度下降法:用全部样本计算迭代时的梯度
随机梯度下降法(在线梯度下降法):一次只喂一个样本
batch梯度下降法:每次喂一部分样本让其完成本轮迭代
区别举例:一次性喂500个样本并迭代一次,跟一次喂1个样本迭代500次相比
第一种是将参数一次性更新500个样本的量,第二种是迭代的更新500次参数。
1、在同等的计算量之下(一定的时间内),使用整个样本集的收敛速度要远慢于使用少量样本的情况。换句话说,要想收敛到同一个最优点,使用整个样本集时,虽然迭代次数少,但是每次迭代的时间长,耗费的总时间是大于使用少量样本多次迭代的情况的。
2、样本量少的时候会带来很大的方差,会导致在下降到很差的局部最小值、鞍点震荡出收敛处,有利于向全局最小值迈进。
当样本量很多时,方差很小,对梯度的估计要准确和稳定的多,可能导致深陷局部最小值、鞍点,导致训练效果不如意
3、与GPU性能有关,GPU性能越好,同时训练的数据就越多,batch就可以越大。

代码以及展示

把打乱后的数据集中前120个数据取出来作为训练集,后30个为测试集
输入特征是4个,所以输入节点是4。只用一层网络,输出节点是分类数:3
第一层for循环针对数据集,第二层for循环针对batch。
训练集120个数据,batch是32个,,每个step只能喂入32组数据,需要batch级别循环4次。
所以除以4,得到每个循环得到的平均loss。
代码:

# 利用鸢尾花数据集,实现前向传播、反向传播,可视化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)# 将打乱后的数据集分割为训练集和测试集,训练集为前120行,测试集为后30行
x_train = x_data[:-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)
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)
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  # 学习率为0.1
train_loss_results = []  # 将每轮的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循环一个batchwith tf.GradientTape() as tape:  # with结构记录梯度信息y = tf.matmul(x_train, w1) + b1  # 神经网络乘加运算y = tf.nn.softmax(y)  # 使输出y符合概率分布(此操作后与独热码同量级,可相减求loss)y_ = tf.one_hot(y_train, depth=3)  # 将标签值转换为独热码格式,方便计算loss和accuracyloss = tf.reduce_mean(tf.square(y_ - y))  # 采用均方误差损失函数mse = mean(sum(y-out)^2)loss_all += loss.numpy()  # 将每个step计算出的loss累加,为后续求loss平均值提供数据,这样计算的loss更准确# 计算loss对各个参数的梯度grads = tape.gradient(loss, [w1, b1])# 实现梯度更新 w1 = w1 - lr * w1_grad    b = b - lr * b_gradw1.assign_sub(lr * grads[0])  # 参数w1自更新b1.assign_sub(lr * grads[1])  # 参数b自更新# 每个epoch,打印loss信息print("Epoch {}, loss: {}".format(epoch, loss_all/4))train_loss_results.append(loss_all / 4)  # 将4个step的loss求平均记录在此变量中loss_all = 0  # loss_all归零,为记录下一个epoch的loss做准备# 测试部分# total_correct为预测对的样本个数, total_number为测试的总样本数,将这两个变量都初始化为0total_correct, total_number = 0, 0for x_test, y_test in test_db:# 使用更新后的参数进行预测y = tf.matmul(x_test, w1) + b1y = 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)# 将每个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]# 总的准确率等于total_correct/total_numberacc = total_correct / total_numbertest_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$")  # 逐点画出trian_loss_results值并连线,连线图标是Loss
plt.legend()  # 画出曲线图标
plt.show()  # 画出图像# 绘制 Accuracy 曲线
plt.title('Acc Curve')  # 图片标题
plt.xlabel('Epoch')  # x轴变量名称
plt.ylabel('Acc')  # y轴变量名称
plt.plot(test_acc, label="$Accuracy$")  # 逐点画出test_acc值并连线,连线图标是Accuracy
plt.legend()
plt.show()

【神经网络计算】——神经网络实现鸢尾花分类相关推荐

  1. HBU-NNDL 实验五 前馈神经网络(3)鸢尾花分类

    目录 深入研究鸢尾花数据集 4.5 实践:基于前馈神经网络完成鸢尾花分类 4.5.1 小批量梯度下降法 4.5.1.1 数据分组 4.5.2 数据处理 4.5.2.2 用DataLoader进行封装 ...

  2. 神经网络与深度学习(五)前馈神经网络(3)鸢尾花分类

    目录 4.5实践:基于前馈神经网络完成鸢尾花分类 深入研究鸢尾花数据集 4.5.1 小批量梯度下降法 4.5.1.1 数据分组 4.5.2 数据处理 4.5.2.2 用DataLoader进行封装 4 ...

  3. 【BP神经网络】西瓜分类和鸢尾花分类

    文章目录 一.数据集和资料 二.鸢尾花分类 三.西瓜分类 四.一些笔记 Sklearn部分资料 pandas部分函数 一.数据集和资料 数据集,提取码:zmlc 大佬笔记,提取码:ytfa 二.鸢尾花 ...

  4. [python] 深度学习基础------人工神经网络实现鸢尾花分类(一)

    ​​​​​​​人工神经网络实现鸢尾花分类(一) 人工神经网络实现鸢尾花分类(二) 人工神经网络实现鸢尾花分类(三) 人工神经网络实现鸢尾花分类(四) 人工神经网络实现鸢尾花分类(五) 目录 人工智能主 ...

  5. 【神经网络学习】鸢尾花分类的实现

    目录 1.问题 2.问题解决思路 3.神经网络理论准备 4.Tensor Flow编程基础 5. 鸢尾花分类神经网络实现 1.问题 鸢尾花分为:狗尾草鸢尾.杂色鸢尾.弗吉尼亚鸢尾: 通过测量:花萼长. ...

  6. 神经网络实现鸢尾花分类(Tensorflow2.0)

    1鸢尾花数据 回顾鸢尾花数据集,其提供了150组鸢尾花数据,每组包括鸢尾花的花萼长.花萼宽.花瓣长.花瓣宽 4个输入特征,同时还给出了这一组特征对应的鸢尾花类别.类别包括狗尾鸢尾.杂色鸢尾.弗吉尼亚鸢 ...

  7. Tensorflow2.x框架-神经网络实现鸢尾花分类

    神经网络实现鸢尾花分类 一.数据准备     1.数据集读入 2.数据集乱序 3.生成训练集和测试集(即 x_train / y_train,x_test / y_test) 4.配成(输入特征,标签 ...

  8. 最简单的单层神经网络实现鸢尾花分类

    一,知识背景 鸢尾花的分类由四个数据定义,分别是花萼长.花萼宽.花瓣长.花瓣宽.我们把这样的一组数据称为是一组特征,根据特征可以分为三类鸢尾花. 二,神经元模型 神经元采用最简单的简化MP(麦卡洛克- ...

  9. bp神经网络 鸢尾花matlab,神经网络(BP网)—鸢尾花分类问题.pdf

    神经网络(BP网)-鸢尾花分类问题 华南师范大学计算机学院 – 神经网络 鸢尾花分类BP网实现 作者:杨劲松 2013-4-24 BP BP BBPP 鸢尾花分类 网实现 � 问题描述 � 感知器网络 ...

  10. 神经网络实现鸢尾花分类

    神经网络实现鸢尾花分类 一.数据集介绍 共有数据150组,每组包括花萼长.花萼宽.花瓣长.花瓣宽4个输入特征. 同时给出了,这一组特征对应的鸢尾花类别.类别包括Setosa Iris(狗尾草 鸢尾), ...

最新文章

  1. Git基本命令和GitFlow工作流
  2. java+卡有型号吗,第一次写java代码,就卡主了,真是惨,有木有大腿来帮忙调试一下...
  3. 520 钻石争霸赛 7-5 大勾股定理 (数学)
  4. selenium打开Firefox、IE、Chrome浏览器【python】
  5. 在LINUX中如何把2个文件中的内容合到另一个文件中
  6. (转)android连网详解
  7. 安装HDFS过程中Browse Directory报错
  8. 算法 判断多个点是否在同一圆周线上_广州灵活计费自动出盘机技术方案大盘点...
  9. 缓冲流与打印流(字节与字符)
  10. siege linux 压力测试工具
  11. html替换图片上的文字,如何在图片上改字|超简单的修改图片里文字方法
  12. 豆豆趣事[2016年02月]
  13. android电话通讯录导入iphone6,怎么把小米手机通讯录导入iphone6?
  14. WARNING: too many parse errors
  15. EMC | 静电防护方法
  16. 加密授权验证学习之五——RSA非对称加密算法将机器码加密为注册码
  17. 人民币对美元汇率中间价报6.7615元 下调73个基点
  18. PCB四层板常规层压结构及设计阻焊-深亚电子
  19. 最适合入门的100个深度学习实战项目
  20. 【JavaScript编程】window.location.search 返回值为空

热门文章

  1. google earth pro 64位_七彩虹秀精准刀工!iGame RTX 3060 Ti Advanced OC评测:烤机3小时64度...
  2. android中可以有两个焦点吗,android – 如何通过焦点在屏幕上调整两个片段的大小?...
  3. 解决vue项目在ie浏览器中不显示的问题
  4. SSH登录太慢(等很久才提示输入密码)的问题
  5. JavaScript——根据数组中的某个值进行排序
  6. sol - 0x60,61,62
  7. MySQL(介绍,安装,密码操作,权限表)
  8. vue.js--基础事件定义,获取数据,执行方法传值
  9. Java并发编程笔记之ConcurrentLinkedQueue源码探究
  10. python ATM购物程序