Python Keras:构造一个与给定张量具有相同批量大小的完整张量
更新 sdcbr在其回答中指出,Python Keras:构造一个与给定张量具有相同批量大小的完整张量,python,keras,tensor,Python,Keras,Tensor,更新 sdcbr在其回答中指出,K.ones_like(T)*a用于生成类似于上述规定的张量,关键点在于它具有正确的批量大小。用另一个例子来说明,我需要的另一个张量如下 C = [ [a1 a2 ... an] [a1 a2 ... an] ... [a1 a2 ... an] ] 这里的情况是,给定的向量[a1a2…an]与其自身连接,以返回一个与T具有相同batch\u大小的张量 原始问题 我正在寻找一种方法来构造Keras中的张量,该张量具有与另一张量
K.ones_like(T)*a
用于生成类似于上述规定的张量,关键点在于它具有正确的批量大小。用另一个例子来说明,我需要的另一个张量如下
C = [ [a1 a2 ... an]
[a1 a2 ... an]
...
[a1 a2 ... an] ]
这里的情况是,给定的向量[a1a2…an]
与其自身连接,以返回一个与T
具有相同batch\u大小的张量
原始问题
我正在寻找一种方法来构造Keras中的张量,该张量具有与另一张量T
相同的batch\u大小。例如
A = [ [a a ... a a]
[a a ... a a]
...
[a a ... a a] ]
其中,a
在第二个dim中重复n
次,在第一个dim中重复batch\u size(T)
如果T
定义了batch\u size
,那么下面的代码段就可以正常工作
A = K.constant(np.array([[a]*n]*T.shape[0]))
但是,如果T
是占位符,则T.shape[0]
是None
。将张量作为输入是可能的,但这似乎不雅观,给用户错误留下了更多的空间
我该如何生成这种形式的张量呢?你可以使用类似于K.ones\u 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])
也许你把批量大小和张量第一形状混淆了,作为概念?因为张量的性质不同,所以张量没有任何批量大小。你能说得更清楚一点吗?事实上,我可能把两者混淆了。对于keras如何处理批处理,我没有很好的直觉。谢谢,这是一个非常好的开始!但是,我需要能够更进一步,因为最终需要将行设置为[0 1 2…n]
。我会更新问题。更新我的答案。这太完美了!谢谢你的帮助。