1.计算图

首先解释什么是计算图,了解TensorFlow的计算模型.

和我们常见的程序计算框架不同,并不是赋值,或者计算后,TensorFlow立马完成这些操作,而是将这些操作,赋予在一个图中,这个图可以简单地认为是我们常见的流程图,只不过更加的详细,包括每一步操作(op)和变量的名字.

因为神经网络的运行,需要很大的计算量,如果循环往复的赋值计算,将会带来很大的麻烦,所以TensorFlow采用计算图模型,包括其他很多框架都是采用同样的模型.

比如说,我们建立一个神经网络,那我们首先,定义好变量(参数),然后每一步计算,包括输出.当定以好之后,我们建立一个会话(Session),在这个会话中运行图模型.

# tf.get_default_graph()获取默认的计算图
# a.graph可以查看张量所属的计算图
print(a.graph is tf.get_default_graph())# 建立两个不同的计算图,然后分别输出两个变量
g1 = tf.Graph()
with g1.as_default():v = tf.get_variable('v', initializer=tf.zeros([2,3],tf.float32))g2 = tf.Graph()
with g2.as_default():v = tf.get_variable('v',initializer=tf.ones([2,3],tf.float32))

2. TensorFlow中的数据类型

2.1 tf.constant():常量

TensorFlow中的张量模型,也就是我们所说的Tensor的意思.

在TensorFlow中完成的是一步赋值过程,将定义的一个张量保存在变量a或b中.a和b保存的不是张量的值,而是这些数字的运算过程.

注意:

  • 1.张量三属性:名字,维度,类型(一般为tf.float32);
  • 2.运算时,维度和类型要保持一直;
  • 3.名字给出了张量的唯一标识符,同事给出变量是如何计算的;
  • 4.张量的计算和普通计算是不同的,保存的不是数值,而是计算过程!!!

张量的作用:

  • 1.对中间计算结果的引用,增加代码的可读性
  • 2.计算图构造完成后,用来获得计算结果
import tensorflow as tf
a = tf.constant([1.0, 2.0], name='a')
b = tf.constant([2.0, 3.0], name='b')
# 不管是张量直接相加,还是tf.add二者的作用是一致的
result1 = a + b
result2 = tf.add(a,b,name='add')
print(result1)
print(result2)

2.2 tf.Variable()

专门用来,保存和更新神经网络中的参数,所以我们在建立神经网络模型参数的时候,使用tf.Variable()类型.

常用的常数生成函数:
  • tf.zeros()
  • tf.ones()
  • tf.fill()
常用的随机数生成函数:
  • tf.random_normal(维度,标准差,类型)
  • tf.truncated_normal()
  • tf.random_uniform()
w1 = tf.Variable(tf.random_normal([2,3], stddev=1, seed=1))
# 与上类似,维度([3,1])
w2 = tf.Variable(tf.random_normal([3,1], stddev=1, seed=1))

2.3 tf.placeholder()

在前面定义张量时,我们使用的是tf.constant().我们都知道神经网络的训练需要上千上万,甚至几百万的循环迭代,而每次循环迭代,每次生成一个常量,TensorFlow就会在计算图中增加一个节点,最后就会使得,图异常复杂.所以TensorFlow引入tf.placeholder机制.

tf.placeholder相当于提前为变量,定义,开拓了一个位置,这个位置的数据在程序运行时被指定.也就是在计算图中,我们只有一个位置,这个位置的值会不断改变,这样就避免了重复生成.

三个属性:

  • 类型
  • 维度
  • 名字

运行时,使用feed_dict来定义输入.

x = tf.placeholder(tf.float32, shape=(None, 2), name='x-input')
y_ = tf.placeholder(tf.float32, shape=(None, 1), name='y-input')

3.会话(Session)

前面我们已经提到了计算图模型,在TensorFlow中,我们使用会话(Session)来执行定义好的计算.会话拥有并管理TensorFlow中的所有资源,运行结束后,需要及时回收资源.

3.1 模式一:

调用会话生成函数,然后关闭会话函数.

sess = tf.Session()
with sess.as_default():print(result2.eval())print('\n')# 这两个有同样的功能
print(sess.run(result2))
print('\n')
print(result2.eval(session=sess))
print('\n')

3.2 模式二:

利用上下文管理器,来使用会话,自动释放资源.


with tf.Session(graph=g1) as sess:tf.global_variables_initializer().run()with tf.variable_scope('',reuse=True):print(sess.run(tf.get_variable('v')))with tf.Session(graph=g2) as sess:tf.global_variables_initializer().run()with tf.variable_scope('', reuse=True):print(sess.run(tf.get_variable('v')))print('\n')

3.3 模式三:

交互式会话模式,尤其是在Ipython(Jupyter Notebook),这种交互式的环境中,使用非常方便.

# 使用交互式会话模式
sess1 = tf.InteractiveSession()
print(sess1.run(result2))
sess1.close()

4.TensorFlow实现神经网络

# 导入tensorflow库
import  tensorflow as tf
# 导入Numpy工具包,生成一个模拟数据集
from numpy.random import  RandomState# 采用Mini-batch训练方法,速度快,准确率高
batch_size = 8# 首先定义两个权重(变量),满足正太随机分布,维度([2,3]),标准差是1, seed使用随机种子,保证每次运行的结果一样
w1 = tf.Variable(tf.random_normal([2,3], stddev=1, seed=1))
# 与上类似,维度([3,1])
w2 = tf.Variable(tf.random_normal([3,1], stddev=1, seed=1))# 设置x变量,使用placeholder,为变量提供一个位置.若使用variable等格式,每次赋值,都会在计算图中
# 增加一个结点,训练几百万轮,会使得计算图非常复杂,所以引入placeholder机制.
# 维度([None,2]),
x = tf.placeholder(tf.float32, shape=(None, 2), name='x-input')
y_ = tf.placeholder(tf.float32, shape=(None, 1), name='y-input')# matmul实现矩阵相乘,这里tensorflow使用计算图方式,与numpy的矩阵相乘是不一样的.
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)# 通过极力函数sigmoid(),实现非线性化
y = tf.sigmoid(y)# 定义损失函数,此处使用交叉熵,以后讨论,用来表征预测数据和真实数据的误差
cross_entropy = -tf.reduce_mean(y_ * tf.log(tf.clip_by_value(y, 1e-10, 1.0))+ (1 - y) * tf.log(tf.clip_by_value(1-y, 1e-10, 1.0)))# 定义反向传播算法,来优化NN中的参数,此处使用AdamOptimizer
# 学习率:0.001,优化目标:cross_entropy
train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy)# 通过随机数生成模拟数据集
rdm = RandomState(1)# 训练数据X:数据集大小[128,2]
# 128个样例,2个属性
dataSet_size = 128
X = rdm.rand(dataSet_size, 2)# 标签数据Y:使用布尔变量,如果x1 + x2 < 1则认为是正样本,也就是为1
# 否则认为是负样本,也就是0.
Y = [[int(x1 + x2 < 1)] for (x1,x2) in X]# 创建一个回话,来运行计算图
with tf.Session() as sess:# 对所有变量进行初始化init_op = tf.global_variables_initializer()sess.run(init_op)# 输出w1和w2值,在训练之前print(sess.run(w1))print(sess.run(w2))# 设置迭代次数为5000次Steps = 5000# 循环for i in range(Steps):# 选取batch_size个样本,取余start = (i*batch_size)%dataSet_size# 避免超出训练集的范围end = min(start + batch_size, dataSet_size)# 对选取的样本进行训练,因为是placeholder,使用字典对其赋值,并迭代更新参数sess.run(train_step, feed_dict={x : X[start:end], y_ : Y[start:end]})# 当迭代次数为100的倍数的时候,输出所有数据上的交叉熵if i%100 == 0:total_cross_entropy = sess.run(cross_entropy, feed_dict={x:X, y_ : Y})print("After %d training step(s), cross entropy on all data is %g" % (i, total_cross_entropy))# 输出训练过后的参数(权重)print(sess.run(w1))print(sess.run(w2))

TensorFlow零基础入门教程(一)相关推荐

  1. python怎么输出浮点数_python 零基础入门教程第 2 章:基本数据类型 (一)

    一.什么是数据类型 编程语言通过一些复杂的计算机物理底层机制,创造不同类型的数据,用来表示现实世界中的不同信息,以便于计算机更好的存储和计算. 每种编程语言都会有一些基本的数据类型用来表示现实世界中的 ...

  2. 视频教程-Python零基础入门教程-Python

    Python零基础入门教程 从2012年从事互联网至今有7年软件编程经验,曾任职国内北京互联网公司,中南林业大学授课Python 现任逻辑教育Python课程负责人,精通Python语言,精通人工智能 ...

  3. SEO零基础入门教程(外链的发布和软文编写)

    seo的作用是众所周知的,对网站进行seo优化,可以给网站带来大量的搜索引擎流量.但是想要做好网站优化也有难度,尤其是对于seo新手来说,因为缺乏理论和实战,所以seo新手需要多加练习.那么具体seo ...

  4. 九宫怎么排列和使用_剪映零基础入门教程第三十七篇:一学就会系列之九宫格小程序配音...

    很多玩儿抖音的朋友都看过九宫格视频,但是并不是每个玩抖音的人都会制作这个九宫格视频,实际这个需要借助小工具来帮忙,而常用抖音的朋友们会对剪映更加熟悉一些,且九宫格视频在剪映内的制作方式则比较简单.那么 ...

  5. 计算机pscs6教程,photoshop CS6零基础入门教程

    <photoshop CS6零基础入门教程>针对零基础学员开设,以教案和实际操作演示相结合的方式,详细地介绍adobe photoshop cs6的各项工具和命令.由浅入深.循序渐进地全面 ...

  6. finereport自学教程_办公物语丨Finereport零基础入门教程,你不可缺少的报表神器...

    原标题:办公物语丨Finereport零基础入门教程,你不可缺少的报表神器 ⌛ 小办又来了,快,搬好你的小板凳. 今天小办要着重讲一下 之前推文里提到过的制表神器. 当你逐渐发现Excel不能满足你的 ...

  7. 视频教程-ARDUINO零基础入门教程【代码编程篇】-Arduino

    ARDUINO零基础入门教程[代码编程篇] 精通各种单片机编程,有十年以上ARDUINO,51单片机/STM32/PIC/AVR编程,硬件设计,绘图,编程经验.熟悉各种常用传感器使用和物联网通讯 赵勇 ...

  8. ue4怎么用虚幻商城场景_【更新】UE4虚幻引擎野外场景制作零基础入门教程

    原标题:[更新]UE4虚幻引擎野外场景制作零基础入门教程 作为一套零基础入门教程,可以帮助虚幻4引擎的新手了解到环境制作流程和相关软件的配合.本教学适合零基础入门用户,不适合有一定经验的UE使用者. ...

  9. 生日祝福小程序_广告配音剪映零基础入门教程第二十六篇:如何给朋友制作生日祝福视频...

    经常听到小伙伴问到生日祝福视频怎么做,当然我想既然要为他人做生日祝福视频,那么这个人必定是自己身边比较重要的人,而生日又是每个人都是非常重要的,在这种充满意义的时刻,我们想给自己极其重要的人送上一份祝 ...

最新文章

  1. 如何和相亲对象无限聊天?程序员甩了这份架构图……| 每日趣闻
  2. 离散数学 消解算法判断合取范式的可满足性
  3. 线性代数笔记:概率矩阵分解 Probabilistic Matrix Factorization (PMF)
  4. bzoj 3357 [Usaco2004]等差数列 dp
  5. 【干货】搭建社区运营团队的一些经验和“血的教训”
  6. 计划策略-25-具有配置的订货型生产
  7. awk -f 分隔符 命令_千面 awk
  8. Toast源码深度分析
  9. [css] 请说下你对css对象模型(CSSOM)的理解
  10. html如何查看文档,查看文档
  11. 基于JAVA+Servlet+JSP+MYSQL的宿舍管理系统
  12. 两百行业专家聚首 详解IEC新标准
  13. 回顾频谱图卷积的经典工作:从ChebNet到GCN
  14. python 抓取行政区划
  15. 到底何为产品架构师?
  16. Android软键盘弹不出的问题
  17. hdu3294-Girls' research
  18. Android 钉钉第三方登录问题
  19. gap,margin和padding的区别
  20. SQL Server2017数据库查询实验

热门文章

  1. TMS320C645x DSP SRIO寄存器(五)——LSU和其他特殊事件中断
  2. 淘宝特价版多店铺订单管理应该怎么做?初征来教你
  3. 不动点迭代法的matlab实现
  4. 为什么重写equals()就一定要重写hashCode()方法
  5. 如何使FRAM MCU速度更快所需功耗最低
  6. C++ 实现堆(heap)
  7. mac电脑macOS常用软件必备软件命令行安装,史上最全mac插件
  8. 堆的操作(Java)
  9. ULTRA96V2部署神经网络
  10. 第六周 8.23-8.29