TensorFlow(1)-基础知识点总结
1、 tensorflow简介
Tensorflow 是 google 开源的机器学习工具,在2015年11月其实现正式开源,开源协议Apache 2.0。
Tensorflow采用数据流图(data flow graphs)来计算, 所以首先我们得创建一个数据流流图,然后再将我们的数据(数据以张量(tensor)的形式存在)放在数据流图中计算. 节点(Nodes)在图中表示数学操作,图中的边(edges)则表示在节点间相互联系的多维数据数组, 即张量(tensor).训练模型时tensor会不断的从数据流图中的一个节点flow到另一节点, 这就是TensorFlow名字的由来.
张量(Tensor):张量有多种. 零阶张量为 纯量或标量 (scalar) 也就是一个数值. 比如 [1],一阶张量为 向量 (vector), 比如 一维的 [1, 2, 3],二阶张量为 矩阵 (matrix), 比如 二维的 [[1, 2, 3],[4, 5, 6],[7, 8, 9]],以此类推, 还有三维以上的多维。
2、 tensorflow基础
实际上编写tensorflow可以总结为两步.
(1)组装一个graph;
(2)使用session去执行graph中的operation。
2.1、概念说明
下面是 graph , session , operation , tensor 四个概念的简介。
Tensor:类型化的多维数组,图的边;
Operation:执行计算的单元,图的节点;
Graph:一张有边与点的图,其表示了需要进行计算的任务;
Session:称之为会话的上下文,用于执行图。
2.2、一个例子:
import tensorflowas tf
import numpyas np
#tensorflow中大部分数据是float32
# create real data 用numpy生成训练数据
x_data= np.random.rand(100).astype(np.float32)
y_data= x_data* 0.1 + 0.3
### create tensorflow structure start! ###
# 定义变量 用tf.Variable来定义变量w和b
Weights= tf.Variable(tf.random_uniform([1], -1.0, 1.0))
biases= tf.Variable(tf.zeros([1]))
# 定义如何计算预测值
y= Weights* x_data+ biases
# 损失函数 平方损失函数
loss= tf.reduce_mean(tf.square(y- y_data))
# 梯度下降优化器,定义learning rate optimizer = 优化器
optimizer= tf.train.GradientDescentOptimizer(0.5)
# 训练目标是损失最小化
train= optimizer.minimize(loss)
# 初始化变量, 即初始化weights和biases
init= tf.global_variables_initializer()
# 创建session,进行参数初始化
sess= tf.Session()
sess.run(init)
# 开始训练200步, 每20步输出一下两个参数
for stepin range(201):
sess.run(train)
if step% 20 == 0:
print(step, sess.run(Weights), sess.run(biases))
### create tensorflow structure end ###
在上面的例子中,我们想要预测的方程式y=0.1*x + 0.3,给定训练样本,通过梯度下降法来预测参数W和偏置b,我们使用numpy生成了我们的训练数据:
x_data = np.random.rand(100).astype(np.float32)
y_data = x_data * 0.1 + 0.3
随后,我们使用tf.Variable定义了我们的变量Weights和biases(以下简称w和b),Weights通过一个均匀分布随机产生,而bias则设置为0,同时二者的形状均为1维,即就是一个数:
Weights = tf.Variable(tf.random_uniform([1],-1.0,1.0))
biases = tf.Variable(tf.zeros([1]))
好了,有了变量,我们想要学习w和b,只需要用训练数据x来得到预测值,最小化预测值和实际值的差距就好,所以,我们定义了损失函数为平方损失函数,并通过0.5学习率的梯度下降法来进行参数调整:
#如何计算预测值
y = Weights * x_data + biases# loss functionloss = tf.reduce_mean(tf.square(y-y_data))
#梯度下降优化器,定义learning rate
optimizer = tf.train.GradientDescentOptimizer(0.5)
#训练目标是loss最小化
train = optimizer.minimize(loss)
在tf中定义的变量都需要经过初始化的操作,所以我们定义了一个初始化变量的操作:
#初始化变量,即初始化 Weights 和 biases
init = tf.global_variables_initializer()
接下来我们就可以开始训练了,训练必须创建一个session,通过run方法对指定的节点进行训练,这里一定要注意先要对参数进行初始化,否则后面是无法开始训练的。想要观察训练过程中的参数变化的话,也需要通过run方法:
# 创建session,进行参数初始化
# 开始训练200步, 每20步输出一下两个参数
for step in range(201):
sess.run(train)
if step% 20 == 0:
print(step, sess.run(Weights), sess.run(biases))
这里我们直接run的是train这一步,想要运行这一步,必须先得到optimizier和loss,想要得到loss就要得到预测值....依次往前推,所以run(train)实际上就是对整个tensor流图的训练。
最后贴出来看一下输出结果:
0 [-0.05120224] [ 0.5192185]
20 [ 0.04687011] [ 0.32806551]
40 [ 0.08647783] [ 0.307143]
60 [ 0.09655845] [ 0.30181798]
80 [ 0.09912409] [ 0.30046269]
100 [ 0.09977707] [ 0.30011776]
120 [ 0.09994329] [ 0.30002996]
140 [ 0.09998558] [ 0.30000764]
160 [ 0.09999632] [ 0.30000195]
180 [ 0.09999906] [ 0.30000052]
200 [ 0.09999976] [ 0.30000013]
2.3、数据结构
Tensorflow的数据结构有着rank,shape,data types的概念,下面来分别讲解。
(1)rank
Rank一般是指数据的维度,其与线性代数中的rank不是一个概念。
例如我们所说的标量(Scalar):
s = 8,维数为 0,所以它的 rank 为 0。
例如矢量(Vector):
v = [1, 2, 3],rank 为 1。
例如矩阵(Matrix):
一个二维矩阵 rank 为 2
又例如 rank 为 3 的 tensor:
t = [[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]],以此类推。
(2)shape
tensorflow 用 3 种方式描述一个 tensor 的维数:
rank, shape(shape指tensor每个维度数据的个数), 以及 dimension number (维数)
所以 shape 和 rank 的意思的一样的,只是表达的形式不同。
shape 写成只包含整数的 list 或者 tuple 形式,例如 [1, 4, 2]
(3)datatype
tensor 的数据结构除了 维数(dimensionality),还有 数据类型(data type)。
例如 32位浮点数(32 bits floating point) 等等,可以从下面的链接中查看完整的:
https://www.tensorflow.org/programmers_guide/dims_types#data_types
3、 Variables
(1)介绍
当训练模型时,需要使用Variables保存与更新参数。Variables会保存在内存当中,所有tensor一旦拥有Variables的指向就不会在session中丢失。其必须明确的初始化而且可以通过Saver保存到磁盘上。Variables可以通过Variables初始化。
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")
其中,tf.random_normal是随机生成一个正态分布的tensor,其shape是第一个参数,stddev是其标准差。tf.zeros是生成一个全零的tensor。之后将这个tensor的值赋值给Variable。
(2)初始化
实际在其初始化过程中做了很多的操作,比如初始化空间,赋初值(等价于tf.assign),并把Variable添加到graph中等操作。注意在计算前需要初始化所有的Variable。一般会在定义graph时定义global_variables_initializer,其会在session运算时初始化所有变量。
直接调用global_variables_initializer会初始化所有的Variable,如果仅想初始化部分Variable可以调用tf.variables_initializer。
Init_ab = tf.variables_initializer([a,b],name=”init_ab”)
Variables可以通过eval显示其值,也可以通过assign进行赋值。Variables支持很多数学运算,具体可以参照官方文档。
(3)Variables与constant的区别
值得注意的是Variables与constant的区别。Constant一般是常量,可以被赋值给Variables,constant保存在graph中,如果graph重复载入那么constant也会重复载入,其非常浪费资源,如非必要尽量不使用其保存大量数据。而Variables在每个session中都是单独保存的,甚至可以单独存在一个参数服务器上。可以通过代码观察到constant实际是保存在graph中。
(4)命名
另外一个值得注意的地方是尽量每一个变量都明确的命名,这样易于管理命令空间,而且在导入模型的时候不会造成不同模型之间的命名冲突,这样就可以在一张graph中容纳很多个模型。
4、 placeholders与feed_dict
当我们定义一张graph时,有时候并不知道需要计算的值,比如模型的输入数据,其只有在训练与预测时才会有值。这时就需要placeholder(用占位符表示)与feed_dict的帮助。占位符并没有初始值,它只会分配必要的内存。在会话中,占位符可以使用 feed_dict 馈送数据。
feed_dict是一个字典,在字典中需要给出每一个用到的占位符的取值。(sess.run使用的时候要给出前面的占位符的取值。)
定义一个placeholder,可以使用tf.placeholder(dtype,shape=None,name=None)函数。
foo = tf.placeholder(tf.int32,shape=[1],name='foo')
bar = tf.constant(2,name='bar')
result = foo + bar
with tf.Session() as sess:
print(sess.run(result))
在上面的代码中,会抛出错误(InvalidArgumentError),因为计算result需要foo的具体值,而在代码中并没有给出。这时候需要将实际值赋给foo。最后一行修改如下(其中最后的dict就是一个feed_dict,一般会使用python读入一些值后传入,当使用minbatch的情况下,每次输入的值都不同):
print(sess.run(result,{foo:[3]}))
TensorFlow(1)-基础知识点总结的更多相关文章
- fastclick 源码注解及一些基础知识点
在移动端,网页上的点击穿透问题导致了非常糟糕的用户体验.那么该如何解决这个问题呢? 问题产生的原因 移动端浏览器的点击事件存在300ms的延迟执行,这个延迟是由于移动端需要通过在这个时间段用户是否两次 ...
- .NET基础知识点
.NET基础知识点 l .Net平台 .Net FrameWork框架 l .Net FrameWork框架提供了一个稳定的运行环境,:来保障我们.Net平台正常的运转 l 两种交 ...
- JavaScript 开发者经常忽略或误用的七个基础知识点(转)
JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新 ...
- JavaScript 开发者经常忽略或误用的七个基础知识点
JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新 ...
- JavaScript开发者常忽略或误用的七个基础知识点
JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和灵活的模式来改进它.昨天我们将这些模式应用到了 JavaScript 框架中,今天这些框架又驱动了我们的 Web 应用程序.很多新 ...
- JavaScript语言基础知识点图示(转)
一位牛人归纳的JavaScript 语言基础知识点图示. 1.JavaScript 数据类型 2.JavaScript 变量 3.Javascript 运算符 4.JavaScript 数组 5.Ja ...
- JavaScript 语言基础知识点总结
网上找到的一份JavaScript 语言基础知识点总结,还不错,挺全面的. (来自:http://t.cn/zjbXMmi @刘巍峰 分享 )
- c语言学习之基础知识点介绍(三):scanf函数
本节继续介绍c语言的基础知识点. scanf函数:用来接收用户输入的数据. 语法:scanf("格式化控制符",地址列表); 取地址要用到取地址符:&(shift+7) 例 ...
- c语言学习之基础知识点介绍(二):格式化控制符和变量的补充
上节简单介绍了c语言中的一些基础知识点,本节将对之前介绍的不够详细的知识点进行补充. 格式化控制符的消息介绍: %d的其他控制符: 1.%md:m代表这个整数位占用多少位,m是一个整数.实际数字不足的 ...
- (转)JavaScript 开发者经常忽略或误用的七个基础知识点
英文原文:7 JavaScript Basics Many Developers Aren't Using (Properly) JavaScript 本身可以算是一门简单的语言,但我们也不断用智慧和 ...
随机推荐
- 项目集成dubbo
dubbo 用户指南: http://dubbo.io/User+Guide-zh.htm 开发指南:http://dubbo.io/Developer+Guide-zh.htm#DeveloperG ...
- c# log4net 配置使用
新增配置文件log4net.config,内容如下 <?xml version="1.0" encoding="utf-8" ?> <conf ...
- 发布Qt Quick桌面应用程序的方法(使得planets在XP上运行)
发布Qt Quick桌面应用程序的方法 Qt是一款优秀的跨平台开发框架,它可以在桌面.移动平台以及嵌入式平台上运行.目前Qt 5介绍程序发布的文章帖子比较少.大家又非常想要知道如何发布Qt应用程序,于 ...
- HTTP Post之multipart/form-data和application/x-www-form-urlencoded
关于HttpPost,有这样两种可Post的数据载体,分别是MultipartEntity和UrlEncodedFormEntity,对这两者的共性和异性做如下解释和备忘: 共性: 1.都属于HTTP ...
- AIX/Linux/HP-UX查看CPU/内存/磁盘/存储命令
1.1 硬件环境验证方式 硬件环境主要包括CPU.内存.磁盘/存储.网络设备(如F5等).系统特有设备(如密押设备等)等,其中网络设备和系统特有设备由网络管理员或项目组提供为准,本节主要关注CP ...
- Mac 简单切换jdk版本
https://www.cnblogs.com/c-xiaohai/p/6985018.html dmg安装包安装 vim ~/.bash_profile_jdk export JAVA_8_HOME ...
- 【需要重新维护】Redis笔记20170811视频
很多内容都是抄的,个人记录 1.windows下初见 安装 进入目录 修改配置文件(暂时使用默认,未配置环境变量) 目录下:redis-server.exe启动服务 新建命令提示符,目录下,redis ...
- vagrant+xdebug
https://segmentfault.com/a/1190000007789295
- ElasticStack学习(二):ElasticStack安装与运行
一.ElasticSearch的安装与运行 1.由于ElasticSearch是由Java语言开发的,若要运行ElasticSearch,需要安装并配置JDK,并要设置$JAVA_HOME环境变量. ...
- 跟我学SpringCloud | 第七篇:Spring Cloud Config 配置中心高可用和refresh
SpringCloud系列教程 | 第七篇:Spring Cloud Config 配置中心高可用和refresh Springboot: 2.1.6.RELEASE SpringCloud: Gre ...