1DConv输出形状keras模型摘要中的第二个参数是什么?

时间:2020-03-13 19:50:01

标签: python tensorflow keras deep-learning conv-neural-network

我正在训练1DConv模型,每个模型具有4248个实例和39249个特征。我正在尝试使用32批大小的VGG16模型,但是经过7层之后,它返回以下错误。

在输入形状为[?,1,1,256],[1,3,256,512]的conv1d_8 / convolution / Conv2D(op:'Conv2D')中,从1中减去3引起的负尺寸大小。

为了进一步调试,我使用keras model.summary()打印了整个网络。图像已附加。我有两个问题。

  1. 为什么会出现负尺寸错误?
  2. 我已经看到,输出形状中的第二个参数在conv1d_7层中变为2,并且不可能进一步减法。什么是第二参数?我浏览了this文档,发现第二个参数是使用以下公式(高度-内核大小+ 1)获得的,它表示窗口将在数据中滑动的步数。在我的情况下,内核大小为3,我对高度感到困惑。该文件解释说,“高度是馈入网络的一个数据集的长度”。长度是指特征的输入数量,还是批次大小*输入特征的数量?如何在第一层的输出形状中计算11250。下面是我的代码(我能够为其余层计算参数,只有第二个参数令人困惑,以前的帖子解释了如何计算参数而不是数据长度)。
  3. 对于每个样本如此大的功能(39249),仅约4k实例,哪种深度学习算法可能对准确分类有用?

感谢您的帮助。谢谢。

model = Sequential()
 model.add(Conv1D(filters = 8, kernel_size=3, strides=3, activation='relu', input_shape=(n_timestamps,n_features)))

 model.add(Conv1D(filters=16, kernel_size=3, strides=3, activation='relu'))
 model.add(MaxPooling1D(pool_size=2,strides=2))

 model.add(Conv1D(filters=32, kernel_size=3, strides=3, activation='relu'))
 model.add(MaxPooling1D(pool_size=2,strides=2))

 model.add(Conv1D(filters=64, kernel_size=3, strides=3, activation='relu'))
 model.add(MaxPooling1D(pool_size=2,strides=2))
 model.add(Conv1D(filters=64, kernel_size=3, strides=3, activation='relu'))
 model.add(MaxPooling1D(pool_size=2,strides=2))

 model.add(Conv1D(filters=128, kernel_size=3, strides=3, activation='relu'))
 model.add(Conv1D(filters=128, kernel_size=3, strides=3, activation='relu'))
 model.add(MaxPooling1D(pool_size=4,strides=3))
 print(model.summary())

 model.add(Conv1D(filters=256, kernel_size=3, strides=3, activation='relu'))
 model.add(Conv1D(filters=256, kernel_size=3, strides=3, activation='relu'))
 model.add(Conv1D(filters=256, kernel_size=3, strides=3, activation='relu'))
 model.add(MaxPooling1D(pool_size=2,strides=2))
 print(model.summary())

 model.add(Conv1D(filters=512, kernel_size=3, strides=3, activation='relu'))
 model.add(Conv1D(filters=512, kernel_size=3, strides=3, activation='relu'))
 model.add(Conv1D(filters=512, kernel_size=3, strides=3, activation='relu'))
 model.add(MaxPooling1D(pool_size=2,strides=2))
 print(model.summary())

 model.add(Conv1D(filters=512, kernel_size=3, strides=3, activation='relu'))
 model.add(Conv1D(filters=512, kernel_size=3, strides=3, activation='relu'))
 model.add(Conv1D(filters=512, kernel_size=3, strides=3, activation='relu'))
 model.add(MaxPooling1D(pool_size=2,strides=2))

 model.add(Flatten())
 model.add(Dense(4096, activation='relu'))
 #model.add(Dropout(0.5))
 model.add(Dense(4096, activation='relu'))
 #model.add(Dropout(0.5))
 model.add(Dense(n_outputs, activation='softmax'))
 print(model.summary())

enter image description here

2 个答案:

答案 0 :(得分:1)

1-这里,每层步幅= 3,这是一个问题。在每个卷积过滤器之后,它的意思是feather_size更改为feather_size / 3,并且其原因是快速减少了feather_size。 我建议您减少过滤器的步幅。例如,迈步= 1似乎很合适。

2-作为一般公式,您可以计算每个Conv之后输出羽毛的大小。用((feather_size-kernel_size)/ stride)+ 1

过滤

最后,有关keras卷积过滤器中每个参数的更多说明,我可以向您介绍https://keras.io/layers/convolutional/

答案 1 :(得分:1)

1)任何会减少输出特征图的操作都将成为负尺寸错误的元凶。通常,它是由于“有效”的填充,合并或跨步而发生的。

“有效” =不填充:

   inputs:         1  2  3  4  5  6  7  8  9  10 11 (12 13)
                  |________________|                dropped
                                 |_________________|

“ POOLING” = 2x2最大池,从2by2窗口仅获取1个最大值,因此每次应用时输出形状都会减半。

由于这些操作会减小要素图的形状,因此在一层中,要素图可能会变得太小,甚至小于单个内核的大小,因此您将无法再应用这些操作,因此出现此错误。

2)您使用了较大的跨步值,因此,要素图的长度下降得更快。您可以关注任何博客,以获取有关如何计算每个参数https://towardsdatascience.com/understanding-and-calculating-the-number-of-parameters-in-convolution-neural-networks-cnns-fc88790d530d

的想法

3)您可以简单地减少密集或FC层中的神经元数量。尝试使用较小的单位(例如512,而不是4096),看看精度如何下降。添加一些批处理规范层并增加辍学率,以免发生过拟合。