- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
看代码:
import tensorflow as tf
import numpy as np
elems = tf.ones([1,2,3],dtype=tf.int64)
alternates = tf.map_fn(lambda x: (x, x, x), elems, dtype=(tf.int64, tf.int64, tf.int64))
with tf.Session() as sess:
print(sess.run(alternates))
输出为:
(array([[[1, 1, 1],
[1, 1, 1]]], dtype=int64), array([[[1, 1, 1],
[1, 1, 1]]], dtype=int64), array([[[1, 1, 1],
[1, 1, 1]]], dtype=int64))
我看不懂输出,谁能告诉我?
elems
是一个张量,所以它应该沿着 axis-0 解包,我们会得到 [[1,1,1],[1,1,1]]
,然后 map_fn
将 [[1,1,1],[1,1,1]]
传递给 lambda x:(x,x ,x)
,这意味着x=[[1,1,1],[1,1,1]]
,我认为map_fn
的输出> 是
[[[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1]],
[[1,1,1],[1,1,1]]]
输出的形状为[3,2,3]
或shape(2,3)
列表
但实际上,输出是一个张量列表,每个张量的形状为[1,2,3]
。
或者换句话说:
import tensorflow as tf
import numpy as np
elems = tf.constant([1,2,3],dtype=tf.int64)
alternates = tf.map_fn(lambda x: (x, 2*x, -x), elems, dtype=(tf.int64, tf.int64, tf.int64))
with tf.Session() as sess:
print(sess.run(alternates))
为什么输出是
(array([1, 2, 3], dtype=int64),
array([2, 4, 6], dtype=int64),
array([-1, -2, -3], dtype=int64))
而不是
(array([1, 2, -1], dtype=int64),
array([2, 4, -2], dtype=int64),
array([3, 6, -3], dtype=int64))
这两个问题是一样的。
import tensorflow as tf
import numpy as np
elems = [tf.constant([1,2,3],dtype=tf.int64)]
alternates = tf.map_fn(lambda x: x, elems, dtype=tf.int64)
with tf.Session() as sess:
print(sess.run(alternates))
elems
是张量列表,因此根据 api,tf.constant([1,2,3],dtype=tf.int64)
将被解包沿 axis-0,因此 map_fn
将用作 [x for x in [1,2,3]]
,但实际上它会引发错误。
ValueError: The two structures don't have the same nested structure. First struc
ture: <dtype: 'int64'>, second structure: [<tf.Tensor 'map/while/TensorArrayRead
V3:0' shape=() dtype=int64>].
出了什么问题?
import tensorflow as tf
import numpy as np
elems = (tf.constant([1,2,3],dtype=tf.int64),tf.constant([1,2,3],dtype=tf.int64))
alternates = tf.map_fn(lambda x: x, elems, dtype=(tf.int64, tf.int64))
with tf.Session() as sess:
print(sess.run(alternates))
输出为
(array([1, 2, 3], dtype=int64), array([1, 2, 3], dtype=int64))
看起来 elems 没有解压,为什么?
import tensorflow as tf
import numpy as np
elems = (tf.constant([1,2,3],dtype=tf.int64),tf.constant([1,2,3],dtype=tf.int64))
alternates = tf.map_fn(lambda x: [x], elems, dtype=(tf.int64, tf.int64))
with tf.Session() as sess:
print(sess.run(alternates))
它会引发错误
TypeError: The two structures don't have the same sequence type. First structure
has type <class 'tuple'>, while second structure has type <class 'list'>.
谁能告诉我 tf.map_fn 是如何工作的?
最佳答案
首先,
elems = tf.ones([1,2,3],dtype=tf.int64)
elems
是一个形状为 1x2x3 的 3 维张量,即:
[[[1, 1, 1],
[1, 1, 1]]]
那么,
alternates = tf.map_fn(lambda x: (x, x, x), elems, dtype=(tf.int64, tf.int64, tf.int64))
alternates
是一个由三个张量组成的元组,其形状与 elems
相同,每个张量都是根据给定的函数构建的。由于该函数只是返回一个重复输入三次的元组,这意味着三个张量将与 elems 相同。如果函数是 lambda x: (x, 2 * x, -x) ,那么第一个输出张量将与 elems 相同,第二个输出张量将是elems
而第三个则相反。
在所有这些情况下,最好使用常规操作而不是 tf.map_fn
;但是,在某些情况下,您可能有一个接受 N 维度张量的函数,并且您希望将其应用到一个 N + 1 维度的张量。
更新:
我认为您正在考虑tf.map_fn
可以这么说,“反过来”。张量中的元素或行数与函数中的输出数之间不存在一一对应的关系;事实上,您可以传递一个返回包含任意数量元素的元组的函数。
以最后一个例子为例:
elems = tf.constant([1,2,3],dtype=tf.int64)
alternates = tf.map_fn(lambda x: (x, 2*x, -x), elems, dtype=(tf.int64, tf.int64, tf.int64))
tf.map_fn
首先在第一个轴上拆分 elems
,即分为 1
、2
和 3
,并将函数应用到他们每个人都得到:
(1, 2, -1)
(2, 4, -2)
(3, 6, -3)
请注意,正如我所说,每个元组都可以包含您想要的任意数量的元素。现在,最终输出是通过将结果连接到相同位置而产生的;所以你得到:
[1, 2, 3]
[2, 4, 6]
[-1, -2, -3]
同样,如果函数生成包含更多元素的元组,您将获得更多输出张量。
更新 2:
关于您的新示例:
import tensorflow as tf
import numpy as np
elems = (tf.constant([1,2,3],dtype=tf.int64),tf.constant([1,2,3],dtype=tf.int64))
alternates = tf.map_fn(lambda x: x, elems, dtype=(tf.int64, tf.int64))
with tf.Session() as sess:
print(sess.run(alternates))
This method also allows multi-arity elems and output of fn. If elems is a (possibly nested) list or tuple of tensors, then each of these tensors must have a matching first (unpack) dimension. The signature of fn may match the structure of elems. That is, if elems is (t1, [t2, t3, [t4, t5]]), then an appropriate signature for fn is: fn = lambda (t1, [t2, t3, [t4, t5]]):.
此处 elems 是根据需要在第一维中具有相同大小的两个张量的元组。 tf.map_fn
一次获取每个输入张量的一个元素(即两个元素的元组)并将给定函数应用于它,这应该返回与您在 dtypes 中传递的相同结构(两个元素的元组) , 也);如果您没有给出dtypes
,则预期输出与输入相同(同样,两个元素的元组,因此在您的情况下dtypes
是可选的) 。无论如何,事情是这样的:
f((1, 1)) -> (1, 1)
f((2, 2)) -> (2, 2)
f((3, 3)) -> (3, 3)
这些结果被组合起来,连接结构中所有相应的元素;在这种情况下,第一个位置中的所有数字产生第一个输出,第二个位置中的所有数字产生第二个输出。最后,结果是所请求的结构(二元素元组)充满了这些串联:
([1, 2, 3], [1, 2, 3])
关于tensorflow - 如何解释tf.map_fn的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46096767/
我在一个项目中工作,该项目需要 SQL 结果的最佳性能,并且希望优化查询,但经过反复试验后,我在 IN 方面遇到了一些问题。 -- THIS RETURNS NO RESULTS AT ALL. SE
在尝试创建一个实际上非常简单的 SQL 语句时,我发现自己迷失了方向。 我有一个包含 3 个表的数据库: 食谱 - 存储一些用于 cooking 的食谱名称 配料食谱 - 将配料与食谱链接 成分 -
我正在尝试理解 PHP 中的 Hebrev 函数。 https://php.net/manual/en/function.hebrevc.php 它说:“将逻辑希伯来语文本转换为视觉文本”。但我不明白
嗨,我在 Grid view 的 android 文档中发现了一段代码对于以下代码。 gridview.setOnItemClickListener(new OnItemClickListener()
谁能解释一下 InfiniBand 是什么?与以太网相比的主要区别是什么,这些差异如何使其比以太网更快? 在官方description从 mellanox 写到 Introduce InfiniBan
这个问题已经有答案了: How are java increment statements evaluated in complex expressions (1 个回答) 已关闭 8 年前。 我知道
我正在阅读 MySQL 教程,我遇到了这个: SELECT /*! SQL_NO_CACHE */ user FROM users; 为什么优化提示 SQL_NO_CACHE 包含在: /*!
我无法理解$(this),我做了一个剪刀石头布的版本,并应用了 jQuery 让用户在计算机上选择按钮选项。我希望有人能解释一下 $(this) 指的是什么,它是 btn-primary 吗?该函数在
我不是很确定 while(choice == 1 || choice ==2);谁能解释一下。我明白这一点 if(choice ==1) displayMonthly(rainfall); e
let flyRight = CABasicAnimation(keyPath: "position.x") flyRight.toValue = view.bounds.size.width/2 f
目录 解释:int型默认值为0 但我们尝试发现并不能通过: 原因: int的默认值为0,而Integer的默认值为null
我正在处理一个查询,自从一个 SSRS 服务器传输到另一个服务器后,它似乎没有按预期执行,并且 where 语句的一部分中出现了以下行 找出不同之处,或者至少从我能找到的地方来看。 where COA
我正在制作一个退回检测程序,读取退回邮件。我们的设置是发送电子邮件,在发送的邮件中添加一个 noreply@domain.tl。一些收件人不再存在,因此我们想要读取退回邮件,并检测它发送给谁。我已经崩
我有一个关于公式通过控制点弯曲的问题。 如您所知,HTML Canvas 有 quadraticCurveTo(x1, y1, x2, y2)与 x1 and x2作为控制点。 但是,当您尝试使用它绘
我有一个 Emakefile看起来像: %% -- %% %% -- {'/Users/user/projects/custom_test/trunk/*', [debug_info, {out
我有一个非常简单的问题。这不仅适用于 spray-json,而且我已经阅读了 argonaut 和 circe 的类似声明。所以请赐教。 在 spray-json 中,我遇到了 There is no
我正在为视频添加水印。我试图让水印与视频尺寸成比例。我已经使用 scale2ref 看到了十几个不同的答案,但没有解释实际发生了什么,所以我发现很难知道如何实现/更改配置以适应我的情况。 当前覆盖命令
因为我正在学习语言,所以我在玩 Haskell,我只是发现了一些我不理解的东西,我找不到解释。如果我尝试运行此代码: map (`div` 0) [1,2,3,4] 我得到一个除以 0 的异常,这是预
我正在寻找解决错误对象引用未设置到对象实例的步骤/指南。以及问题发生原因的解释。 我正在寻找更一般的解释,所以如果我收到错误,我应该采取什么步骤来查找问题。我经常看到有人提供特定代码段的帖子,而其他人
我最近想升级我的知识React ,所以我从组件生命周期方法开始。让我好奇的第一件事是这个componentWillReceiveProps .所以,文档说当组件接收新的(不一定是更新的) Prop 时
我是一名优秀的程序员,十分优秀!