Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Keras:构造一个与给定张量具有相同批量大小的完整张量_Python_Keras_Tensor - Fatal编程技术网

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

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中的张量,该张量具有与另一张量

更新

sdcbr在其回答中指出,
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]
。我会更新问题。更新我的答案。这太完美了!谢谢你的帮助。