Python Keras Conv1D塔如何连接到初始模块中?
我有18个特征和2个类的数据。我有一个用于这个数据的Keras卷积网络,它工作得很好。现在我正试图为相同的数据建立一个inception模块网络。当我尝试这样做时,在连接步骤中出现了一些错误 我曾尝试将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
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啊,就是这样。非常感谢!:)魔术!谢谢你,霍姆布。谢谢你的帮助对问题的轻快解释。魔术!谢谢你,霍姆布雷。谢谢你对问题的轻快解释。