Python Keras Conv1D塔如何连接到初始模块中?

Python Keras Conv1D塔如何连接到初始模块中?,python,keras,conv-neural-network,Python,Keras,Conv Neural Network,我有18个特征和2个类的数据。我有一个用于这个数据的Keras卷积网络,它工作得很好。现在我正试图为相同的数据建立一个inception模块网络。当我尝试这样做时,在连接步骤中出现了一些错误 我曾尝试将Conv1D层的塔楼连接起来,就像我对Conv2D层所做的那样,但这不起作用 工作简单卷积模型如下所示: model = Sequential() model.add(Conv1D(32, (5), strides = (1), input_shape = (18, 1), activation

我有18个特征和2个类的数据。我有一个用于这个数据的Keras卷积网络,它工作得很好。现在我正试图为相同的数据建立一个inception模块网络。当我尝试这样做时,在连接步骤中出现了一些错误

我曾尝试将
Conv1D
层的塔楼连接起来,就像我对
Conv2D
层所做的那样,但这不起作用

工作简单卷积模型如下所示:

model = Sequential()
model.add(Conv1D(32, (5), strides = (1), input_shape = (18, 1), activation = 'tanh'))
model.add(MaxPooling1D(pool_size = (2), strides = (2)))
model.add(Conv1D(32, (3), strides = (1), input_shape = (18, 1), activation = 'tanh'))
model.add(Flatten())
model.add(Dense(300,                                            activation = 'tanh'))
model.add(Dense(300,                                            activation = 'tanh'))
model.add(Dropout(rate = 0.5))
model.add(Dense(num_classes,                                    activation = 'softmax', name = "preds"))
model.compile(loss = "categorical_crossentropy", optimizer = "nadam", metrics = ['accuracy'])
inputs  = Input((18, 1))
tower_1 = MaxPooling1D(pool_size=(3), strides=(2), padding='same')(inputs)
tower_1 = Conv1D(32, (1), activation='tanh', border_mode='same')(tower_1)
tower_2 = Conv1D(32, (1), activation='tanh', border_mode='same')(inputs)
tower_2 = Conv1D(32, (3), activation='tanh', border_mode='same')(tower_2)
tower_3 = Conv1D(32, (1), activation='tanh', border_mode='same')(inputs)
tower_3 = Conv1D(32, (5), activation='tanh', border_mode='same')(tower_3)
x       = concatenate([tower_1, tower_2, tower_3], axis=3)
x       = Flatten()(x)
x       = Dense(50, activation='tanh')(x)
preds   = Dense(num_classes, activation='softmax', name='preds')(x)
model   = Model(input=inputs, output=preds)
model.compile(loss='categorical_crossentropy', optimizer='nadam', metrics  =['accuracy'])
现在,包含三个回旋塔的初始模型如下:

model = Sequential()
model.add(Conv1D(32, (5), strides = (1), input_shape = (18, 1), activation = 'tanh'))
model.add(MaxPooling1D(pool_size = (2), strides = (2)))
model.add(Conv1D(32, (3), strides = (1), input_shape = (18, 1), activation = 'tanh'))
model.add(Flatten())
model.add(Dense(300,                                            activation = 'tanh'))
model.add(Dense(300,                                            activation = 'tanh'))
model.add(Dropout(rate = 0.5))
model.add(Dense(num_classes,                                    activation = 'softmax', name = "preds"))
model.compile(loss = "categorical_crossentropy", optimizer = "nadam", metrics = ['accuracy'])
inputs  = Input((18, 1))
tower_1 = MaxPooling1D(pool_size=(3), strides=(2), padding='same')(inputs)
tower_1 = Conv1D(32, (1), activation='tanh', border_mode='same')(tower_1)
tower_2 = Conv1D(32, (1), activation='tanh', border_mode='same')(inputs)
tower_2 = Conv1D(32, (3), activation='tanh', border_mode='same')(tower_2)
tower_3 = Conv1D(32, (1), activation='tanh', border_mode='same')(inputs)
tower_3 = Conv1D(32, (5), activation='tanh', border_mode='same')(tower_3)
x       = concatenate([tower_1, tower_2, tower_3], axis=3)
x       = Flatten()(x)
x       = Dense(50, activation='tanh')(x)
preds   = Dense(num_classes, activation='softmax', name='preds')(x)
model   = Model(input=inputs, output=preds)
model.compile(loss='categorical_crossentropy', optimizer='nadam', metrics  =['accuracy'])
当我尝试运行后者时,我得到了以下输出,我不知道为什么:

---------------------------------------------------------------------------
    IndexError                                Traceback (most recent call last)
    <ipython-input-22-1dbf3d2822ae> in <module>()
          6 tower_3 = Conv1D(32, (1), activation='tanh', border_mode='same')(inputs)
          7 tower_3 = Conv1D(32, (5), activation='tanh', border_mode='same')(tower_3)
    ----> 8 x       = concatenate([tower_1, tower_2, tower_3], axis=3)
          9 x       = Flatten()(x)
         10 #x       = Dense(50, activation='tanh')(x)

    /usr/local/lib/python3.6/dist-packages/keras/layers/merge.py in concatenate(inputs, axis, **kwargs)
        639         A tensor, the concatenation of the inputs alongside axis `axis`.
        640     """
    --> 641     return Concatenate(axis=axis, **kwargs)(inputs)
        642 
        643 

    /usr/local/lib/python3.6/dist-packages/keras/engine/base_layer.py in __call__(self, inputs, **kwargs)
        429                                          'You can build it manually via: '
        430                                          '`layer.build(batch_input_shape)`')
    --> 431                 self.build(unpack_singleton(input_shapes))
        432                 self.built = True
        433 

    /usr/local/lib/python3.6/dist-packages/keras/layers/merge.py in build(self, input_shape)
        346         shape_set = set()
        347         for i in range(len(reduced_inputs_shapes)):
    --> 348             del reduced_inputs_shapes[i][self.axis]
        349             shape_set.add(tuple(reduced_inputs_shapes[i]))
        350         if len(shape_set) > 1:

    IndexError: list assignment index out of range
---------------------------------------------------------------------------
索引器回溯(最后一次最近调用)
在()
6塔架3=Conv1D(32,(1),激活=tanh',边界模式=same')(输入)
7塔楼3=Conv1D(32,(5),激活=tanh',边界模式=same')(塔楼3)
---->8 x=连接([塔1,塔2,塔3],轴=3)
9 x=展平()(x)
10#x=稠密(50,活化=tanh')(x)
/usr/local/lib/python3.6/dist-packages/keras/layers/merge.py串联(输入,轴,**kwargs)
639 A张量,沿“轴”的输入的串联。
640     """
-->641返回串联(轴=轴,**kwargs)(输入)
642
643
/usr/local/lib/python3.6/dist-packages/keras/engine/base_layer.py in_uuu_________(self,input,**kwargs)
429'您可以通过以下方式手动构建它:'
430'`layer.build(批处理输入形状)`)
-->431自构建(解包单例(输入形状))
432自建=真
433
/usr/local/lib/python3.6/dist-packages/keras/layers/merge.py内置(self,input_shape)
346形状_集=集()
347适用于范围内的i(len(减少的_输入_形状)):
-->348 del reduced_输入_形状[i][self.axis]
349 shape_set.add(元组(减少的_输入_形状[i]))
350如果透镜(形状设置)>1:
索引器:列表分配索引超出范围

朋友们,同志们,你们能告诉我为什么会发生这种情况以及如何解决它吗?

对于Conv1D,通常的输入和输出形状的格式是
(批量、宽度、通道)
,因此与轴=3的合并超出了范围,这将是Conv2D使用的值,它具有四维输入和输出

因此,简单的解决方案是在此处使用
axis=2

x       = concatenate([tower_1, tower_2, tower_3], axis=2)

对于Conv1D,通常的输入和输出形状的格式为
(批次尺寸、宽度、通道)
,因此与
轴=3的合并超出了范围,这将是您在具有四维输入和输出的Conv2D中使用的值

因此,简单的解决方案是在此处使用
axis=2

x       = concatenate([tower_1, tower_2, tower_3], axis=2)

你有3个轴吗?1号塔、2号塔等的形状是什么?我想你应该沿着轴=2连接。@dgumo啊,就是这样。非常感谢!:)你有3个轴吗?1号塔、2号塔等的形状是什么?我想你应该沿着轴=2连接。@dgumo啊,就是这样。非常感谢!:)魔术!谢谢你,霍姆布。谢谢你的帮助对问题的轻快解释。魔术!谢谢你,霍姆布雷。谢谢你对问题的轻快解释。