我给 keras 输入 shape input_shape=(500,)
。
出于某些原因,我想将输入向量分解为各自形状的向量input_shape_1=(300,)
和input_shape_2=(200,)
我想在模型的定义中使用功能 API 执行此操作。在某种程度上,我想对一个tf.Tensor
对象进行切片。
欢迎帮助!
我给 keras 输入 shape input_shape=(500,)
。
出于某些原因,我想将输入向量分解为各自形状的向量input_shape_1=(300,)
和input_shape_2=(200,)
我想在模型的定义中使用功能 API 执行此操作。在某种程度上,我想对一个tf.Tensor
对象进行切片。
欢迎帮助!
如果只是想分解的输入,可以对输入数据进行预处理,使用两个输入层:
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)
,并且只沿第一个维度进行裁剪,因此我们需要通过重塑向量来将“伪维度”添加到向量中。