Tensorflow1.14中placeholder.shape和tf.shape(placeholder)的区别
最近在看TensorFlow的代码,还是1.14版本的TensorFlow的,代码难度确实比pytorch的难上不是多少倍,pytorch的代码看一遍基本能看懂个差不多,TensorFlow的代码看一遍没懂,再看一遍还没懂,再看一遍呢,还没懂,不过这时候基本也就快崩溃了。
记录一个刚学到的TensorFlow的知识点,那就是对TensorFlow中的tensor取shape操作时需要注意的事项,也就是说有一个TensorFlow的tensor,它是由placeholder生成的,使用代码如下:
import tensorflow as tf
import numpy as np num_actions = 5 p=tf.placeholder(shape=(None, 4), dtype=np.int8)
batch_size = tf.shape(p)[0] random_actions = tf.random_uniform(tf.stack([batch_size]), minval=0, maxval=num_actions, dtype=tf.int64) with tf.Session() as sess:
print( sess.run(random_actions, {p:np.array([[1,1,1,1], [2,2,2,2], [3,3,3,3], [4,4,4,4]])}) )
执行后结果:



import tensorflow as tf
import numpy as np num_actions = 5 p=tf.placeholder(shape=(None, 4), dtype=np.int8)
# batch_size = tf.shape(p)[0]
batch_size = p.shape[0] random_actions = tf.random_uniform(tf.stack([batch_size]), minval=0, maxval=num_actions, dtype=tf.int64) with tf.Session() as sess:
print( sess.run(random_actions, {p:np.array([[1,1,1,1], [2,2,2,2], [3,3,3,3], [4,4,4,4]])}) )
执行结果:(报错)

两个代码的区别就是对于一个placeholder生成的tensor,对它取某个维度,如果它的某个维度在定义时并没有赋值,也就是使用了None数值来占位,那么再构建神经网络时用到了这个维度如果取这个维度是用tensorflow的函数来取和直接调用这个tensor的shape来取会有不同的效果的。
如果是使用TensorFlow的函数,tf.shape来取,这个维度及时没有赋值也是会一个TensorFlow的变量存在的:

可以知道取这个维度的变量本身也就是一个tensor变量,即时这个变量的数值并不清楚(因为它是由None占位生成的),这个tensor变量也是可以进行下一步操作的。
但是如果使用p.shape[0]的方式,那么取出的其实是一个python变量而不是tensor变量,而这个python变量内部存储的数值是None,而这个数值是不能参与TensorFlow中的神经网络构建的:

因此,上面的第二个代码运行时会报错。
==================================================================
修改代码:
import tensorflow as tf
import numpy as np num_actions = 5 p=tf.placeholder(shape=(None, 4), dtype=np.int8)
batch_size = tf.shape(p)[1] random_actions = tf.random_uniform(tf.stack([batch_size]), minval=0, maxval=num_actions, dtype=tf.int64) with tf.Session() as sess:
print( sess.run(random_actions, {p:np.array([[1,1,1,1], [2,2,2,2], [3,3,3,3], [4,4,4,4]])}) )
import tensorflow as tf
import numpy as np num_actions = 5 p=tf.placeholder(shape=(None, 4), dtype=np.int8)
# batch_size = tf.shape(p)[0]
# batch_size = p.shape[0]
batch_size = p.shape[1] random_actions = tf.random_uniform(tf.stack([batch_size]), minval=0, maxval=num_actions, dtype=tf.int64) with tf.Session() as sess:
print( sess.run(random_actions, {p:np.array([[1,1,1,1], [2,2,2,2], [3,3,3,3], [4,4,4,4]])}) )
上面的这两个代码均可以正常运行。
这说明python的数值是可以参与TensorFlow的神经网络构建的,只不过None是不可以参与TensorFlow的网络构建的,如果某个tensor的维度是由placeholder的None生成的,我们只能使用tf.shape的方式来取,这样取到的则为还没有赋值的tensor变量而不是None的python变量。
========================================
Tensorflow1.14中placeholder.shape和tf.shape(placeholder)的区别的更多相关文章
- tf.shape()
tf.shapetf.shape( input, name=None, out_type=tf.int32)12345例如:将矩阵的维度输出为一个维度矩阵import tensorflow as tf ...
- ArcGIS学习记录-Excel和Txt中XY点数据生成点Shape文件方法
(一)Excel中XY点数据生成点Shape文件方法 1.Excel表如下: 2.点击ArcGIS中的"+"号按钮,添加数据.选择第一步中制作好的Excel文件,点击Add按钮 ...
- tensorflow之tf.shape()
tf.shape()这个方法就相当于numpy当中shape属性. 下面通过列子来了解: 具体而言,tf.shape是用来获取张量的维度(shape).
- Tensorflow中的图(tf.Graph)和会话(tf.Session)详解
Tensorflow中的图(tf.Graph)和会话(tf.Session) Tensorflow编程系统 Tensorflow工具或者说深度学习本身就是一个连贯紧密的系统.一般的系统是一个自治独立的 ...
- faster-rcnn错误信息 : tensorflow.python.framework.errors_impl.InvalidArgumentError: Assign requires shapes of both tensors to match. lhs shape= [21] rhs shape= [2]
faster-rcnn错误信息 : tensorflow.python.framework.errors_impl.InvalidArgumentError: Assign requires shap ...
- HTML5之placeholder属性以及如何更改placeholder属性中文字颜色
今天在群里看到群友问了一个这样的问题,就是如何更改placeholder属性中文字的颜色,以前用过这属性,却是没更改过颜色,于是便试了试,中途遇到些问题,查找资料后特来总结一下. 熟悉HTML5的人应 ...
- 15、解决14中csv用excel打开乱码的问题 open('zhihu.csv','w',newline='',encoding='utf-8-sig')
解决14中csv用excel打开乱码的问题 ,其实就是在写csv的时候把 utf-8 改成 utf-8-sig open('zhihu.csv','w',newline='',encoding='ut ...
- 转: HTML5之placeholder属性以及如何更改placeholder属性中文字颜色
今天在群里看到群友问了一个这样的问题,就是如何更改placeholder属性中文字的颜色,以前用过这属性,却是没更改过颜色,于是便试了试,中途遇到些问题,查找资料后特来总结一下. 熟悉HTML5的人应 ...
- 在VMware 14中安装Centos7
在VMware 14中安装Centos7 一.安装前准备 安装VMware14.1 Centos7 64位镜像下载 在VMware中安装Centos7的步骤为: 1.创建虚拟机 创建虚拟机有两种方式: ...
- Ubuntu 14 中给 APACHE2安装 SSL 模块 Enable SSL site on Ubuntu 14 LTS, Apache 2.4.7:
Ubuntu 14 中给 APACHE2安装 SSL 模块 Enable SSL site on Ubuntu 14 LTS, Apache 2.4.7: 参考 http://blog.csdn.ne ...
随机推荐
- == 和 equals 的区别是什么
== : 它的作用是判断两个对象的地址是不是相等.即,判断两个对象是不是同一个对象.(基本数据类型 == 比较的是值,引用数据类型 == 比较的是内存地址) equals() : 它的作用也是判断两个 ...
- js沙雕排序之睡眠排序&随机排序
1.睡眠排序,只要睡的时间多少就可以排序出来不要在乎时间多少 var arr=[4,77,741,41,142,52,244]; var sleepSort=function(arr,callback ...
- 《最新出炉》系列入门篇-Python+Playwright自动化测试-51- 字符串操作 - 上篇
1.简介 在日常的自动化测试工作中进行断言的时候,我们可能经常遇到的场景.从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言.这个时候就需要我们对字符串进行操作,宏哥 ...
- new 和 delete 运算符
C++ 支持使用操作符 new 和 delete 来动态分配和释放对象. new 运算符调用特殊函数 operator new,delete 运算符调用特殊函数 operator delete. 如果 ...
- JAVA日期当天0点0分0秒
LocalDateTime LocalDateTime ldt = LocalDateTime.now(); LocalDateTime todayZero = LocalDateTime.of(ld ...
- SpringCloud开发之OpenFeign timeout和压缩等问题
在某些时候,我们希望某个同步调用执行更长的时间(异步暂时不考虑),这个时候,首先就是要设置OpenFeign的timeout设定. 下面我们举例来说明,可以如何设定TimeOut参数. 一.环境 脱离 ...
- Salt安装部署
Salt安装部署 一:salt简介 早期运维人员会根据自己的生产环境来写特定脚本完成大量重复性工作,这些脚本复杂且难以维护.系统管理员面临的问题主要是1.系统配置管理,2.远程执行命令,因此诞生了 ...
- Spark3学习【基于Java】1. Spark-Sql入门程序
spark-sql是用来处理结构化数据的模块,是入门spark的首要模块. 技术的学习无非就是去了解它的API,但是Spark有点难,因为它的例子和网上能搜到的基本都是Scala写的.我们这里使用Ja ...
- 3款C#开源且实用的工具类库,工作效率提升利器!
前言 在日常工作开发中工具类库是软件开发中不可或缺的一部分,它们通过提供代码重用.通用功能.隐藏复杂性.提高代码质量.扩展性等方面的优势,帮助开发者更高效.更稳定地构建软件应用程序.今天大姚给大家分享 ...
- 典型性相关分析在SPSS中的实现
典型性相关分析是研究两组变量(每组变量中都可能有多个指标)之间相关关系的一种多元统计方法.它能够揭示出两组变量之间的内在联系. 本文着重模型在spss中的应用,通过一道例题解释各个指标的意义.详细推导 ...