tensorflow loss到多少_tensorflow学习笔记day4
今天学习的是如何搭建一个完整的神经网络结构,这几天都在研究整篇代码的含义,网上的教程都是各有缺失,综合了多个版本才完全搞清楚。我会把每个函数的API都详细的讲,也懒得拆成上下两篇,就弄一篇所以这篇文章会格外的长,希望大家能有耐心看下去。再说一下我是学的1.0版本的tensorflow编程,我电脑装的是2.0版本,不想换了,所以代码用到的是兼容代码。
人工神经网络主要架构是由神经元、层和网络三个部分组成。整个人工神经网络包含一系列基本的神经元、通过权重相互连接。神经元是人工神经网络最基本的单元。单元以层的方式组,每一层的每个神经元和前一层、后一层的神经元连接,共分为输入层、输出层和隐藏层,三层连接形成一个神经网络。输入层只从外部环境接收信息,是由输入单元组成,而这些输入单元可接收样本中各种不同的特征信息。该层的每个神经元相当于自变量,不完成任何计算,只为下一层传递信息;隐藏层介于输入层和输出层之间,这些层完全用于分析,其函数联系输入层变量和输出层变量,使其更配适数据。而最后,输出层生成最终结果,每个输出单元会对应到某一种特定的分类,为网络送给外部系统的结果值,整个网络由调整链接强度的程序来达成学习的目的。
就用一个例子来详细讲解,本次代码加入结果可视化,就不在单独写一篇了
首先调用函数和启用动态图机制,这次我们需要用到绘图工具所以别忘了调用
import tensorflow.compat.v1 as tf #1.0版本的可以把 .compat.v1 删去
import numpy as np
import matplotlib.pyplot as plt #调用绘图函数tf.disable_eager_execution() #启用动态图机制'1.0版本可不用'
接下来是构建随机数据
这里用到了numpy的一个生成等差数列的API:
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
这个函数会返回一个范围在start~stop之间的数量为num的等差数列,数量未规定默认为50,后面一般保持默认就好。
还用到了numpy的一个从正态分布中随机抽取样本的API:
np.random.normal(loc=0.0, scale=1.0, size=None)
loc是此概率分布的均值(对应着整个分布的中心centre),一般都是为0,scale是此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高),size:输出的shape,默认为None,这里我们定义为和x_data的形状相同(形状指矩阵的行列)
因为现实数据的分布不会完全尊崇某个函数变化,所以加入一个随机噪声noise来表示偏差。
x_data = np.linspace(-1,1,300)[:,np.newaxis] #生成一个-1~1数量为300的等差数列,并提升一个维度
noise = np.random.normal(0,0.05,x_data.shape) #生成一个正太分布的噪声
y_data = np.square(x_data) + noise #生成一堆点
因为后面我们用到的数据是2维数组的而np.linspace生成的是1维数组,所以需要使用[:,np.newaxis]来提升一个维度。得到的散点图大概如下图所示,因为噪声的随机性所以每次运行的图均不相同。这样我们就“造”好了给机器学习的数据
接下来就是构建输入层,这里我们定义两个传入常量placeholder
xs = tf.placeholder(tf.float32,[None,1])
ys = tf.placeholder(tf.float32,[None,1])
这里定义数据类型为float32,[None,1]是指我不规定传入的数据行有多少,但是只能有1列。
然后我们构建中间层
这里我们用到了tensorflow中的随机抽取正态分布序列值得API:
tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
shape: 输出张量的形状,必选;mean: 正态分布的均值,默认为0stddev: 正态分布的标准差,默认为1.0;dtype: 输出的类型,默认为tf.float32;seed: 随机数种子,是一个整数,当设置之后,每次生成的随机数都一样;name: 操作的名称。这里我们只考虑输出张量的形状,其他的均为默认
因为输入1个数据,中间层有10个神经元所以输出为10,故Weights_l1形状为[1,10],而biases_l1主要取决于输出,即为[1,output],这里是[1,10]
Weights_l1 = tf.Variable(tf.random_normal([1,10]))
biases_l1 = tf.Variable(tf.zeros([1,10])+0.1)
Wx_plus_b_l1 = tf.matmul(xs,Weights_l1) + biases_l1
l1 = tf.nn.relu(Wx_plus_b_l1)
接下来是输出层,和中间层的结构类似,只是数据结构需要更改一下,同时输出层是否使用激活函数看你选取的是哪个激活函数,如果是tf.nn.tanh则输出也需要激活函数tf.nn.tanh
Weights_l2 = tf.Variable(tf.random_normal([10,1]))
biases_l2 = tf.Variable(tf.zeros([1,1])+0.1)
Wx_plus_b_l2 = tf.matmul(l1,Weights_l2) + biases_l2
prediction = Wx_plus_b_l2
接下来是计算二次代价函数和梯度下降法训练,这里我们选择最常用的优化器
loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),reduction_indices=[1]))
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(loss)
这个在之前的文章中都有提到,因为现在的数据是2维数据所以我们需要计算一个张量的各个维度的元素之和的平均值。学习效率的取值主要看你需要的精确度,数值越低精度越高,但是训练的次数也需要更多,这里推荐2000次训练一般选在0.1~0.3左右。
接下来就是绘图了
fig = plt.figure() #画一个框
ax = fig.add_subplot(1,1,1) #有绘制多个图会用到,只生成一个图可以不写
ax.scatter(x_data,y_data) #绘制数据散点图
plt.ion() #这个语句是为了能够连续的显示输出数据的变化
plt.show() #显示图
这些语句执行完就能看到前文所展示的图了
接下来就是创建会话和激活函数了
with tf.Session() as sess: #创建会话sess.run(init)for i in range(2000):sess.run(train_step,feed_dict={xs:x_data,ys:y_data}) #激活优化,传入参数if i % 50 == 0:try: #抛出报错,即一旦出现exception类报错即执行except下的语句#删除上一条线,因为最开始没有线所以会报错,采用try跳过错误ax.lines.remove(lines[0])except Exception: passprediction_value = sess.run(prediction,feed_dict={xs:x_data}) #获取输出值#以x_data为x轴坐标,prediction_value为y轴坐标,画一条线宽为5,红色的实线lines = ax.plot(x_data,prediction_value,'r-',lw=5)plt.pause(0.5) #画完暂停0.1秒
plt.pause(0) #全部画完暂停,若没有这个语句显示完变化之后会直接关闭图框
最后结果:
当然不是每个人最后的结果都设这样的,因为随机数的关系,每次运行的结果都不相同,这是我从几次运行结果里挑的比较好看的一张图。
其实我们可以将中间层和输出层合并为一个子函数,这样我们只需要调用即可,就不用大量的命名。
这就是python常用的建立子函数
def add_layer(inputs,in_size,out_size,activation_function=None): #建立层(输入数据,输入数据的列数,输出数据的列数,激活函数)Weights = tf.Variable(tf.random_normal([in_size,out_size])) #生成一个in_size行,out_size列的随机变量矩阵#这个操作返回一个具有shape形状的dtype类型的张量,所有元素都设置为零。但是全返回0可能会报错故加上0.1 。biases = tf.Variable(tf.zeros([1,out_size])+0.1) Wx_plus_b = tf.matmul(inputs,Weights) + biases #建立神经网络线性公式:inputs * Weights + biasesif activation_function is None:outputs = Wx_plus_b #如果没有设置激活函数,则直接就把当前信号原封不动地传递出去else:outputs = activation_function(Wx_plus_b) #如果设置了激活函数,则会由此激活函数来对信号进行传递或抑制
return outputs
这样只需要在用的时候调用即可
l1 = add_layer(xs,1,10,activation_function=tf.nn.relu) #激活函数传入参数
prediction = add_layer(l1,10,1,activation_function=None) #输出结果
这和上面的分开编写效果是一样的,但是能节省内存等资源的消耗。
本文的全部代码已经托管在GitHub仓库当中(shenjingtest5_1_子函数版.py;shenjingtest5_2.py):
shenjingtest5_1_子函数版.py
shenjingtest5_2.py
tensorflow loss到多少_tensorflow学习笔记day4相关推荐
- CNN入门详解及TensorFlow源码实现--深度学习笔记
CNN入门详解及TensorFlow源码实现–深度学习笔记 ##一.卷积神经网络 ###1.简介 卷积神经网络是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出 ...
- 离散数学 学习笔记-Day4
离散数学 学习笔记-Day4: 1.集合 集合的基数:集合A中的元素个数,记为 |A|. 2.集合中元素的基本特性: 1)集合中元素是无序的 2)集合中元素是不同的 3.包含⊆: 真包含⊂:一个集合是 ...
- 生成对抗网络入门详解及TensorFlow源码实现--深度学习笔记
生成对抗网络入门详解及TensorFlow源码实现–深度学习笔记 一.生成对抗网络(GANs) 生成对抗网络是一种生成模型(Generative Model),其背后最基本的思想就是从训练库里获取很多 ...
- python自训练神经网络_tensorflow学习笔记之简单的神经网络训练和测试
本文实例为大家分享了用简单的神经网络来训练和测试的具体代码,供大家参考,具体内容如下 刚开始学习tf时,我们从简单的地方开始.卷积神经网络(CNN)是由简单的神经网络(NN)发展而来的,因此,我们的第 ...
- 《机器学习实战:基于Scikit-Learn、Keras和TensorFlow第2版》-学习笔记(9):无监督学习技术
· Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition, by Aurélien Géron ...
- 《机器学习实战:基于Scikit-Learn、Keras和TensorFlow第2版》-学习笔记(8):降维
· Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition, by Aurélien Géron ...
- 《机器学习实战:基于Scikit-Learn、Keras和TensorFlow第2版》-学习笔记(3)
第三章 分类 · Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition, by Aurélie ...
- Unity2D学习笔记Day4:镜头控制
学习资源:B站 M_Studio<Unity教程2D入门>09-10 Unity Assets:Sunnyland Day4 cinema跟随 方法一:transform 思路:镜头的x, ...
- tensorflow没有这个参数_TensorFlow入门笔记(五) : 神经网络参数与TensorFlow变量
神经网络参数简介 在TensorFlow中,变量(tf.Variable)的作用就是保存和更新神经网络中的参数.和其他编程语言类似,在TensorFlow中的变量也需要初始值.因为在TensorFlo ...
最新文章
- 01-html介绍和head标签
- python3 str bytes 字符串 字节 互相转换
- Sentinel 源码分析(一)
- 帆软报表(finereport)使用Event 事件对象 (target)修改提示框样式
- Tomcat 服务:解决 Apache Tomcat 更新后 Tomcat9w.exe 无法启动 Tomcat 服务的问题
- 如何检查python的库是否安装成功_如何测试redis是否安装成功
- python代码显示进度条 tqdm
- 高品质静物空间海报模板PSD分层素材
- yolo v3制作自己的数据_【手把手AI项目】五、自己制作图像VOC数据集--Objection Detection(目标检测)...
- 微软希望通过监控开发者结束软件 bug
- 从实例入手,讲解 CMake 的常见用法。demo1-demo8
- 服务器硬件工程师从入门到精通系列视频教程(1)-基础篇-赵振坤-专题视频课程...
- Your Uninstaller! 注册码
- 天津2021高考成绩查询26号什么时间,2021年天津高考成绩26号几点可以查询,今天几点出高考成绩...
- 直男届的杀手-『小冰』架构解析
- 推荐基于4G模块打造的超低功耗4G摄像头通讯板
- Ngnix+Tomcat配置负载均衡
- reactive和ref的特性和区别
- Modbus协议的数据模型和地址模型,Modbus寄存器40001,30001是什么意思?
- 大公司和创业公司怎么选?