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

时间:2018-11-13 03:02:35

标签: python tensorflow keras conv-neural-network

我想对未标记的数据进行CNN训练,从我在Keras / Kaggle / TF文档或Reddit线程上阅读的内容来看,我似乎必须预先标记我的数据集。有没有办法在无人监督的情况下训练CNN?
我不明白如何初始化 y_train y_test (其中y_train和y_test代表通常的含义)
有关我的数据集的信息如下:

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

第一个示例:输出-(1、4、5、6、7、9) First example image

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

  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_train x_test 。但是我无法理解如何设置 y_train y_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)

预先感谢您阅读本书并帮助我!

1 个答案:

答案 0 :(得分:0)

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

在您给我们的情况下,看起来有点像您知道哪些要素很重要(也就是说,要激活一个分区,总和必须大于0)。神经网络不需要真正学习任何东西即可完成其工作。尽管在此过程中似乎不需要使用神经网络,但鉴于输入数据的大小,对您来说自动化它确实很有意义! :)

但是,让我知道我是否误解了您的情况?

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