首页 > 解决方案 > 如何在未标记的数据集上训练 CNN?

问题描述

我想在我的未标记数据上训练一个 CNN,从我在 Keras/Kaggle/TF 文档或 Reddit 线程上阅读的内容来看,我似乎必须事先标记我的数据集。有没有办法以无人监督的方式训练 CNN?
我无法理解如何初始化y_trainy_test(其中 y_train 和 y_test 代表通常的含义)
关于我的数据集的信息如下:

  1. 我有 50,000 个尺寸为 30 x 30 的矩阵。
  2. 每个矩阵分为 9 个子区域(为便于理解,由垂直和水平条分隔)。
  3. 如果一个子区域至少有一个元素等于 1,则称该子区域为活动区域。如果该子区域的所有元素都等于 0,则该子区域为非活动区域。
  4. 对于下面显示的第一个示例,我应该得到活动子区域的名称作为输出,所以这里是 (1, 4, 5, 6, 7, 9)。
  5. 如果没有子区域处于活动状态,如第二个示例所示,则输出应为 0。

第一个例子:输出 - (1, 4, 5, 6, 7, 9) 第一个示例图像

第二个示例:输出 - 0 第二个示例图像 创建这些矩阵后,我执行了以下操作:

  1. 在将这些矩阵重新整形为尺寸为 900 x 1 的向量后,我将它们放入 CSV 文件中。
  2. 所以基本上,CSV 中的每一行都包含 900 列,值为 0 或 1。
  3. 我的分类问题的类别是从 0 到 9 的数字,其中 0 表示没有标签具有活动(值=1)值的类别。

对于我的模型,我想要以下内容:

我所做的:
我能够将 CSV 文件中的数据检索到数据框中,并将数据框拆分为x_trainx_test。但我无法理解如何设置我的y_trainy_test值。
我的问题似乎与 MNIST 数据集非常相似,只是我没有标签。我可以在没有标签的情况下训练模型吗?

我的代码目前如下所示:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

# Read the dataset from the CSV file into a dataframe
df = pd.read_csv("bci_dataset.csv")

# Split the dataframe into training and test dataset
train, test = train_test_split(df, test_size=0.2)

x_train = train.iloc[:, :]
x_test = test.iloc[:, :]

print(x_train.shape)
print(x_test.shape)

提前感谢您阅读整本书并帮助我!

标签: pythontensorflowkerasconv-neural-network

解决方案


你能告诉我们你为什么要专门使用 CNN 吗?通常,当从特征到输出存在一些复杂性时,会使用神经网络——人工神经元能够学习不同的行为,因为它们暴露于基本事实(即标签)。大多数时候,使用神经网络的研究人员甚至不知道网络正在使用输入数据的哪些特征来得出其输出结论。

在您给我们的情况下,它看起来更像您知道哪些特征是重要的(即,子区域的总和必须大于 0 才能激活)。神经网络不需要真正学习任何东西来完成它的工作。尽管在此过程中似乎没有必要使用神经网络,但考虑到输入数据的大小,自动化它确实很有意义!:)

不过,如果我误解了你的情况,请告诉我?

编辑:为了将其与 MNIST 数据集进行对比——因此为了识别手写数字,网络必须学习处理一些模糊性。并非每种笔迹都会以相同的方式呈现 7。神经网络能够计算出 7 的几个特征(即,7 很有可能有一条从右上角到左下角的对角线,这取决于你如何写,可以稍微弯曲或偏移或其他),以及几个不同版本的 7(有些人在中间做一个水平斜线,其他版本的 7 没有那个斜线)。神经网络在这里的效用在于找出所有的歧义并将输入概率性地分类为 7(因为它已经看到了它“知道”为 7 的先前图像)。然而,在您的情况下,只有一种方法可以呈现您的答案 - 如果子区域中有任何大于 0 的元素,它就是活动的!所以你不需要训练一个网络来做任何事情——你只需要编写一些代码来自动对子区域求和。


推荐阅读