gpt4 book ai didi

python - 使用神经网络学习分类值的分布

转载 作者:行者123 更新时间:2023-11-30 08:57:08 25 4
gpt4 key购买 nike

使用神经网络学习分类值的分布

目的是使用神经网络对一维输入进行分类。有两个类需要分类,AB。用于确定类别的每个输入都是 0.01.0 之间的数字。

A 类 的输入值均匀分布在 01 之间,如下所示: class A distribution

B 类 的输入值均在 0.40.6 范围内,如下所示:

class B distribution

现在我想训练一个神经网络,它可以学习将 0.40.6 范围内的值分类为 B 和其余的作为A。所以我需要一个可以近似一个类的上限和下限的神经网络。我之前的尝试并不成功 - 神经网络总是为所有输入返回 50% 的概率,并且损失在历元期间不会减少。

在 Python 中使用 Tensorflow 和 Keras,我训练了如下简单模型:

model = keras.Sequential([
keras.layers.Dense(1),
keras.layers.Dense(5, activation=tf.nn.relu),
keras.layers.Dense(5, activation=tf.nn.relu),
keras.layers.Dense(2, activation=tf.nn.softmax)
])
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])

(完整的训练脚本链接如下)

顺便说一句,我想象神经网络的工作方式是这样的:有些神经元的放电强度仅低于 0.4,有些神经元的放电强度仅高于 0.6。如果这组神经元中的任何一组被触发,则它是 A 类,如果两者都不触发,则它是 B 类。不幸的是,事实并非如此。

如何使用神经网络对上述输入进行分类?

--

示例脚本:https://pastebin.com/xNJUqXyU

最佳答案

此处模型架构中的一些内容可以进行更改。

首先,损失不应该是loss='mean_squared_error' ,最好使用loss='binary_crossentropy' ,它更适合二元分类问题。我不会在这里解释其中的区别,这是可以在 Keras 文档中轻松查找到的内容。

您还需要更改最后一层的定义。您只需要最后一个节点,这将是属于类别 1 的概率(因此拥有属于类别 0 的概率的节点是多余的),并且您应该使用 activation=tf.nn.sigmoid而不是softmax。

您可以做的其他事情是定义类别权重来处理数据的不平衡问题。考虑到您在此处定义样本的方式,将类别 0 的权重设为类别 1 的 4 倍是有意义的。

完成所有这些更改后,您应该得到如下所示的内容:

model = keras.Sequential([
keras.layers.Dense(1),
keras.layers.Dense(5, activation=tf.nn.relu),
keras.layers.Dense(5, activation=tf.nn.relu),
keras.layers.Dense(1, activation=tf.nn.sigmoid)
])

model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

model.fit(np.array(inputs_training), np.array(targets_training), epochs=5, verbose=1, class_weight = {0:4, 1:1})

这使我在验证集上的准确率达到 96%,并且每个时期确实减少了损失。

(顺便说一句,在我看来,决策树更适合这里,因为它的行为明确地像您描述的那样执行分类)

关于python - 使用神经网络学习分类值的分布,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55821155/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com