【问题标题】:create a tensor with bigger shape with each value of a tensor with smaller shape使用具有较小形状的张量的每个值创建一个具有较大形状的张量
【发布时间】:2019-03-20 14:41:29
【问题描述】:

我有一个形状为 (1,4,4,1) 的张量,我想重复每个像素的值并将形状增加到 (1,28,28,1)。我想在每个维度上重复它。例如,如果它的第一个像素为 0,则生成一个形状为 (28,28,1) 且值为 0 的新张量,依此类推。我该怎么做?我感谢您的帮助。我需要像下面的代码一样在索引 i,j 中选择 wtm 的值,然后生成一个具有该值和形状 (1,28,28,1) 的新张量。 假设 wtm 是:

0 1 1 0
0 0 0 1
1 0 1 0 
1 1 0 1

现在我需要知道 wtm (i,j) 是什么,然后用这个值生成一个新的张量。如果 wtm(i,j)=1 新张量是:

1 1 1 ... 1
1 1 1 ... 1
.    ...  1
.    ...  1
1 1 1 ... 1

wtm=Input((28,28,1))
image = Input((28, 28, 1))
conv1 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl1e',dilation_rate=(2,2))(image)
conv2 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl2e',dilation_rate=(2,2))(conv1)
conv3 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl3e',dilation_rate=(2,2))(conv2)
BN=BatchNormalization()(conv3)
encoded =  Conv2D(1, (5, 5), activation='relu', padding='same',name='encoded_I',dilation_rate=(2,2))(BN)

#-----------------------adding w---------------------------------------   

wfill=Kr.layers.Lambda(lambda x:tf.fill([28,28],x))
wtm_Fill=wfill(wtm(i,j))
add_const = Kr.layers.Lambda(lambda x: x[0] + x[1])
encoded_merged = add_const([encoded,wtm_Fill])

【问题讨论】:

  • 您能否提供更具体的所需输出示例?我有一个解决方案,但不确定您需要什么
  • 我把代码放在这里,我需要像这样在代码中选择 wtm 的特定索引,然后用这个值生成一个形状为 (1,28,28,1) 的新张量。但我不知道如何用张量做到这一点:((

标签: python tensorflow keras


【解决方案1】:

也许tf.tile 会适合。它只是复制张量定义次数的指定维度。

array = np.random.random_integers(0,1, (1, 4, 4, 1))
tensor = tf.convert_to_tensor(array)
expanded_array = tf.tile(tensor, [1,7,7,1])

因此,如果输入数组的一维是[1,1,0,0],那么在用tf.tile 填充后,它将看起来像长度为28 的[1,1,0,0,1,1,0,0...]

编辑: TensorFlow 支持张量索引的方式与 numpy 相同。所以你可以对张量进行切片

slice = tensor[0,:,:]

得到形状[4,4,1] 如果您只需要选择一个特定值,则可以使用tf.fill 而不是tile

要从数组中获取特定值,您需要提供 n 个索引,其中 n 是维数。要获取 3 维数组中的第一个元素,例如 (28,28,1),您需要 array[0][0][0]

https://www.tensorflow.org/api_docs/python/tf/tile

【讨论】:

  • 这个平铺输入,但我需要像提到的例子一样的东西。你能考虑一下我放在这里的例子吗?
  • 对不起,我是初学者。例如,如果我需要 wtm (0,0) 我可以使用 wtm[0,0,0]?
  • 例如,当我使用这个 wfill=Kr.layers.Lambda(lambda x:tf.fill([28,28],x)) wtm_Fill=wfill(wtm[:,0,0 ,:])。它会产生此错误形状必须为 0 级,但对于输入形状为 [2]、[?,1] 的“lambda_16/Fill”(操作:“填充”)为 2 级。
  • 更新了答案,也请看docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.htmlTensorFlow中也一样
  • 我看不懂:(我用过这个 wtm[0,0,:] 但它产生了同样的错误。如果你想做我放在这里的代码你怎么写?
猜你喜欢
  • 2019-07-21
  • 2017-08-17
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 2019-06-03
  • 1970-01-01
  • 2022-11-10
  • 2018-04-24
相关资源
最近更新 更多