Keras:构造一个与给定张量具有相同批量大小的完整张量

Posted

技术标签:

【中文标题】Keras:构造一个与给定张量具有相同批量大小的完整张量【英文标题】:Keras: Construct a full tensor of the same batch size as a given tensor 【发布时间】:2019-01-18 09:21:16 【问题描述】:

更新

sdcbr 在他们的回答中指出,K.ones_like(T)*a 用于生成与上面指定的张量类似的张量,关键是它具有正确的batch_size。为了澄清另一个例子,我需要的另一个张量看起来像

C = [ [a1 a2 ... an]
      [a1 a2 ... an]
      ...
      [a1 a2 ... an] ]

这里的情况是给定向量 [a1 a2 ... an] 与自身连接以返回具有与 T 相同的 batch_size 的张量。

原始问题

我正在寻找一种在 Keras 中构造张量的方法,该张量与另一个张量 T 具有相同的 batch_size。一个例子是

A = [ [a a ... a a]
      [a a ... a a]
      ...
      [a a ... a a] ]

a 在第二个昏暗处重复 n 次,在第一个昏暗处重复 batch_size(T)

如果T 定义了batch_size,那么下面的sn-p 就可以了

A = K.constant(np.array([[a]*n]*T.shape[0]))

但是,如果 T 是占位符,则 T.shape[0]None。可以将张量作为输入提供,但这似乎不优雅,并且为用户错误留下了更多空间。

我将如何生成这种形式的张量?

【问题讨论】:

也许您将 batch_size 与张量第一形状混淆为概念?因为它们本质上不同,所以张量没有任何 batch_size。能说清楚点吗? 确实,我可能将两者混为一谈。对于 keras 实际如何处理批处理,我不太了解。 【参考方案1】:

你可以使用K.ones_like(T)之类的东西吗?不管你怎么做,TA 的形状只有在你向T 喂东西时才会完全指定。

类似这样的:

import keras.backend as K
import numpy as np

K.clear_session()
T = K.placeholder((None, 100))
A = K.ones_like(T)*5

with K.get_session() as sess:
    print(A.eval(feed_dict=T: np.random.rand(1, 100)))

产生:

[[5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5.
  5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5.
  5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5.
  5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5. 5.
  5. 5. 5. 5.]]

如果您希望A 的行被[0,1,...n-1] 填充,n 的列数为T 的列数,您可以使用tf.multiply 进行逐元素乘法。

import keras.backend as K
import tensorflow as tf
import numpy as np

K.clear_session()
T = K.placeholder((None, 100))
A = tf.multiply(K.ones_like(T), K.constant(list(range(T.shape[1]))))

with K.get_session() as sess:
    print(A.eval(feed_dict=T: np.random.rand(1, 100)))

会给你

[[ 0.  1.  2.  3.  4.  5.  6.  7.  8.  9. 10. 11. 12. 13. 14. 15. 16. 17.
  18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.
  36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53.
  54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71.
  72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89.
  90. 91. 92. 93. 94. 95. 96. 97. 98. 99.]]

【讨论】:

谢谢,这是一个非常好的开始!但是,我需要能够更进一步,因为最终行将需要为[0 1 2 ... n]。我会更新问题。 更新了我的答案。 这太完美了!感谢您的帮助。【参考方案2】:

对上述解决方案的小补充。如果使用 keras,您需要将 tf 操作包装到 Lambda 层中,否则在尝试创建模型时会出现错误 - 例如断开连接的图。所以代码会是这样的

import tensorflow as tf
import tensorflow.keras as keras
from tensorflow.keras.layers import Input, Lambda
from tensorflow.keras.models import Model

dim1 = ...

T = Input(size=(dim1,))
A = Lambda(lambda x: tf.multiply(tf.ones_like(x,dtype='int32'), tf.constant(list(range(dim1)))))(T)

out=Other_Layers(A,T)
model = Model(inputs=[T],outputs=[out])

【讨论】:

以上是关于Keras:构造一个与给定张量具有相同批量大小的完整张量的主要内容,如果未能解决你的问题,请参考以下文章

Keras中的特征缩放和移位(FiLM层)

如何在 Keras / Tensorflow 中将(无,)批量维度重新引入张量?

Keras 张量 - 使用来自另一个张量的索引获取值

在 Keras 中使用 `predict` 以与给定相同的顺序预测一维数组

在 Keras 中,如何任意调整一维张量的大小?

keras lstm 区别 stateless 和 stateful