如何在keras中对输入进行切片?

数据挖掘 喀拉斯 重塑
2022-02-18 11:16:38

我给 keras 输入 shape input_shape=(500,)

出于某些原因,我想将输入向量分解为各自形状的向量input_shape_1=(300,)input_shape_2=(200,)

我想在模型的定义中使用功能 API 执行此操作。在某种程度上,我想对一个tf.Tensor对象进行切片。

欢迎帮助!

1个回答

如果只是想分解的输入,可以对输入数据进行预处理,使用两个输入层:

import tensorflow as tf

inputs_first_half = tf.keras.Input(shape=(300,))
inputs_second_half = tf.keras.Input(shape=(200,))

# do something with it
first_half = tf.keras.layers.Dense(1, activation=tf.nn.relu)(inputs_first_half)
second_half = tf.keras.layers.Dense(1, activation=tf.nn.relu)(inputs_second_half)
outputs = tf.keras.layers.Add()([first_half, second_half])

model = tf.keras.Model(inputs=[inputs_first_half,inputs_second_half],outputs=outputs)

data = np.random.randn(10,500)
out = model.predict([data[:,:300],data[:,300:]])

如果您想在输入层之后进行拆分,您可以尝试整形和裁剪,例如:

inputs = tf.keras.Input(shape=(500,))

# do something
intermediate = tf.keras.layers.Dense(500,activation=tf.nn.relu)(inputs)

# split vector with cropping
intermediate = tf.keras.layers.Reshape((500,1), input_shape=(500,))(intermediate)

first_half = tf.keras.layers.Cropping1D(cropping=(0,200))(intermediate)
first_half = tf.keras.layers.Reshape((300,), input_shape=(300,1))(first_half)

second_half = tf.keras.layers.Cropping1D(cropping=(300,0))(intermediate)
second_half = tf.keras.layers.Reshape((200,), input_shape=(200,1))(second_half)


# do something with decomposed vectors
first_half = tf.keras.layers.Dense(1, activation=tf.nn.relu)(first_half)
second_half = tf.keras.layers.Dense(1, activation=tf.nn.relu)(second_half)
outputs = tf.keras.layers.Add()([first_half, second_half])

model = tf.keras.Model(inputs=inputs, outputs=outputs)

data = np.random.randn(10,500)
out = model.predict(data)

Cropping1D()函数需要一个 3D 输入(batch_size, axis_to_crop, features),并且只沿第一个维度进行裁剪,因此我们需要通过重塑向量来将“伪维度”添加到向量中。