gpt4 book ai didi

python - TensorFlow - 从模板中创建张量

转载 作者:太空宇宙 更新时间:2023-11-03 20:15:26 26 4
gpt4 key购买 nike

在搜索此问题时,我尚未找到相关的内容,因此如果类似的内容已经存在,请告诉我。

所以问题就在这里。想象一下,您有一个模板张量 A,其中包含 B 列的非零值。现在我想生成一个张量 B 在正确的位置包含 A 的值。 A 应为暗淡 (n,3),B 应为暗淡 (2n+1,n)。不同的维度源自不同的有限元网格。例如,让 n=3 表示我们有 A

A = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

并且想要从A创建一个张量B,例如

B[0,0]=A[0,0],B[1,0]=A[0,1],B[2,0]=A[0,2],B[2,1] ]=A[1,0], B[3,1]=A[1,1], B[4,1]=A[1,2], B[4,2]=A[2,0] ,B[5,2]=A[2,1]且B[6,2]=A[2,2]。

例如,B 就是

B = [[1, 0, 0], [2, 0, 0], [3, 4, 0], [0, 5, 0], [0, 6, 7], [0, 0, 8], [0, 0, 9]].

此外,如果可能的话,这需要是可微分的。因为我想将张量 A 训练为某些参数,但使用 B 来计算损失函数的矩阵向量乘积。我目前不会使用批量学习。

我尝试使用 tf.assign()函数为张量分配每个值B。我正在寻找更好的选择,因为对于大张量来说这变得非常困惑,并且您必须在设置值之前运行 tf.assign() 操作。

在 numpy 中我会简单地做类似的事情

import numpy as np
A = np.array([[1,2,3],[4,5,6],[7,8,9]])
B = np.zeros((7,3))
for i in range(3):
B[2*i:2*i+3,i] = A[i,:]

在 Tensorflow 中是否有一些类似甚至更简单的方法可以做到这一点,并且操作仍然可微分?

最佳答案

您可以使用 tf.scatter_nd 来做到这一点像这样(函数适用于 TF 1.x 和 2.x):

import tensorflow as tf

def make_tensor(a):
a = tf.convert_to_tensor(a)
s = tf.shape(a)
n = s[0]
m = s[1]
out_shape = [1 + (m - 1) * n, n]
r = tf.expand_dims(tf.range(n), 1)
idx_row = r * (m - 1) + tf.range(m)
idx_col = tf.tile(r, [1, m])
return tf.scatter_nd(tf.stack([idx_row, idx_col], axis=-1), a, out_shape)

print(make_tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]]).numpy())
# [[1 0 0]
# [2 0 0]
# [3 4 0]
# [0 5 0]
# [0 6 7]
# [0 0 8]
# [0 0 9]]

编辑:如果需要,您可以稍微修改上面的函数来选择列之间应该有多少重叠:

import tensorflow as tf

def make_tensor(a, overlap=1):
s = tf.shape(a)
n = s[0]
m = s[1]
m2 = m - overlap
out_shape = [overlap + m2 * n, n]
r = tf.expand_dims(tf.range(n), 1)
idx_row = r * m2 + tf.range(m)
idx_col = tf.tile(r, [1, m])
return tf.scatter_nd(tf.stack([idx_row, idx_col], axis=-1), a, out_shape)

a = tf.constant([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(make_tensor(a).numpy())
# [[1 0 0]
# [2 0 0]
# [3 4 0]
# [0 5 0]
# [0 6 7]
# [0 0 8]
# [0 0 9]]
print(make_tensor(a, overlap=2).numpy())
# [[1 0 0]
# [2 4 0]
# [3 5 7]
# [0 6 8]
# [0 0 9]]
print(make_tensor(a, overlap=3).numpy())
# [[1 4 7]
# [2 5 8]
# [3 6 9]]

顺便说一句,这允许您不重叠甚至负重叠:

print(make_tensor(a, overlap=0).numpy())
# [[1 0 0]
# [2 0 0]
# [3 0 0]
# [0 4 0]
# [0 5 0]
# [0 6 0]
# [0 0 7]
# [0 0 8]
# [0 0 9]]
print(make_tensor(a, overlap=-1).numpy())
# [[1 0 0]
# [2 0 0]
# [3 0 0]
# [0 0 0]
# [0 4 0]
# [0 5 0]
# [0 6 0]
# [0 0 0]
# [0 0 7]
# [0 0 8]
# [0 0 9]]

关于python - TensorFlow - 从模板中创建张量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58476716/

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