需要帮助在数据集上应用 1D CNN
Need help to apply 1D CNN on a dataset
我正在处理我自己的数据集,该数据集存储在一个 csv 文件中。它有三列:val1 |值2 |标签。共有 6 个标签。行数和列数分别为2000和3。我想创建一个一维 CNN 网络,它接受输入 val1 和 val2 并可以预测标签。到目前为止我已经试过了
df = pd.read_csv("data.csv")
x = df.drop(["label"], axis=1) #x.shape = (2000, 2)
x = np.expand_dims(x,-1) #x.shape = (2000, 2, 1)
y = df.label #y.shape = (2000, 1)
y = to_categorical(y) #y.shape = (2000, 6)
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
X_train, X_valid, y_train, y_valid = train_test_split(X_train, y_train, test_size=0.2)
model = Sequential()
model.add(Conv1D(filters=256, kernel_size=2, activation='relu', input_shape=(2,1)))
model.add(Dropout(0.2))
model.add(MaxPooling1D(pool_size=1))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(6, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train,
batch_size=64,
epochs=100,
verbose=1,
validation_data=(X_valid,y_valid),
shuffle=True,
)
以上模型仅给出最大 30% 的验证和训练准确率。
我尝试过的事情:
数据扩充。
更改过滤器的数量。
增加层数。
如何提高模型的准确性?
您可以尝试多种选择:
- 玩转学习率
- 尝试不同的模型架构
- 试试全连接神经网络。只有两个一维输入,你的输入中真的有一个 CNN 可以利用的网格结构吗? FCNN 可能是更适合您任务的架构
- 移除可能支持欠拟合的 dropout
- 假设你欠拟合,增加网络中的神经元数量
- 尝试完全不同的模型类型,例如决策树、逻辑回归、SVM 或随机森林
- 检查你的数据。也许它不够干净,无法让网络从中推断出一些东西。应用数据清理,例如如果有不一致。
- 提供更多数据。这始终取决于您的问题,但 2000 个数据点可能不会那么多。
这不是一个详尽的清单。第一步肯定是检查您的数据。您的训练和验证性能都很低的结果表明您欠拟合。这表明您的模型太小或过于正则化(Dropout)。我宁愿觉得你的模型太大太复杂,但这取决于你的任务。试一试逻辑回归、SVM 或 FCNN。如果事实证明您的任务确实非常复杂,请尝试收集更多数据或推断问题的更多结构。
我正在处理我自己的数据集,该数据集存储在一个 csv 文件中。它有三列:val1 |值2 |标签。共有 6 个标签。行数和列数分别为2000和3。我想创建一个一维 CNN 网络,它接受输入 val1 和 val2 并可以预测标签。到目前为止我已经试过了
df = pd.read_csv("data.csv")
x = df.drop(["label"], axis=1) #x.shape = (2000, 2)
x = np.expand_dims(x,-1) #x.shape = (2000, 2, 1)
y = df.label #y.shape = (2000, 1)
y = to_categorical(y) #y.shape = (2000, 6)
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
X_train, X_valid, y_train, y_valid = train_test_split(X_train, y_train, test_size=0.2)
model = Sequential()
model.add(Conv1D(filters=256, kernel_size=2, activation='relu', input_shape=(2,1)))
model.add(Dropout(0.2))
model.add(MaxPooling1D(pool_size=1))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(6, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X_train, y_train,
batch_size=64,
epochs=100,
verbose=1,
validation_data=(X_valid,y_valid),
shuffle=True,
)
以上模型仅给出最大 30% 的验证和训练准确率。
我尝试过的事情: 数据扩充。 更改过滤器的数量。 增加层数。
如何提高模型的准确性?
您可以尝试多种选择:
- 玩转学习率
- 尝试不同的模型架构
- 试试全连接神经网络。只有两个一维输入,你的输入中真的有一个 CNN 可以利用的网格结构吗? FCNN 可能是更适合您任务的架构
- 移除可能支持欠拟合的 dropout
- 假设你欠拟合,增加网络中的神经元数量
- 尝试完全不同的模型类型,例如决策树、逻辑回归、SVM 或随机森林
- 检查你的数据。也许它不够干净,无法让网络从中推断出一些东西。应用数据清理,例如如果有不一致。
- 提供更多数据。这始终取决于您的问题,但 2000 个数据点可能不会那么多。
这不是一个详尽的清单。第一步肯定是检查您的数据。您的训练和验证性能都很低的结果表明您欠拟合。这表明您的模型太小或过于正则化(Dropout)。我宁愿觉得你的模型太大太复杂,但这取决于你的任务。试一试逻辑回归、SVM 或 FCNN。如果事实证明您的任务确实非常复杂,请尝试收集更多数据或推断问题的更多结构。