当前位置: 首页 > 知识库问答 >
问题:

如何在Keras中实现具有残差连接和批量归一化的一维卷积神经网络?

秦彦君
2023-03-14

我正试图开发一个一维卷积神经网络,该网络具有残余连接和批量归一化功能,基于《心脏病专家级心律失常检测与卷积神经网络》,使用keras。这是迄今为止的代码:

# define model
x = Input(shape=(time_steps, n_features))

# First Conv / BN / ReLU layer
y = Conv1D(filters=n_filters, kernel_size=n_kernel, strides=n_strides, padding='same')(x) 
y = BatchNormalization()(y)
y = ReLU()(y)

shortcut = MaxPooling1D(pool_size = n_pool)(y)

# First Residual block
y = Conv1D(filters=n_filters, kernel_size=n_kernel, strides=n_strides, padding='same')(y) 
y = BatchNormalization()(y)
y = ReLU()(y)
y = Dropout(rate=drop_rate)(y)
y = Conv1D(filters=n_filters, kernel_size=n_kernel, strides=n_strides, padding='same')(y) 
# Add Residual (shortcut)
y = add([shortcut, y])

# Repeated Residual blocks   
for k in range (2,3): # smaller network for testing

    shortcut = MaxPooling1D(pool_size = n_pool)(y)
    y = BatchNormalization()(y)
    y = ReLU()(y)
    y = Dropout(rate=drop_rate)(y)
    y = Conv1D(filters=n_filters * k, kernel_size=n_kernel, strides=n_strides, padding='same')(y)    
    y = BatchNormalization()(y)
    y = ReLU()(y)
    y = Dropout(rate=drop_rate)(y)
    y = Conv1D(filters=n_filters * k, kernel_size=n_kernel, strides=n_strides, padding='same')(y) 
    y = add([shortcut, y])

z = BatchNormalization()(y)
z = ReLU()(z)    
z = Flatten()(z)
z = Dense(64, activation='relu')(z)
predictions = Dense(classes, activation='softmax')(z)

model = Model(inputs=x, outputs=predictions)

# Compiling 
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['categorical_accuracy'])

# Fitting 
model.fit(train_x, train_y, epochs=n_epochs, batch_size=n_batch)

这是我试图建立的简化模型的图表。

本文中描述的模型使用递增数量的过滤器:

该网络由16个剩余块组成,每个块有2个卷积层。卷积层都具有16个滤波器长度,并且具有64k个滤波器,其中k从1开始,并且每4个剩余块递增一次。每个备用残差块将其输入再采样一个因子2,因此原始输入最终再采样一个因子2^8。当剩余块对输入进行二次采样时,相应的快捷连接也会使用具有相同子采样因子的最大池操作对其输入进行二次采样。

但是,只有在每个Conv1D层中使用相同数量的过滤器,k=1,步幅=1和填充=相同,而不应用任何MaxPooling1D,我才能使它工作。这些参数的任何更改都会导致张量大小不匹配和编译失败,并出现以下错误:

ValueError: Operands could not be broadcast together with shapes (70, 64) (70, 128)

有没有人知道如何解决这个大小不匹配的问题并使其发挥作用?

此外,如果输入有多个通道(或特征),不匹配甚至是最糟糕的!有没有办法处理多个通道?

共有1个答案

周宏伯
2023-03-14

张量形状不匹配的问题应该发生在添加层中。由于您使用的是MaxPoolg1d层,因此默认情况下,这将使时间步长减半,您可以使用参数pool\u size对其进行更改。另一方面,您的剩余部分并没有减少相同数量的时间步。在任何一个Conv1D层(最好是最后一个层)中添加快捷方式和y之前,您应该先应用带填充的步幅为2。

作为参考,您可以在这里查看Resnet代码Keras applications github

 类似资料:
  • 我是卷积神经网络新手,对特征映射和如何在图像上进行卷积来提取特征有概念。我很高兴知道一些关于在CNN应用批量标准化的细节。 我知道什么是特征图和不同的元素是权重在每一个特征图。但我不能理解什么是位置或空间位置。 我完全不能理解下面的句子“在alg.1中,我们让B是一个特征映射中的所有值的集合,它跨越了一个小批处理的元素和空间位置。” 如果有人能用更简单的术语来解释我,我会很高兴的

  • 请问以下对卷积神经网络中批量归一化的理解是否正确? 如下图所示,均值和方差是使用当前小批量中各个示例生成的相同特征图上的所有单元格计算的,即它们是跨h、w和m轴计算的。

  • 我正在实现一个依赖于3D卷积的模型(对于类似于动作识别的任务),我想使用批量规范化(参见 下面的代码引用了TensorFlow r0.12,它显式地引用了变量——我的意思是我没有使用tf。承包商。学习tf以外的内容。承包商。图层。batch\u norm()函数。我这样做是为了更好地理解事情是如何运作的,并且有更多的实现自由度(例如,变量摘要)。 我将通过首先编写完全连接层的示例,然后编写2D卷积

  • 我一直在研究一个简单的卷积神经网络模型,但输出似乎与我想要的形状不匹配。 所以我的输入大小似乎不是问题。我的训练集输入形状是(13630, 200, 4, 1)其中13630是数据的数量,而我的training_label如下。(13630,2)我期望模型输出形状是(2,),但它似乎期望(1,)作为输出大小。 所以我的错误是这样的。 检查目标时出错:预期稠密_28具有形状(1),但获得具有形状(2

  • 真的很难理解keras中卷积1d层的输入维度: 输入形状 带形状的三维张量:(采样、步长、input\u dim)。 输出形状 带形状的三维张量:(采样、新的\u步骤、nb\u过滤器)。由于填充,步骤值可能已更改。 我希望我的网络接受价格的时间序列(101,按顺序)并输出4个概率。我当前的非卷积网络做得相当好(训练集为28000)如下所示: 为了改进这一点,我想从具有长度为10的局部感受野的输入层

  • 我正在试图理解卷积神经网络中的维度是如何表现的。在下图中,输入为带1个通道的28乘28矩阵。然后是32个5乘5的过滤器(高度和宽度步幅为2)。所以我理解结果是14乘14乘32。但是在下一个卷积层中,我们有64个5×5的滤波器(同样是步幅2)。那么为什么结果是7乘7乘64而不是7乘7乘32*64呢?我们不是将64个滤波器中的每一个应用于32个通道中的每一个吗?