关于神经网络激活函数的困惑

Confusion about neural networks activation functions

我学习了有关使用 Python 和 Tensorflow 的图像分类器的教程。

我现在正在尝试将深度学习应用于自定义情况。我做了一个sellers/buyers的模拟程序,客户按照自己的意愿购买石头。石头有颜色、大小和曲线百分比。最接近客户希望的石头价值的是,客户能够支付的越多。对于卖家来说,越稀有的石头,价格应该越高。然后该程序会产生 100.000 次购买,以喂养一个神经网络,该网络将试图打败其他卖家。数据集看起来像这样:

我现在正在尝试创建我的神经网络。在本教程中,他使用了两个具有 relu 激活函数的 Conv2D 层和一个 MaxPooling2D,然后是一个 Flatten 层、一个 Dense 层,最后是另一个具有 sigmoid 激活函数的 Dense 层。

在阅读了一些文档后,我发现 Conv2D 层是针对矩阵的,但我的数据已经很平坦了,所以我更喜欢只使用 Dense 层。

我的第一个问题是:我的神经网络是否需要像这样的具有 relu 函数的密集层:

model.add(Dense(64, activation='relu', input_dim(3)))

如果我的程序只生成正值?

我的第二个问题是:如果我已经对数据进行了归一化,通过像这样划分它们使其介于 0 和 1 之间,那么我的神经网络是否需要 sigmoid 函数? :

X[:,0] /= 256.0
X[:,1] /= 50.0
X[:,2] /= 100.0

这些值是每列的最大值。那么我需要一个 sigmoid 函数吗?

实际上我的神经网络是这样的:

model = Sequential()
model.add(Dense(64, activation='relu', input_dim(3)))
model.add(Dense(64, activation='relu'))
model.add(Dense(1,  activation='sigmoid'))

但我对我的模型的效率感到困惑。我的神经网络可以工作吗?如果不是,我必须使用什么样的层和激活函数?

如果您像那样进行归一化(/ max)就可以了,您也可以在输入上使用 sigmoid,但在最大值和最小值上这会不太准确。但我不明白你为什么要使用 Conv2D 层,因为它完全连接只有 4 个输入。此外,如果您完全随机生成数据集,网络将不会学到任何东西

My first question is : does my neural network need a dense layer with a relu function like that :

是的。即使您的数据只是正数,您的网络也需要 ReLU。 ReLU(以及一般的激活函数)的想法是它们增加了一定的复杂性,这样分类器就可以学习泛化。

考虑一个将图像作为输入的 CNN。这里的输入数据也只包含正值([0-1] 或 [0-255]),它们通常有 很多和很多 层,具有 ReLU 非线性。

If my program generates only positives values ?

你的困惑是你的实际 input-output 关系只产生正值,但你的 分类器 仍然包含可能为负的权重,所以你的层输出可能仍然是否则为负。

此外,如果您没有像 ReLU 这样的非线性,那么拥有多层就没有意义,因为它们不会增加分类器的复杂性。

second question is : does my neural network need a sigmoid function if I already normalized my data to make them between 0 and 1 by dividing them like this?

是的。您还需要乙状结肠。道理同上。您的数据可能是正数,但您的输出层仍然能够产生负值或超出预期范围的值。

具有线性输出激活函数会使学习变得几乎不可能,尤其是当您的输出范围在 [0,1] 内时。