ValueError - 使用keras在卷积自动编码器输入中使用奇数时间步长

时间:2018-06-09 13:34:57

标签: python keras

我在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

1 个答案:

答案 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)
相关问题