TF2/Keras 切片张量使用 [:, :, 0]
TF2 / Keras slice tensor using [:, :, 0]
在 TF 2.0 Beta 中,我正在尝试:
x = tf.keras.layers.Input(shape=(240, 2), dtype=tf.float32)
print(x.shape) # (None, 240, 2)
a = x[:, :, 0]
print(a.shape) # <unknown>
在 TF 1.x 我可以做:
x = tf1.placeholder(tf1.float32, (None, 240, 2)
a = x[:, :, 0]
它会很好用。我如何在 TF 2.0 中实现这一点?我觉得
tf.split(x, 2, axis=2)
可能有效,但我想使用切片而不是硬编码 2(轴 2 的暗淡)。
不同之处在于,从 Input
返回的对象表示一个层,而不是与占位符或张量类似的任何东西。因此,上面 tf 2.0 代码中的 x
是层对象,而 tf 1.x 代码中的 x
是张量的占位符。
您可以定义一个切片层来执行操作。有开箱即用的层可用,但是对于像这样的简单切片,Lambda
层非常容易阅读,并且可能最接近您在 tf 1.x 中习惯的切片方式。
像这样:
input_lyr = tf.keras.layers.Input(shape=(240, 2), dtype=tf.float32)
sliced_lyr = tf.keras.layers.Lambda(lambda x: x[:,:,0])
您可以像这样在您的 keras 模型中使用它:
model = tf.keras.models.Sequential([
input_lyr,
sliced_lyr,
# ...
# <other layers>
# ...
])
当然以上是特定于keras模型的。相反,如果您有一个张量而不是一个 keras 层对象,那么切片将完全像以前一样工作。像这样:
my_tensor = tf.random.uniform((8,240,2))
sliced = my_tensor[:,:,0]
print(my_tensor.shape)
print(sliced.shape)
输出:
(8, 240, 2)
(8, 240)
符合预期
在 TF 2.0 Beta 中,我正在尝试:
x = tf.keras.layers.Input(shape=(240, 2), dtype=tf.float32)
print(x.shape) # (None, 240, 2)
a = x[:, :, 0]
print(a.shape) # <unknown>
在 TF 1.x 我可以做:
x = tf1.placeholder(tf1.float32, (None, 240, 2)
a = x[:, :, 0]
它会很好用。我如何在 TF 2.0 中实现这一点?我觉得
tf.split(x, 2, axis=2)
可能有效,但我想使用切片而不是硬编码 2(轴 2 的暗淡)。
不同之处在于,从 Input
返回的对象表示一个层,而不是与占位符或张量类似的任何东西。因此,上面 tf 2.0 代码中的 x
是层对象,而 tf 1.x 代码中的 x
是张量的占位符。
您可以定义一个切片层来执行操作。有开箱即用的层可用,但是对于像这样的简单切片,Lambda
层非常容易阅读,并且可能最接近您在 tf 1.x 中习惯的切片方式。
像这样:
input_lyr = tf.keras.layers.Input(shape=(240, 2), dtype=tf.float32)
sliced_lyr = tf.keras.layers.Lambda(lambda x: x[:,:,0])
您可以像这样在您的 keras 模型中使用它:
model = tf.keras.models.Sequential([
input_lyr,
sliced_lyr,
# ...
# <other layers>
# ...
])
当然以上是特定于keras模型的。相反,如果您有一个张量而不是一个 keras 层对象,那么切片将完全像以前一样工作。像这样:
my_tensor = tf.random.uniform((8,240,2))
sliced = my_tensor[:,:,0]
print(my_tensor.shape)
print(sliced.shape)
输出:
(8, 240, 2)
(8, 240)
符合预期