Keras平行层的连接改变了想要的目标形状

时间:2018-01-03 16:10:49

标签: python-3.x numpy keras keras-layer

我对Keras和深度学习有点新鲜。我正在尝试复制这个paper,但是当我编译第一个模型(没有LSTM)时,我得到以下错误:

  

“ValueError:检查目标时出错:期望dense_3有形状(无,120,40),但得到形状有阵列(8,40,1)”

模型的描述如下:

  1. 输入(长度T是设备特定的窗口大小)
  2. 与过滤器size 3,5和7并行1D卷积 分别为stride=1number of filters=32activation type=linearborder mode=same
  3. 合并输出的合并图层 并行1D卷积
  4. 密集层,output_dim=128activation type=ReLU
  5. 密集层,output_dim=128activation type=ReLU
  6. 密集层,output_dim=Tactivation type=linear
  7. 我的代码是:

    from keras import layers, Input
    from keras.models import Model
    
    # the window sizes (seq_length?) are 40, 1075, 465, 72 and 1246 for the kettle, dish washer,
    # fridge, microwave, oven and washing machine, respectively.
    
    def ae_net(T):
        input_layer = Input(shape= (T,))
        branch_a = layers.Conv1D(32, 3, activation= 'linear', padding='same', strides=1)(input_layer)
        branch_b = layers.Conv1D(32, 5, activation= 'linear', padding='same', strides=1)(input_layer)
        branch_c = layers.Conv1D(32, 7, activation= 'linear', padding='same', strides=1)(input_layer)
    
        merge_layer = layers.concatenate([branch_a, branch_b, branch_c], axis=1)
    
        dense_1 = layers.Dense(128, activation='relu')(merge_layer)
        dense_2 =layers.Dense(128, activation='relu')(dense_1)
        output_dense = layers.Dense(T, activation='linear')(dense_2)
        model = Model(input_layer, output_dense)
        return model
    
    model = ae_net(40)
    model.compile(loss= 'mean_absolute_error', optimizer='rmsprop')
    model.fit(X, y, batch_size= 8)
    

    其中Xy是8个长度为40的序列的numpy arrays。因此X.shapey.shape(8, 40, 1)。它实际上是一批数据。问题是我无法理解输出的形状(None, 120, 40)以及这些尺寸意味着什么。

1 个答案:

答案 0 :(得分:0)

如您所述,您的形状包含batch_sizelengthchannels(8,40,1)

你的三个卷积,每一个,都会产生像(8,40,32)这样的张量。 您在axis=1中的连接会创建一个像(8,120,32)这样的张量,其中120 = 3*40

现在,密集层仅适用于最后一个维度(在这种情况下是通道),保持长度(现在为120)不变。

<强>解决方案

现在,您似乎确实想要保持最后的长度。因此,您不需要任何展平或重塑图层。但是你需要保持40的长度。

你可能在错误的轴上进行连接。您应该在通道轴(2或-1)中连接而不是长度轴(1)。

所以,这应该是你的连接层:

merge_layer = layers.Concatenate()([branch_a, branch_b, branch_c])
#or layers.Concatenate(axis=-1)([branch_a, branch_b, branch_c])

这将输出(8, 40, 96),密集层将在其他内容中转换96。