我正在训练1DConv模型,每个模型具有4248个实例和39249个特征。我正在尝试使用32批大小的VGG16模型,但是经过7层之后,它返回以下错误。
在输入形状为[?,1,1,256],[1,3,256,512]的conv1d_8 / convolution / Conv2D(op:'Conv2D')中,从1中减去3引起的负尺寸大小。
为了进一步调试,我使用keras model.summary()打印了整个网络。图像已附加。我有两个问题。
感谢您的帮助。谢谢。
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())
答案 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),看看精度如何下降。添加一些批处理规范层并增加辍学率,以免发生过拟合。