如何在未标记的数据集上训练 CNN?

问题描述 投票:0回答:2

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

  1. 我有 50,000 个维度为 30 x 30 的矩阵。
  2. 每个矩阵分为 9 个子区域(为了便于理解,用竖线和横线分隔)。
  3. 如果某个子区域至少有一个元素等于 1,则该子区域被称为 active。如果该子区域的所有元素都等于 0,则该子区域为 inactive
  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)值的类。

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

  • 输入: 如上所述的 900 x 1 向量。
  • 输出:0-9 中的一个值,
    其中 1-9 表示活动分区,0 表示无活动分区。

我做了什么:
我能够将 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)

提前感谢您阅读整篇文章并帮助我!

python tensorflow keras conv-neural-network
2个回答
0
投票

您能告诉我们为什么要专门使用 CNN 吗?一般来说,当从特征到输出的过程中涉及一些复杂的情况时,就会使用神经网络——人工神经元能够通过暴露于真实情况(即标签)来学习不同的行为。大多数时候,使用神经网络的研究人员甚至不知道网络使用输入数据的哪些特征来得出输出结论。

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

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

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


0
投票

CNN 仅用于监督分类,输出是类,因此您必须转向监督模型或为您的项目尝试其他模型。

© www.soinside.com 2019 - 2024. All rights reserved.