本文是学习这个视频课程系列的笔记,课程链接是 youtube 上的,
讲的很好,浅显易懂,入门首选, 而且在github有代码,
想看视频的也可以去他的优酷里的频道找。

Tensorflow 官网


神经网络是一种数学模型,是存在于计算机的神经系统,由大量的神经元相连接并进行计算,在外界信息的基础上,改变内部的结构,常用来对输入和输出间复杂的关系进行建模。

神经网络由大量的节点和之间的联系构成,负责传递信息和加工信息,神经元也可以通过训练而被强化。

这个图就是一个神经网络系统,它由很多层构成。输入层就是负责接收信息,比如说一只猫的图片。输出层就是计算机对这个输入信息的认知,它是不是猫。隐藏层就是对输入信息的加工处理。

神经网络是如何被训练的,首先它需要很多数据。比如他要判断一张图片是不是猫。就要输入上千万张的带有标签的猫猫狗狗的图片,然后再训练上千万次。

神经网络训练的结果有对的也有错的,如果是错误的结果,将被当做非常宝贵的经验,那么是如何从经验中学习的呢?就是对比正确答案和错误答案之间的区别,然后把这个区别反向的传递回去,对每个相应的神经元进行一点点的改变。那么下一次在训练的时候就可以用已经改进一点点的神经元去得到稍微准确一点的结果。

神经网络是如何训练的呢?每个神经元都有属于它的激活函数,用这些函数给计算机一个刺激行为。

在第一次给计算机看猫的图片的时候,只有部分的神经元被激活,被激活的神经元所传递的信息是对输出结果最有价值的信息。如果输出的结果被判定为是狗,也就是说是错误的了,那么就会修改神经元,一些容易被激活的神经元会变得迟钝,另外一些神经元会变得敏感。这样一次次的训练下去,所有神经元的参数都在被改变,它们变得对真正重要的信息更为敏感。

Tensorflow 是谷歌开发的深度学习系统,用它可以很快速地入门神经网络。

它可以做分类,也可以做拟合问题,就是要把这个模式给模拟出来。

这是一个基本的神经网络的结构,有输入层,隐藏层,和输出层
每一层点开都有它相应的内容,函数和功能。

那我们要做的就是要建立一个这样的结构,然后把数据喂进去。
把数据放进去后它就可以自己运行,TensorFlow 翻译过来就是向量在里面飞。

这个动图的解释就是,在输入层输入数据,然后数据飞到隐藏层飞到输出层,用梯度下降处理,梯度下降会对几个参数进行更新和完善,更新后的参数再次跑到隐藏层去学习,这样一直循环直到结果收敛。

今天一口气把整个系列都学完了,先来一段完整的代码,然后解释重要的知识点!


1. 搭建神经网络基本流程

定义添加神经层的函数

1.训练的数据
2.定义节点准备接收数据
3.定义神经层:隐藏层和预测层
4.定义 loss 表达式
5.选择 optimizer 使 loss 达到最小

然后对所有变量进行初始化,通过 sess.run optimizer,迭代 1000 次进行学习:

 
  1. import tensorflow as tf

  2. import numpy as np

  3. # 添加层
  4. def add_layer(inputs, in_size, out_size, activation_function=None):

  5. # add one more layer and return the output of this layer

  6. Weights = tf.Variable(tf.random_normal([in_size, out_size]))

  7. biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)

  8. Wx_plus_b = tf.matmul(inputs, Weights) + biases

  9. if activation_function is None:

  10. outputs = Wx_plus_b

  11. else:

  12. outputs = activation_function(Wx_plus_b)

  13. return outputs

  14. # 1.训练的数据
  15. # Make up some real data

  16. x_data = np.linspace(-1,1,300)[:, np.newaxis]

  17. noise = np.random.normal(0, 0.05, x_data.shape)

  18. y_data = np.square(x_data) - 0.5 + noise

  19. # 2.定义节点准备接收数据
  20. # define placeholder for inputs to network

  21. xs = tf.placeholder(tf.float32, [None, 1])

  22. ys = tf.placeholder(tf.float32, [None, 1])

  23. # 3.定义神经层:隐藏层和预测层

  24. # add hidden layer 输入值是 xs,在隐藏层有 10 个神经元

  25. l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)

  26. # add output layer 输入值是隐藏层 l1,在预测层输出 1 个结果

  27. prediction = add_layer(l1, 10, 1, activation_function=None)

  28. # 4.定义 loss 表达式

  29. # the error between prediciton and real data

  30. loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),

  31. reduction_indices=[1]))

  32. # 5.选择 optimizer 使 loss 达到最小

  33. # 这一行定义了用什么方式去减少 loss,学习率是 0.1

  34. train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

  35. # important step 对所有变量进行初始化

  36. init = tf.initialize_all_variables()

  37. sess = tf.Session()

  38. # 上面定义的都没有运算,直到 sess.run 才会开始运算

  39. sess.run(init)

  40. # 迭代 1000 次学习,sess.run optimizer

  41. for i in range(1000):

  42. # training train_step 和 loss 都是由 placeholder 定义的运算,所以这里要用 feed 传入参数

  43. sess.run(train_step, feed_dict={xs: x_data, ys: y_data})

  44. if i % 50 == 0:

  45. # to see the step improvement

  46. print(sess.run(loss, feed_dict={xs: x_data, ys: y_data}))


2. 主要步骤的解释:

 
  1. import tensorflow as tf

  2. import numpy as np

  • 导入或者随机定义训练的数据 x 和 y:
 
  1. x_data = np.random.rand(100).astype(np.float32)

  2. y_data = x_data*0.1 + 0.3

  • 先定义出参数 Weights,biases,拟合公式 y,误差公式 loss
 
  1. Weights = tf.Variable(tf.random_uniform([1], -1.0, 1.0))

  2. biases = tf.Variable(tf.zeros([1]))

  3. y = Weights*x_data + biases

  4. loss = tf.reduce_mean(tf.square(y-y_data))

  • 选择 Gradient Descent 这个最基本的 Optimizer:
optimizer = tf.train.GradientDescentOptimizer(0.5)
  • 神经网络的 key idea,就是让 loss 达到最小:
train = optimizer.minimize(loss)
  • 前面是定义,在运行模型前先要初始化所有变量:
init = tf.initialize_all_variables()
  • 接下来把结构激活,sesseion像一个指针指向要处理的地方:
sess = tf.Session()
  • init 就被激活了,不要忘记激活:
sess.run(init)
  • 训练201步:
for step in range(201):
  • 要训练 train,也就是 optimizer:
sess.run(train)
  • 每 20 步打印一下结果,sess.run 指向 Weights,biases 并被输出:
 
  1. if step % 20 == 0:

  2. print(step, sess.run(Weights), sess.run(biases))

所以关键的就是 y,loss,optimizer 是如何定义的。


3. TensorFlow 基本概念及代码:

在 TensorFlow 入门 也提到了几个基本概念,这里是几个常见的用法。

  • Session

矩阵乘法:tf.matmul

product = tf.matmul(matrix1, matrix2) # matrix multiply np.dot(m1, m2)

定义 Session,它是个对象,注意大写:

sess = tf.Session()

result 要去 sess.run 那里取结果:

result = sess.run(product)
  • Variable

用 tf.Variable 定义变量,与python不同的是,必须先定义它是一个变量,它才是一个变量,初始值为0,还可以给它一个名字 counter:

state = tf.Variable(0, name='counter')

将 new_value 加载到 state 上,counter就被更新:

update = tf.assign(state, new_value)

如果有变量就一定要做初始化:

init = tf.initialize_all_variables() # must have if define variable
  • placeholder:

要给节点输入数据时用 placeholder,在 TensorFlow 中用placeholder 来描述等待输入的节点,只需要指定类型即可,然后在执行节点的时候用一个字典来“喂”这些节点。相当于先把变量 hold 住,然后每次从外部传入data,注意 placeholder 和 feed_dict 是绑定用的。

这里简单提一下 feed 机制, 给 feed 提供数据,作为 run()
调用的参数, feed 只在调用它的方法内有效, 方法结束, feed 就会消失。

 
  1. import tensorflow as tf

  2. input1 = tf.placeholder(tf.float32)
  3. input2 = tf.placeholder(tf.float32)

  4. ouput = tf.mul(input1, input2)

  5. with tf.Session() as sess:
  6. print(sess.run(ouput, feed_dict={input1: [7.], input2: [2.]}))


4. 神经网络基本概念

  • 激励函数:

例如一个神经元对猫的眼睛敏感,那当它看到猫的眼睛的时候,就被激励了,相应的参数就会被调优,它的贡献就会越大。

下面是几种常见的激活函数:
x轴表示传递过来的值,y轴表示它传递出去的值:

激励函数在预测层,判断哪些值要被送到预测结果那里:

TensorFlow 常用的 activation function

  • 添加神经层:

输入参数有 inputs, in_size, out_size, 和 activation_function

 
  1. import tensorflow as tf

  2. def add_layer(inputs, in_size, out_size, activation_function=None):

  3. Weights = tf.Variable(tf.random_normal([in_size, out_size]))
  4. biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)

  5. Wx_plus_b = tf.matmul(inputs, Weights) + biases

  6. if activation_function is None:
  7. outputs = Wx_plus_b

  8. else:

  9. outputs = activation_function(Wx_plus_b)

  10. return outputs
  • 分类问题的 loss 函数 cross_entropy :
 
  1. # the error between prediction and real data

  2. # loss 函数用 cross entropy

  3. cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction),

  4. reduction_indices=[1])) # loss

  5. train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)

  • overfitting:

下面第三个图就是 overfitting,就是过度准确地拟合了历史数据,而对新数据预测时就会有很大误差:

Tensorflow 有一个很好的工具, 叫做dropout, 只需要给予它一个不被 drop 掉的百分比,就能很好地降低 overfitting。

dropout 是指在深度学习网络的训练过程中,按照一定的概率将一部分神经网络单元暂时从网络中丢弃,相当于从原始的网络中找到一个更瘦的网络,这篇博客中讲的非常详细

代码实现就是在 add layer 函数里加上 dropout, keep_prob 就是保持多少不被 drop,在迭代时在 sess.run 中被 feed:

 
  1. def add_layer(inputs, in_size, out_size, layer_name, activation_function=None, ):

  2. # add one more layer and return the output of this layer

  3. Weights = tf.Variable(tf.random_normal([in_size, out_size]))

  4. biases = tf.Variable(tf.zeros([1, out_size]) + 0.1, )

  5. Wx_plus_b = tf.matmul(inputs, Weights) + biases

  6. # here to dropout
  7. # 在 Wx_plus_b 上drop掉一定比例

  8. # keep_prob 保持多少不被drop,在迭代时在 sess.run 中 feed

  9. Wx_plus_b = tf.nn.dropout(Wx_plus_b, keep_prob)

  10. if activation_function is None:
  11. outputs = Wx_plus_b

  12. else:

  13. outputs = activation_function(Wx_plus_b, )

  14. tf.histogram_summary(layer_name + '/outputs', outputs)

  15. return outputs


5. 可视化 Tensorboard

Tensorflow 自带 tensorboard ,可以自动显示我们所建造的神经网络流程图

就是用 with tf.name_scope 定义各个框架,注意看代码注释中的区别:

 
  1. import tensorflow as tf

  2. def add_layer(inputs, in_size, out_size, activation_function=None):

  3. # add one more layer and return the output of this layer

  4. # 区别:大框架,定义层 layer,里面有 小部件

  5. with tf.name_scope('layer'):

  6. # 区别:小部件

  7. with tf.name_scope('weights'):

  8. Weights = tf.Variable(tf.random_normal([in_size, out_size]), name='W')

  9. with tf.name_scope('biases'):

  10. biases = tf.Variable(tf.zeros([1, out_size]) + 0.1, name='b')

  11. with tf.name_scope('Wx_plus_b'):

  12. Wx_plus_b = tf.add(tf.matmul(inputs, Weights), biases)

  13. if activation_function is None:

  14. outputs = Wx_plus_b

  15. else:

  16. outputs = activation_function(Wx_plus_b, )

  17. return outputs

  18. # define placeholder for inputs to network

  19. # 区别:大框架,里面有 inputs x,y

  20. with tf.name_scope('inputs'):

  21. xs = tf.placeholder(tf.float32, [None, 1], name='x_input')

  22. ys = tf.placeholder(tf.float32, [None, 1], name='y_input')

  23. # add hidden layer

  24. l1 = add_layer(xs, 1, 10, activation_function=tf.nn.relu)

  25. # add output layer

  26. prediction = add_layer(l1, 10, 1, activation_function=None)

  27. # the error between prediciton and real data

  28. # 区别:定义框架 loss

  29. with tf.name_scope('loss'):

  30. loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys - prediction),

  31. reduction_indices=[1]))

  32. # 区别:定义框架 train

  33. with tf.name_scope('train'):

  34. train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

  35. sess = tf.Session()

  36. # 区别:sess.graph 把所有框架加载到一个文件中放到文件夹"logs/"里

  37. # 接着打开terminal,进入你存放的文件夹地址上一层,运行命令 tensorboard --logdir='logs/'

  38. # 会返回一个地址,然后用浏览器打开这个地址,在 graph 标签栏下打开

  39. writer = tf.train.SummaryWriter("logs/", sess.graph)

  40. # important step

  41. sess.run(tf.initialize_all_variables())

运行完上面代码后,打开 terminal,进入你存放的文件夹地址上一层,运行命令 tensorboard --logdir='logs/' 后会返回一个地址,然后用浏览器打开这个地址,点击 graph 标签栏下就可以看到流程图了:


6. 保存和加载

训练好了一个神经网络后,可以保存起来下次使用时再次加载:

 
  1. import tensorflow as tf

  2. import numpy as np

  3. ## Save to file

  4. # remember to define the same dtype and shape when restore

  5. W = tf.Variable([[1,2,3],[3,4,5]], dtype=tf.float32, name='weights')

  6. b = tf.Variable([[1,2,3]], dtype=tf.float32, name='biases')

  7. init= tf.initialize_all_variables()

  8. saver = tf.train.Saver()

  9. # 用 saver 将所有的 variable 保存到定义的路径

  10. with tf.Session() as sess:

  11. sess.run(init)

  12. save_path = saver.save(sess, "my_net/save_net.ckpt")

  13. print("Save to path: ", save_path)

  14. ################################################

  15. # restore variables

  16. # redefine the same shape and same type for your variables

  17. W = tf.Variable(np.arange(6).reshape((2, 3)), dtype=tf.float32, name="weights")

  18. b = tf.Variable(np.arange(3).reshape((1, 3)), dtype=tf.float32, name="biases")

  19. # not need init step

  20. saver = tf.train.Saver()

  21. # 用 saver 从路径中将 save_net.ckpt 保存的 W 和 b restore 进来

  22. with tf.Session() as sess:

  23. saver.restore(sess, "my_net/save_net.ckpt")

  24. print("weights:", sess.run(W))

  25. print("biases:", sess.run(b))

tensorflow 现在只能保存 variables,还不能保存整个神经网络的框架,所以再使用的时候,需要重新定义框架,然后把 variables 放进去学习。

如何用 Tensorflow 搭建神经网络-了解神经网络基本概念相关推荐

  1. 第一讲-tensorflow搭建完整的神经网络步骤(附完整代码)

    目标:神经网络实现鸢尾花分类问题 搭建神经网络步骤:准备数据-->搭建网络-->参数优化 ---> 测试效果 ---> Acc/loss可视化 准备数据 数据集读入 数据集乱序 ...

  2. 用Tensorflow搭建第一个神经网络

    简述 https://blog.csdn.net/a19990412/article/details/82913189 根据上面链接中的前两个学习教程学习 其中Mofan大神的例子非常好,学到了很多 ...

  3. python训练手势分类器_机器学习零基础?手把手教你用TensorFlow搭建图像分类器|干货...

    编者按:Pete Warden是TensorFlow移动团队的技术负责人.曾在Jetpac担任首次技术官.Jetpac的深度学习技术经过优化,可在移动和嵌入式设备上运行.该公司已于2014年被谷歌收购 ...

  4. 机器学习零基础?手把手教你用TensorFlow搭建图像识别系统

    [转] http://www.leiphone.com/news/201701/Y4uyEktkkwb5YhJM.html http://www.leiphone.com/news/201701/2t ...

  5. 【深度学习】Tensorflow搭建卷积神经网络实现情绪识别

    [深度学习]Tensorflow搭建卷积神经网络实现情绪识别 文章目录 1 Tensorflow的基本使用方法1.1 计算图1.2 Feed1.3 Fetch1.4 其他解释 2 训练一个Tensor ...

  6. 从零开始用TensorFlow搭建卷积神经网络

     https://www.jiqizhixin.com/articles/2017-08-29-14 机器之心GitHub项目:从零开始用TensorFlow搭建卷积神经网络 By 蒋思源2017 ...

  7. 教你如何用Keras搭建分类神经网络

    摘要:本文主要通过Keras实现了一个分类学习的案例,并详细介绍了MNIST手写体识别数据集. 本文分享自华为云社区<[Python人工智能] 十七.Keras搭建分类神经网络及MNIST数字图 ...

  8. #教计算机学画卡通人物#生成式对抗神经网络GAN原理、Tensorflow搭建网络生成卡通人脸

    生成式对抗神经网络GAN原理.Tensorflow搭建网络生成卡通人脸 下面这张图是我教计算机学画画,计算机学会之后画出来的,具体实现在下面. ▲以下是对GAN形象化地表述 ●赵某不务正业.游手好闲, ...

  9. 用TensorFlow搭建一个万能的神经网络框架(持续更新)

    博客作者:凌逆战 博客地址:https://www.cnblogs.com/LXP-Never/p/12774058.html 文章代码:https://github.com/LXP-Never/bl ...

  10. 从原理到代码:大牛教你如何用 TensorFlow 亲手搭建一套图像识别模块 | AI 研习社...

    自 2015 年 11 月首次发布以来,TensorFlow 凭借谷歌的强力支持,快速的更新和迭代,齐全的文档和教程,以及上手快且简单易用等诸多的优点,已经在图像识别.语音识别.自然语言处理.数据挖掘 ...

最新文章

  1. Xilinx Select IO的介绍
  2. python中dict和list排序
  3. C++中特定宏_FUNCTION_
  4. SpaceX完成“星舰”空中悬停,距载人探火星还远吗?
  5. v8声卡调音软件_sE VOXTOON AF2评测:解决复杂跳线需求的声卡
  6. android mvp 作用,Android MVP与MVC的区别和理解
  7. mysql 异地备份工具_异地备份简单实现(mysql)
  8. C语言中的文件是什么?
  9. html5怎么改为vue_Vue.js 项目打包优化实践
  10. 数据库,部分函数依赖,传递函数依赖,完全函数依赖,三种范式的区别
  11. 201709-1-打酱油
  12. iOS AnchorPoint 引起的坐标问题
  13. 拓端tecdat|R语言对回归模型进行协方差分析
  14. 为什么很少人学汇编_为什么那么多人学模具,成功的只有不到5%???
  15. android移动开发慕课版本_Android移动开发基础教程(慕课版)
  16. Xpath--使用Xpath爬取糗事百科成人版图片
  17. android网页自动输入,android浏览器自动填表
  18. 将pdf拆分成多个pdf
  19. Windows, 使用https访问网页提示此网站的安全证书有问题解决方法
  20. 2016年最新苹果开发者账号注册申请流程最强详解!

热门文章

  1. React 深度学习:ReactFiberRoot
  2. 模拟退火算法之旅行商(TSP)问题matlab实现
  3. shell日期加减及数组循环
  4. 让人耗尽脑汁的需求分析工作(转--Fireball)
  5. React 组件间通讯
  6. MySql_SQLyog快捷键
  7. Python 学习笔记 (6)—— 读写文件
  8. selenium实现失败重运行
  9. CSS3的几个标签速记3
  10. 重新想象 Windows 8 Store Apps (35) - 通知: Toast 详解