何时使用 Dense、Conv1/2D、Dropout、Flatten 和所有其他层?

数据挖掘 机器学习 神经网络 深度学习 喀拉斯 张量流
2021-10-10 06:31:17

我有一个二元分类问题,想建立一个 NN 模型,将数据分类为 0 类还是 1 类。

我的实际实现如下所示:

# Split dataset in train and test data 
X_train, X_test, Y_train, Y_test = train_test_split(normalized_X, Y, test_size=0.3, random_state=seed)

# Build the model
model = Sequential()
model.add(Dense(23, input_dim=45, kernel_initializer='normal', activation='relu'))
model.add(Dense(1, kernel_initializer='normal', activation='sigmoid'))

# Compile model
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

# Fit the model
history = model.fit(X_train, Y_train, validation_split=0.3, epochs=200, batch_size=5, verbose=1, callbacks=[tensorboard, time_callback]) 

我在最后一个训练时期得到了 79.85% 的 val_accuracy。

我使用混淆矩阵来评估模型:

y_pred = model.predict(X_test)
y_pred =(y_pred>0.5)
list(y_pred)

cm = confusion_matrix(Y_test, y_pred)
print(cm)

我得到这些值: [[ 622 205] [ 216 1055]]

这使得正确预测类(622 TN + 1055 TP)的 79.93%(与最后一个 epoch 的 val_accuracy 大致相同)。

现在我的问题是:如何改进我的神经网络,以便我超越它?好的,我正在使用 1 个隐藏的密集层,有 23 个节点。何时使用 Dense 层,何时使用 Conv2D 或 Dropout,或 Keras 的任何其他层?

我正在对数值数据进行分类。这是我的数据的样子(数据框分成 2 张照片,因为它对于只有 1 张来说太宽了): df 第一部分 df 第二部分

PS:分类特征是 One-Hot-Encoded 使用:

basic_df = pd.get_dummies(basic_df, columns=['industry', 'weekday', 'category_name', 'page_name', 'type'])

并且标签列是“成功的”。

1个回答

什么是密集层,它们什么时候有用?

当数据点中任何特征与任何其他特征之间可以存在关联时,使用密集层。由于在两层大小之间n1n2, 可以n1n2连接,这些被称为Dense.

Conv 层在哪里出现以及它们何时有用?

来到这些conv层,当特征之间的附近关联很重要时,这些很重要,例如对象检测。邻域对分类或检测很重要。在这些用例中,对角(非常远)的像素不太可能有帮助。过滤器完成了获取社区之间关联的工作。这个答案非常适合理解1D2D卷积之间的区别。我真的不想重复了。

辍学和展平

Dropout是一种通过以一定概率丢弃权重(边缘)来减少特征之间过多关联的方法。Hinton et.al的原始论文是一本快速而精彩的阅读文章。可以在停止边缘权重更新的任何层之间应用减少关联。这里的另一个关键区别是它没有与之关联的权重。它就在那里丢东西。

Flatten当您获得多维输出并且希望使其成为线性以将其传递到图层时,将使用Dense图层。如果熟悉的numpy话,就相当于numpy.ravel展平层的输出被传递到 MLP 用于您想要实现的分类或回归任务。这些也没有权重。它只是把地狱夷为平地。

改进模型

尝试更多层,更改激活函数,尝试批处理。如果有任何改进功能和创建更高阶功能的机会,那就去做吧。太多变数无法推测。

这个问题非常广泛,但希望我能很好地涵盖它。