Keras:构建与给定张量相同批量大小的完整张量
Keras: Construct a full tensor of the same batch size as a given tensor
更新
sdcbr 在他们的回答中指出 K.ones_like(T)*a
用于生成与上面指定的类似的张量,关键是它具有正确的 batch_size
。为了澄清另一个例子,我需要的另一个张量看起来像
C = [ [a1 a2 ... an]
[a1 a2 ... an]
...
[a1 a2 ... an] ]
这里的情况是给定向量 [a1 a2 ... an]
与自身连接成 return 一个张量,该张量具有与 T
相同的 batch_size
。
原题
我正在寻找一种在 Keras 中构建张量的方法,该张量具有与另一个张量 T
相同的 batch_size
。一个例子是
A = [ [a a ... a a]
[a a ... a a]
...
[a a ... a a] ]
其中 a
在第二个 dim 中重复 n
次,在第一个 dim 中重复 batch_size(T)
次。
如果 T
定义了 batch_size
,那么下面的代码片段就可以正常工作
A = K.constant(np.array([[a]*n]*T.shape[0]))
但是,如果 T
是占位符,那么 T.shape[0]
就是 None
。可以将张量作为输入输入,但这似乎不够优雅,并且为用户错误留下了更多空间。
我将如何生成这种形式的张量?
您可以使用 K.ones_like(T)
之类的东西吗?不管你怎么做,T
和 A
的形状只有在你给 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.]]
上述解决方案的小补充。如果使用 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])
更新
sdcbr 在他们的回答中指出 K.ones_like(T)*a
用于生成与上面指定的类似的张量,关键是它具有正确的 batch_size
。为了澄清另一个例子,我需要的另一个张量看起来像
C = [ [a1 a2 ... an]
[a1 a2 ... an]
...
[a1 a2 ... an] ]
这里的情况是给定向量 [a1 a2 ... an]
与自身连接成 return 一个张量,该张量具有与 T
相同的 batch_size
。
原题
我正在寻找一种在 Keras 中构建张量的方法,该张量具有与另一个张量 T
相同的 batch_size
。一个例子是
A = [ [a a ... a a]
[a a ... a a]
...
[a a ... a a] ]
其中 a
在第二个 dim 中重复 n
次,在第一个 dim 中重复 batch_size(T)
次。
如果 T
定义了 batch_size
,那么下面的代码片段就可以正常工作
A = K.constant(np.array([[a]*n]*T.shape[0]))
但是,如果 T
是占位符,那么 T.shape[0]
就是 None
。可以将张量作为输入输入,但这似乎不够优雅,并且为用户错误留下了更多空间。
我将如何生成这种形式的张量?
您可以使用 K.ones_like(T)
之类的东西吗?不管你怎么做,T
和 A
的形状只有在你给 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.]]
上述解决方案的小补充。如果使用 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])