文档章节

TensorFlow学习系列(二):形状和动态维度

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:28
字数 1574
阅读 1
收藏 0
点赞 0
评论 0

这篇教程是翻译Morgan写的TensorFlow教程,作者已经授权翻译,这是原文


目录


TensorFlow学习系列(一):初识TensorFlow

TensorFlow学习系列(二):形状和动态维度

TensorFlow学习系列(三):保存/恢复和混合多个模型

TensorFlow学习系列(四):利用神经网络实现泛逼近器(universal approximator)

TensorFlow学习系列(五):如何使用队列和多线程优化输入管道


这篇教程主要去理解一些关于Tensorflow的维度形状概念,希望在后续的教程中能帮你节约调试程序的时间 :) 。

那么什么是张量呢?

简单的说,张量就是一个拥有 n 维度的数组,并且其中的值都拥有相同的类型,比如整型,浮点型,布尔型等等。

张量可以用我们所说的形状来描述:我们用列表(或元祖)来描述我们的张量的每个维度的大小,例如:

  • 一个 n 维度的张量可以表示为:(D_0, D_1, D_2, ..., D_n-1)

  • 一个 W x H 大小的张量(一般我们成为矩阵):(W, H)

  • 一个尺度是 W 的张量(一般我们称之为向量):(W, )

  • 一个简单的标量(或者与之等价的):()或者(1, )

注意: D_*,W,H 都是整型。

关于一维张量的一些注意:我们不可能通过观察 TF 中的矢量形状来确定矢量是行向量还是列向量。实际上这并不重要。有关更多信息,请查看这个Stackoverflow关于Numpy堆栈溢出的回答(这大致与TensorFlow表示法相同):

在 TF 中,一个张量如下表述:

my_tensor = tf.constant(0., shape=[6,3,7])
print(my_tensor) # -> Tensor("Const_1:0", shape=(6, 3, 7), dtype=float32)

我们可以发现,一个张量应该包含如下内容:

  • 一个名字,它用于键值对的存储,用于后续的检索:Const: 0

  • 一个形状描述, 描述数据的每一维度的元素个数:(6,3,7)

  • 数据类型,比如 float32

现在,我们来谈这篇文章的重点:TensorFlow中张量的两种形状!一种是静态形状,另一种是动态形状。

静态形状和动态形状


静态形状

静态维度是指当你在创建一个张量或者由操作推导出一个张量时,这个张量的维度是确定的。它是一个元祖或者列表。

TensorFlow将尽最大努力去猜测不同张量的形状(在不同操作之间),但是它不会总是能够做到这一点。特别是如果您开始用未知维度定义的占位符执行操作(例如,当你使用批操作时)。


要在代码中使用静态形状(访问/更改),你将使用Tensor本身的不同函数,并在名称中使用下划线:

注意:静态形状是非常有用的,特别是当你调试的时候,你可以使用 print 函数将张量形状进行打印,从而判断自己的设计是否正确。

动态形状

当你在运行你的图时,动态形状才是真正用到的。这种形状是一种描述原始张量在执行过程中的一种张量。

如果你定义了一个没有标明具体维度的占位符,即用None表示维度,那么当你将值输入到占位符时,这些无维度就是一个具体的值,并且任何一个依赖这个占位符的变量,都将使用这个值。


如果在代码中操作动态形状(访问/更改),你将使用主作用域中的不同函数,并且名称中没有下划线:

注意:当你要处理一些动态维度时,那么使用动态形状是非常方便的。

一个真实的使用案例:RNN

让我们需要去构建一个RNN时,我们将输入一个动态的形状,这个形状将去处理任何长度的输入数据。

在训练阶段,我们将使用动态占位符来定义批处理大小 batch_size
,然后我们使用 TensorFlow API 来创建一个 LSTM 网络。那么,你最终将得到如下这样的:

你现在需要去初始化一个状态,比如 init_state = cell.zero_state(batch_size, tf.float32) ...

但是,批处理大小 batch_size 具体应该等于多少呢?而且我们想要它是一个动态的数值,那么我们应该怎么选择呢?如果你阅读源码,那么就会发现 TensorFlow 允许很多不同的数据类型,如下:

Args:
      batch_size: int, float, or unit Tensor representing the batch size.

intfloat不能被使用,因为当你定义你的图时,你实际上是不知道 batch_size 的具体大小是多少的。这很重要。

最有意思的地方是最后一种类型: unit Tensor representing the batch size ,如果你在看原始文档,那么你会发现 unit Tensor 就是一个零维度的张量,也就是说,它就是一个标量。那么,你是怎么得到标量张量呢?

如果你在静态形状上尝试得到,你们如下:

my_tensor = tf.placeholder(tf.float32)
batch_size = my_tensor.get_shape()[0]  # Dimension(None)
print(batch_size)
# -> ?

batch_size 将返回 Dimension(None) 类型,即输出是 ? 。这个类型只能用作占位符的维度。

其实,你实际想做的是在图中使用这个动态参数 batch_size ,那么你必须使用动态形状,如下:

my_tensor = tf.placeholder(tf.float32)
batch_size = tf.shape(my_tensor)[0]  # <tf.Tensor 'strided_slice:0' shape=() dtype=int32>
print(batch_size)
# -> Tensor("strided_slice:0", shape=(), dtype=int32)

你看,此时 batch_size 在 TensorFlow 中是零维度的张量类型来描述的。

总结
  • 在调试时,使用静态形状

  • 除了调试,都是用动态形状,尤其是当你在吹未定义的维度时。

注意:在使用RNN API时,TensorFlow非常在意将初始状态设置为 zero_state ,但是为什么需要手动定义这种方式?不解。

你可能希望在运行图时,自己控制 init_state 的初始化状态。 那么你实际上可以使用 feed_dict 来为图中的任何变量提供初始变量,如下:

sess.run(encoder_final_state, feed_dict={
    my_placeholder: new_input,
    init_state: previous_encoder_final_state
})

现在,你可以动手写一下了。So easy!


References:

https://www.tensorflow.org/versions/r0.11/resources/faq.html

https://www.tensorflow.org/versions/r0.11/resources/dims_types.html

本文转载自:http://www.jianshu.com/p/7b3b40c30a5f

共有 人打赏支持
AllenOR灵感
粉丝 10
博文 2139
码字总数 82983
作品 0
程序员
tensorflow 一些概念

为什么 c = tf.matmul(a, b) 不立即执行矩阵相乘? 在 TensorFlow 的 Python API 中, a , b , and c 都是 Tensor 对象. 一个 Tensor 对象是一个操作(ope ration)结果的字符别名,它实际上并不...

阿豪boy ⋅ 2017/07/30 ⋅ 0

资源 | 概率编程工具:TensorFlow Probability官方简介

  选自Medium   作者:Josh Dillon、Mike Shwe、Dustin Tran   机器之心编译   参与:白妤昕、李泽南      在 2018 年 TensorFlow 开发者峰会上,谷歌发布了 TensorFlow Probabi...

机器之心 ⋅ 04/22 ⋅ 0

PaddleFluid和TensorFlow基本使用概念对比 | PaddlePaddle专栏

深度学习平台的演化 时至今日,深度学习已成为事实上最流行的机器学习技术。学术界多年研究加上工业界的长期实践提出了若干有效的基本建模单元:全连接,卷积,循环神经网络等;设计各类训练...

技术小能手 ⋅ 06/21 ⋅ 0

tensorflow学习笔记(第一天)-MNIST机器学习入门

MNIST机器学习入门 这个是关于tensorflow的中文文档:http://wiki.jikexueyuan.com/project/tensorflow-zh/tutorials/mnist_beginners.html MNIST是一个入门级的计算机视觉数据集,这个就相当...

a870542373 ⋅ 04/13 ⋅ 0

史上最全TensorFlow学习资源汇总

来源 悦动智能(公众号ID:aibbtcom) 本篇文章将为大家总结TensorFlow纯干货学习资源,非常适合新手学习,建议大家收藏。 ▌一 、TensorFlow教程资源 1)适合初学者的TensorFlow教程和代码示...

悦动智能 ⋅ 04/12 ⋅ 0

【干货】史上最全的Tensorflow学习资源汇总,速藏!

一 、Tensorflow教程资源: 1)适合初学者的Tensorflow教程和代码示例:(https://github.com/aymericdamien/TensorFlow-Examples)该教程不光提供了一些经典的数据集,更是从实现最简单的“Hel...

技术小能手 ⋅ 04/16 ⋅ 0

通过Python来学习人工智能!事半功倍!TensorFlow之入门篇!

     MNIST数据集介绍   MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:      MNIST数据集是含标注信息的,以上图片分别代表5, 0, 4和1。   MNIST数据集的官网...

中国机器人 ⋅ 06/21 ⋅ 0

TensorFlow入门系列——CNN小试牛刀

tensorflow 是 google 开源的机器学习工具,在2015年11月其实现正式开源,开源协议Apache 2.0。 Tensorflow特点 使用图 (graph) 来表示计算任务. 如图计算两个数之和的乘积(a+b)*(b+1) ...

qq_33414271 ⋅ 03/30 ⋅ 0

2018 AI、机器学习、深度学习与 Tensorflow 相关优秀书籍、课程、示例链接集锦

DataScienceAI Book Links | 机器学习、深度学习与自然语言处理领域推荐的书籍列表 人工智能、深度学习与 Tensorflow 相关书籍、课程、示例列表是笔者 Awesome Links 系列的一部分;对于其他...

王下邀月熊 ⋅ 05/21 ⋅ 0

《Scikit-Learn与TensorFlow机器学习实用指南》第9章 启动并运行TensorFlow

第9章 启动并运行TensorFlow 来源:ApacheCN《Sklearn 与 TensorFlow 机器学习实用指南》翻译项目 译者:@akonwang @WilsonQu 校对:@Lisanaaa @飞龙 TensorFlow 是一款用于数值计算的强大的...

apachecn_飞龙 ⋅ 04/23 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

SAS笔记-宏2

宏是一种文本,一般来说其编译是在程序执行之前。 宏变量的创建 %let语句 %let macro_variables = text; %let是常见的宏变量建立方式,其编译就在执行前。如下例中,想要宏变量test等于数据集...

tonorth123 ⋅ 9分钟前 ⋅ 0

如何使用serverchan微信推送告警

之前实现推送告警信息到微信的方法有如下几种: 1、通过企业公众号实现----收费: 2、通过QQ邮箱,在微信平台上开启收到邮件进行提醒; 3、第三方告警平台API,一般也是收费的; 不过最近看文...

问题终结者 ⋅ 36分钟前 ⋅ 0

TCP的RPC

RPC就是远程方法调用(Remote Process Call ),包含了客户端和服务端,涉及了对象的序列化传输。 1.服务端启动,注册远程调用的类2.客户端发送请求信息包含类、方法、参数的一些信息、序列化传...

Cobbage ⋅ 56分钟前 ⋅ 0

IOS-UI UI初步代码布局添加事件

ISO开发界面,UI是必须学习的一部分,其实很早之前想学来了,一直没有沉下心来学习。看到IOS的代码风格和布局就别扭的不行,跟java代码和android布局比较显得不是那么方便,所以一直到现在。...

京一 ⋅ 今天 ⋅ 0

浅谈OpenDaylight的二次开发

OpenDaylight作为一款开源SDN网络控制器,依托于强大的社区支持以及功能特性,成为了目前主流的SDN网络控制器开发平台。在比较稳定的OpenDaylight Helium版本中,已经为开发者提供了大量的网...

wangxuwei ⋅ 今天 ⋅ 0

API 开发中可选择传递 token 接口遇到的一个坑

在做 API 开发时,不可避免会涉及到登录验证,我使用的是jwt-auth 在登录中会经常遇到一个token过期的问题,在config/jwt.php默认设置中,这个过期时间是一个小时,不过为了安全也可以设置更...

等月人 ⋅ 今天 ⋅ 0

Java NIO之文件处理

程序要操作本地操作系统的一个文件,可以分为以下三个部分: 对文件位置的操作 对文件的操作 对文件内容的操作 其中,对文件内容的操作在 Java NIO之Channel 中已经有了介绍,通过FileChann...

士别三日 ⋅ 今天 ⋅ 0

Maven的pom.xml配置文件详解

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.......

小海bug ⋅ 今天 ⋅ 0

解决httpclient超时设置不生效的问题

最近公司有项目需要通过http调用第三方服务,且第三方服务偶有超时,故需要设置一定的超时时间防止不响应的情况出现。 初始设置如下: [java] view plain copy //超时设置 RequestConfig re...

Mr_Tea伯奕 ⋅ 今天 ⋅ 0

过滤器Filter和拦截器HandlerInterceptor

过滤器 依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要...

hutaishi ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部