我在Keras中使用1d卷积自动编码器进行文本处理。我的输入是形状(?,13,22)。我在maxpooling1d层之前添加了一个zeropadding1d层。在maxpooling1d层,我使用pool_size = 2,这就是为什么我添加一个zeropadding1d来输入(?,14,22)。我得到" ValueError:检查目标时出错:期望conv1d_4有形状(14,22)但得到形状有阵列(13,22)"。我正在使用填充='相同'在第4个conv1d层,所以它应该考虑我在maxpooling1d层之前添加到输入的zeropadding(根据我的理解)。我不确定我做错了什么。
input_size = features.shape[1:] //input_size (13, 22)
# input layer
input_layer = ks.layers.Input(shape=(*input_size,), name='input') //shape=(?, 13, 22)
# noise
x = ks.layers.GaussianNoise(stddev=0.1)(input_layer) //shape=(?, 13, 22)
# conv layer
x = ks.layers.Conv1D(filters=8, kernel_size=3, strides=1, activation=ks.activations.relu, padding='same')(x) //shape=(?, 13, 8)
x = ks.layers.ZeroPadding1D(padding=(1, 0))(x) //shape=(?, 14, 8)
x = ks.layers.MaxPool1D(pool_size=2, strides=None)(x) //shape=(?, 7, 8)
x = ks.layers.Conv1D(filters=8, kernel_size=3, strides=1, activation=ks.activations.relu, padding='same')(x) //shape=(?, 7, 8)
x = ks.layers.UpSampling1D(size=2)(x) //shape=(?, 14, 8)
x = ks.layers.Conv1D(filters=8, kernel_size=3, strides=1, activation=ks.activations.relu, padding='same')(x) //shape=(?, 14, 8)
x = ks.layers.Conv1D(filters=input_size[-1], kernel_size=3, strides=1, activation=ks.activations.relu, padding='same')(x) //ValueError: Error when checking target: expected conv1d_4 to have shape (14, 22) but got array with shape (13, 22)
# output
output_layer = x
以下是我的模型摘要。
Layer (type) Output Shape Param #
=================================================================
input (InputLayer) (None, 13, 22) 0
_________________________________________________________________
gaussian_noise_1 (GaussianNo (None, 13, 22) 0
_________________________________________________________________
conv1d_1 (Conv1D) (None, 13, 8) 536
_________________________________________________________________
zero_padding1d_1 (ZeroPaddin (None, 14, 8) 0
_________________________________________________________________
max_pooling1d_1 (MaxPooling1 (None, 7, 8) 0
_________________________________________________________________
conv1d_2 (Conv1D) (None, 7, 8) 200
ValueError: Error when checking target: expected conv1d_4 to have shape
(14, 22) but got array with shape (13, 22)
_________________________________________________________________
up_sampling1d_1 (UpSampling1 (None, 14, 8) 0
_________________________________________________________________
conv1d_3 (Conv1D) (None, 14, 8) 200
_________________________________________________________________
conv1d_4 (Conv1D) (None, 14, 22) 550
=================================================================
Total params: 1,486
Trainable params: 1,486
Non-trainable params: 0
_________________________________________________________________
None
答案 0 :(得分:1)
我找到了解决问题的方法。我没有在maxpooling层之前添加一个zeropadding层,而是通过向输入添加零填充来更改输入的维度。我的代码现在看起来像这样,
def fit(self, dataset):
features = self.load_data(dataset) //features.shape (12500, 13, 22)
npad = ((0, 0), (1, 0), (0, 0)) //
features = np.pad(features, pad_width=npad, mode='constant', constant_values=0) //features. shape (12500, 14, 22)
import keras as ks
input_size = features.shape[1:]
# input layer
input_layer = ks.layers.Input(shape=(*input_size,), name='input')
# noise
x = ks.layers.GaussianNoise(stddev=0.1)(input_layer)
x = ks.layers.Conv1D(filters=8, kernel_size=3, strides=1, activation=ks.activations.relu, padding='same')(x)
# downscale the spatial dimensions - downscaling factor: halve the input in width
x = ks.layers.MaxPool1D(pool_size=2, strides=None)(x)
x = ks.layers.Conv1D(filters=8, kernel_size=3, strides=1, activation=ks.activations.relu, padding='same')(x)
# upsample to higher dimensional space
x = ks.layers.UpSampling1D(size=2)(x)
x = ks.layers.Conv1D(filters=8, kernel_size=3, strides=1, activation=ks.activations.relu, padding='same')(x)
# decode the encoded data
x = ks.layers.Conv1D(filters=input_size[-1], kernel_size=3, strides=1, activation=ks.activations.softmax, padding='same')(x)
# output
output_layer = x
# build model
self.model = ks.models.Model(inputs=input_layer, outputs=output_layer)