【问题标题】:How to train a CNN on an unlabeled dataset?如何在未标记的数据集上训练 CNN?
【发布时间】:2019-04-15 19:46:10
【问题描述】:

我想在我未标记的数据上训练一个 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) 值的类别。

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

  • 输入:如上所述的 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)

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

【问题讨论】:

  • 除非我遗漏了一些东西,否则标签可以从数据本身中轻松推断出来。
  • 是的,我会这样做的。事实证明,为此运行 CNN 并没有多大意义。我会在以后使用它。

标签: python tensorflow keras conv-neural-network


【解决方案1】:

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

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

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

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

【讨论】:

  • 你是对的!我可以以某种方式自动化标签。我想实现 CNN,因为在我的这个项目的后期阶段,当数据不仅仅是二进制时,我将需要它。但就目前而言,我想,我将不得不手动或自动化标记它。
  • 你的项目听起来很有趣——祝你在接下来的阶段好运!
猜你喜欢
  • 2020-04-27
  • 2018-03-01
  • 2018-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多