gpt4 book ai didi

python-3.x - 使用第二个张量值循环张量维度 0 (NoneType)

转载 作者:行者123 更新时间:2023-12-03 23:20:32 27 4
gpt4 key购买 nike

我有一个张量 a,我想根据另一个张量 l 遍历行和索引值。即 l 表示我需要的向量的长度。

sess = tf.InteractiveSession()

a = tf.constant(np.random.rand(3,4)) # shape=(3,4)
a.eval()

Out:
array([[0.35879311, 0.35347166, 0.31525201, 0.24089784],
[0.47296348, 0.96773956, 0.61336239, 0.6093023 ],
[0.42492552, 0.2556728 , 0.86135674, 0.86679779]])

l = tf.constant(np.array([3,2,4])) # shape=(3,)
l.eval()

Out:
array([3, 2, 4])

预期输出:

[array([0.35879311, 0.35347166, 0.31525201]),
array([0.47296348, 0.96773956]),
array([0.42492552, 0.2556728 , 0.86135674, 0.86679779])]

棘手的部分是 a 可以将 None 作为第一个维度,因为它通常是通过占位符定义为批量大小的。

我不能只使用下面的掩码和条件,因为我需要单独计算每一行的方差。

condition = tf.sequence_mask(l, tf.reduce_max(l))
a_true = tf.boolean_mask(a, condition)
a_true

Out:
array([0.35879311, 0.35347166, 0.31525201, 0.47296348, 0.96773956,
0.42492552, 0.2556728 , 0.86135674, 0.86679779])

我也尝试过使用 tf.map_fn 但无法正常工作。

elems = (a, l)
tf.map_fn(lambda x: x[0][:x[1]], elems)

任何帮助将不胜感激!

最佳答案

TensorArray 对象可以存储不同形状的张量。然而,它仍然不是那么简单。看看这个例子,它使用 tf.while_loop()tf.TensorArraytf.slice() 函数来做你想做的事:

import tensorflow as tf
import numpy as np

batch_data = np.array([[0.35879311, 0.35347166, 0.31525201, 0.24089784],
[0.47296348, 0.96773956, 0.61336239, 0.6093023 ],
[0.42492552, 0.2556728 , 0.86135674, 0.86679779]])
batch_idx = np.array([3, 2, 4]).reshape(-1, 1)

x = tf.placeholder(tf.float32, shape=(None, 4))
idx = tf.placeholder(tf.int32, shape=(None, 1))

n_items = tf.shape(x)[0]
init_ary = tf.TensorArray(dtype=tf.float32,
size=n_items,
infer_shape=False)
def _first_n(i, ta):
ta = ta.write(i, tf.slice(input_=x[i],
begin=tf.convert_to_tensor([0], tf.int32),
size=idx[i]))
return i+1, ta

_, first_n = tf.while_loop(lambda i, ta: i < n_items,
_first_n,
[0, init_ary])
first_n = [first_n.read(i) # <-- extracts the tensors
for i in range(batch_data.shape[0])] # that you're looking for

with tf.Session() as sess:
res = sess.run(first_n, feed_dict={x:batch_data, idx:batch_idx})
print(res)
# [array([0.3587931 , 0.35347167, 0.315252 ], dtype=float32),
# array([0.47296348, 0.9677396 ], dtype=float32),
# array([0.4249255 , 0.2556728 , 0.86135674, 0.8667978 ], dtype=float32)]

注意

  • 我们仍然必须使用 batch_size 使用 read()< 从 first_n TensorArray 中一个一个地提取元素 方法。我们不能使用任何其他返回 Tensor 的方法,因为我们有不同大小的行(TensorArray.concat 方法除外,但它将返回一维堆叠的所有元素)。

  • 如果 TensorArray 的元素少于您传递给 TensorArray.read(index) 的索引,您将得到 InvalidArgumentError

  • 您不能使用 tf.map_fn,因为它返回的张量必须具有相同形状的所有元素。

如果您只需要计算每行前 n 元素的方差(无需实际将不同大小的元素聚集在一起),则任务会更简单。在这种情况下,我们可以直接计算切片张量的方差,将其放入 TensorArray,然后将其堆叠到张量:

n_items = tf.shape(x)[0]
init_ary = tf.TensorArray(dtype=tf.float32,
size=n_items,
infer_shape=False)
def _variances(i, ta, begin=tf.convert_to_tensor([0], tf.int32)):
mean, varian = tf.nn.moments(
tf.slice(input_=x[i], begin=begin, size=idx[i]),
axes=[0]) # <-- compute variance
ta = ta.write(i, varian) # <-- write variance of each row to `TensorArray`
return i+1, ta


_, variances = tf.while_loop(lambda i, ta: i < n_items,
_variances,
[ 0, init_ary])
variances = variances.stack() # <-- read from `TensorArray` to `Tensor`
with tf.Session() as sess:
res = sess.run(variances, feed_dict={x:batch_data, idx:batch_idx})
print(res) # [0.0003761 0.06120085 0.07217039]

关于python-3.x - 使用第二个张量值循环张量维度 0 (NoneType),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55677827/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com