我正在训练 1DConv 模型,每个实例有 4248 个实例和 39249 个特征。我正在尝试批量大小为 32 的 VGG16 模型,但在 7 层之后它返回以下错误。
conv1d_8/convolution/Conv2D (op: 'Conv2D') 的 1 减去 3 导致的负维度大小,输入形状为:[?,1,1,256],[1,3,256,512]。
为了进一步调试,我使用 keras model.summary() 打印了整个网络。附上图片。我有两个担忧。
- 为什么我会收到负尺寸错误?
- 我已经看到输出形状中的第二个参数在 conv1d_7 层中变为 2,并且无法进行进一步的减法。什么是第二个参数?我经历过这个文档中我发现第二个参数是使用下面的公式(Height -Kernel Size + 1)得到的,表示窗口将滑过数据的步数。在我的情况下,内核大小是 3,我对高度感到困惑。该文件解释说“高度是输入网络的一个数据集的长度”。长度是指输入特征的数量,还是批量大小*输入特征的数量?如何在第一层的输出形状中计算 11250。下面是我的代码(我能够计算层的其余部分的参数,只有第二个参数令人困惑,以前的帖子解释了如何计算参数而不是数据的长度)。
- 对于每个样本如此巨大的特征(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())