0

我正在尝试在 python 3 中使用 TFLearn 编写神经网络,但我遇到了与标签相关的问题。神经网络的输入是长度为 11 的一维向量。对应于这些输入的标签也是长度为 11 的一维向量。但是,它们的值不是 0 和 1。通常在大多数示例中,标签由 [1,0 ] 或 [0,1] 就像分类猫和狗的图像时一样。但是,我的情况更独特,我需要使用看起来像 [4,9,11,2,1,6,4,6,10,1,0] 的标签向量。有许多不同的标签类型,而不仅仅是典型示例中的 2 种,而且我无法根据由 0 和 1 组成的向量重新编码我的标签。我的问题是,当以显示的形式使用标签时,它似乎不起作用。基本上,我想知道为什么会这样,以及如何让 TFLearn 正确处理这个问题。当我训练神经网络时,我的准确率通常约为 78%。但是,当我尝试使用 .predict() 函数时,它会输出一个包含所有小于 1 的值的向量。例如,它可能会输出 [0.3747585,0.0034589,0.06857,0.00384,0.001133,0.04858,0.00045737,0.0068587,0.00100102, 0.00066543,0.033322]。

我的标签向量中的值始终是 0 到 11 之间的整数。所以我期待一个输出也有这个范围内的值,但它输出的值在 0 到 1 之间。我该如何解决这个问题?到目前为止,我已经尝试将标签中的每个值除以 11,这样 [4,9,11,2,1,6,4,6,10,1,0] 将变为 [4/11,9/11, 11/11,2/11,1/11,6/11,4/11,6/11,10/11,1/11,0/11]。但是,这似乎也不起作用。我仍然得到大约 78% 的准确度结果和 0 到 1 的输出向量,但它的行为类似于过度拟合。我不确定我是否以编程方式做错了,使用了错误的程序,或者它是否真的过度拟合。下面是我使用的 TFLearn 代码。

#NN starts
net = tflearn.input_data(shape=[None, len(input[0])])
net = tflearn.fully_connected(net, 32)
net = tflearn.fully_connected(net, 32)
net = tflearn.fully_connected(net, len(labels[0]), activation='softmax')
net = tflearn.regression(net)

# Define model
model = tflearn.DNN(net)

# Start training (apply gradient descent algorithm)
model.fit(input, labels, n_epoch=10, batch_size=16, show_metric=True)

#Predict
pred = model.predict(testvector)
print('output = ', pred)`
4

1 回答 1

0

输出预测值在0 到 1之间的原因是您使用的是softmax激活函数。Softmax 函数为 [0,1] 范围内的每个输出节点分配一个概率,加起来为 1。因此您不会得到任何整数值作为输出。归一化(即:除以 11)也不起作用,因为每个输出值彼此独立。

您可以通过以下方式将您的问题转换为多类多标签分类问题:

  1. 对于您的输出标签,将每个数字转换为由四位数字组成的二进制(因为最大值为 11,需要 4 个二进制位)。例如:[4, 9, ...] 变为 [0100, 1001, ...]

  2. 将每个二进制数字作为一个类。所以你的问题变成了分类问题。例如: [0100, 1001, ...] 变为 [0, 1, 0, 0, 1, 0, 0, 1, ...] 其中每四位数字将代表您实际输出的数量。

  3. 这种方式将您的训练和测试数据集标签转换为二进制数字数组。

  4. 然后在您的模型中,您可以使用sigmoid激活函数,而不是使用softmax激活函数。Sigmoid函数会为每个输出节点分配一个[0,1]范围内的概率(概率的总和不一定是1)。因此,在训练您的模型之后,您的预测输出应如下所示:[0.0012, 0.7890, 0.0001, 0.0100, 0.8801, 0.0030, 0.0440, 0.9120, ...]。

  5. 选择适当的阈值将您的预测转换为二进制数字。例如:如果我们选择 0.5 作为阈值,则输出变为: [0, 1, 0, 0, 1, 0, 0, 1, ...] 然后您可以将每四位数字视为实际输出的单个数字标签。

于 2019-08-19T08:11:55.327 回答