首页 > 解决方案 > 关于神经网络激活函数的困惑

问题描述

我遵循了一个关于使用 Python 和 Tensorflow 的图像分类器的教程。

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

数据集

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

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

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

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

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

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

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'))

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

标签: pythontensorflowneural-networkactivation-functiondata-layers

解决方案


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

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

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

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

您的困惑是您的实际输入-输出关系仅产生正值,但您的分类器仍然包含可能为负的权重,因此您的层输出仍然可能为负。

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

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

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

具有线性输出激活函数将使学习几乎不可能,特别是如果您的输出范围在 [0,1] 内。


推荐阅读