使用 "Flatten" 或 "Reshape" 在keras中获取未知输入形状的一维输出
Use "Flatten" or "Reshape" to get 1D output of unknown input shape in keras
我想在我的模型末尾使用 keras 层 Flatten()
或 Reshape((-1,))
来输出像 [0,0,1,0,0, ... ,0,0,1,0]
这样的一维向量。
遗憾的是,由于我的输入形状未知,因此出现问题:
input_shape=(4, None, 1)))
。
所以通常输入的形状介于 [batch_size, 4, 64, 1]
和 [batch_size, 4, 256, 1]
之间,输出应该是 batch_size x 未知尺寸(对于拳头上面的示例:[batch_size, 64]
和第二个 [batch_size, 256]
).
我的模型看起来像:
model = Sequential()
model.add(Convolution2D(32, (4, 32), padding='same', input_shape=(4, None, 1)))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Convolution2D(1, (1, 2), strides=(4, 1), padding='same'))
model.add(Activation('sigmoid'))
# model.add(Reshape((-1,))) produces the error
# int() argument must be a string, a bytes-like object or a number, not 'NoneType'
model.compile(loss='binary_crossentropy', optimizer='adadelta')
所以我当前的输出形状是[batchsize, 1, unknown dimension, 1]。
这不允许我使用 class_weights,例如 "ValueError: class_weight not supported for 3+ dimensional targets."
。
当我使用灵活的输入形状时,是否可以使用 Flatten()
或 Reshape((1,))
之类的东西来展平我在 keras(2.0.4 和 tensorflow 后端)中的 3 维输出?
非常感谢!
您可以尝试 K.batch_flatten()
包裹在 Lambda
层中。
K.batch_flatten()
的输出形状在运行时动态确定。
model.add(Lambda(lambda x: K.batch_flatten(x)))
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_5 (Conv2D) (None, 4, None, 32) 4128
_________________________________________________________________
batch_normalization_3 (Batch (None, 4, None, 32) 128
_________________________________________________________________
leaky_re_lu_3 (LeakyReLU) (None, 4, None, 32) 0
_________________________________________________________________
conv2d_6 (Conv2D) (None, 1, None, 1) 65
_________________________________________________________________
activation_3 (Activation) (None, 1, None, 1) 0
_________________________________________________________________
lambda_5 (Lambda) (None, None) 0
=================================================================
Total params: 4,321
Trainable params: 4,257
Non-trainable params: 64
_________________________________________________________________
X = np.random.rand(32, 4, 256, 1)
print(model.predict(X).shape)
(32, 256)
X = np.random.rand(32, 4, 64, 1)
print(model.predict(X).shape)
(32, 64)
我想在我的模型末尾使用 keras 层 Flatten()
或 Reshape((-1,))
来输出像 [0,0,1,0,0, ... ,0,0,1,0]
这样的一维向量。
遗憾的是,由于我的输入形状未知,因此出现问题:
input_shape=(4, None, 1)))
。
所以通常输入的形状介于 [batch_size, 4, 64, 1]
和 [batch_size, 4, 256, 1]
之间,输出应该是 batch_size x 未知尺寸(对于拳头上面的示例:[batch_size, 64]
和第二个 [batch_size, 256]
).
我的模型看起来像:
model = Sequential()
model.add(Convolution2D(32, (4, 32), padding='same', input_shape=(4, None, 1)))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Convolution2D(1, (1, 2), strides=(4, 1), padding='same'))
model.add(Activation('sigmoid'))
# model.add(Reshape((-1,))) produces the error
# int() argument must be a string, a bytes-like object or a number, not 'NoneType'
model.compile(loss='binary_crossentropy', optimizer='adadelta')
所以我当前的输出形状是[batchsize, 1, unknown dimension, 1]。
这不允许我使用 class_weights,例如 "ValueError: class_weight not supported for 3+ dimensional targets."
。
当我使用灵活的输入形状时,是否可以使用 Flatten()
或 Reshape((1,))
之类的东西来展平我在 keras(2.0.4 和 tensorflow 后端)中的 3 维输出?
非常感谢!
您可以尝试 K.batch_flatten()
包裹在 Lambda
层中。
K.batch_flatten()
的输出形状在运行时动态确定。
model.add(Lambda(lambda x: K.batch_flatten(x)))
model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d_5 (Conv2D) (None, 4, None, 32) 4128
_________________________________________________________________
batch_normalization_3 (Batch (None, 4, None, 32) 128
_________________________________________________________________
leaky_re_lu_3 (LeakyReLU) (None, 4, None, 32) 0
_________________________________________________________________
conv2d_6 (Conv2D) (None, 1, None, 1) 65
_________________________________________________________________
activation_3 (Activation) (None, 1, None, 1) 0
_________________________________________________________________
lambda_5 (Lambda) (None, None) 0
=================================================================
Total params: 4,321
Trainable params: 4,257
Non-trainable params: 64
_________________________________________________________________
X = np.random.rand(32, 4, 256, 1)
print(model.predict(X).shape)
(32, 256)
X = np.random.rand(32, 4, 64, 1)
print(model.predict(X).shape)
(32, 64)