今天学习的是如何搭建一个完整的神经网络结构,这几天都在研究整篇代码的含义,网上的教程都是各有缺失,综合了多个版本才完全搞清楚。我会把每个函数的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相关推荐

  1. CNN入门详解及TensorFlow源码实现--深度学习笔记

    CNN入门详解及TensorFlow源码实现–深度学习笔记 ##一.卷积神经网络 ###1.简介 卷积神经网络是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出 ...

  2. 离散数学 学习笔记-Day4

    离散数学 学习笔记-Day4: 1.集合 集合的基数:集合A中的元素个数,记为 |A|. 2.集合中元素的基本特性: 1)集合中元素是无序的 2)集合中元素是不同的 3.包含⊆: 真包含⊂:一个集合是 ...

  3. 生成对抗网络入门详解及TensorFlow源码实现--深度学习笔记

    生成对抗网络入门详解及TensorFlow源码实现–深度学习笔记 一.生成对抗网络(GANs) 生成对抗网络是一种生成模型(Generative Model),其背后最基本的思想就是从训练库里获取很多 ...

  4. python自训练神经网络_tensorflow学习笔记之简单的神经网络训练和测试

    本文实例为大家分享了用简单的神经网络来训练和测试的具体代码,供大家参考,具体内容如下 刚开始学习tf时,我们从简单的地方开始.卷积神经网络(CNN)是由简单的神经网络(NN)发展而来的,因此,我们的第 ...

  5. 《机器学习实战:基于Scikit-Learn、Keras和TensorFlow第2版》-学习笔记(9):无监督学习技术

    · Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition, by Aurélien Géron ...

  6. 《机器学习实战:基于Scikit-Learn、Keras和TensorFlow第2版》-学习笔记(8):降维

    · Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition, by Aurélien Géron ...

  7. 《机器学习实战:基于Scikit-Learn、Keras和TensorFlow第2版》-学习笔记(3)

    第三章 分类 · Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition, by Aurélie ...

  8. Unity2D学习笔记Day4:镜头控制

    学习资源:B站 M_Studio<Unity教程2D入门>09-10 Unity Assets:Sunnyland Day4 cinema跟随 方法一:transform 思路:镜头的x, ...

  9. tensorflow没有这个参数_TensorFlow入门笔记(五) : 神经网络参数与TensorFlow变量

    神经网络参数简介 在TensorFlow中,变量(tf.Variable)的作用就是保存和更新神经网络中的参数.和其他编程语言类似,在TensorFlow中的变量也需要初始值.因为在TensorFlo ...

最新文章

  1. 01-html介绍和head标签
  2. python3 str bytes 字符串 字节 互相转换
  3. Sentinel 源码分析(一)
  4. 帆软报表(finereport)使用Event 事件对象 (target)修改提示框样式
  5. Tomcat 服务:解决 Apache Tomcat 更新后 Tomcat9w.exe 无法启动 Tomcat 服务的问题
  6. 如何检查python的库是否安装成功_如何测试redis是否安装成功
  7. python代码显示进度条 tqdm
  8. 高品质静物空间海报模板PSD分层素材
  9. yolo v3制作自己的数据_【手把手AI项目】五、自己制作图像VOC数据集--Objection Detection(目标检测)...
  10. 微软希望通过监控开发者结束软件 bug
  11. 从实例入手,讲解 CMake 的常见用法。demo1-demo8
  12. 服务器硬件工程师从入门到精通系列视频教程(1)-基础篇-赵振坤-专题视频课程...
  13. Your Uninstaller! 注册码
  14. 天津2021高考成绩查询26号什么时间,2021年天津高考成绩26号几点可以查询,今天几点出高考成绩...
  15. 直男届的杀手-『小冰』架构解析
  16. 推荐基于4G模块打造的超低功耗4G摄像头通讯板
  17. Ngnix+Tomcat配置负载均衡
  18. reactive和ref的特性和区别
  19. Modbus协议的数据模型和地址模型,Modbus寄存器40001,30001是什么意思?
  20. 大公司和创业公司怎么选?

热门文章

  1. Java EE 各个版本简介
  2. git命令超实用集齐
  3. localForage Web 离线存储
  4. NLP --- 最大熵模型的解法(GIS算法、IIS算法)
  5. 基于持久层框架hibernate用SpringMVC增删功能
  6. ai的预览模式切换_当AI频繁切换色彩预览模式时 颜色会越变越深 求解?
  7. 展示浏览 java_java利用 cookie 进行展示你所浏览过的的商品
  8. [六省联考2017]相逢是问候(线段树+拓展欧拉定理)
  9. Android 自定义Dialog 去除阴影
  10. UI自动化:单元测试框架