python - 关于神经网络激活函数的困惑
问题描述
我遵循了一个关于使用 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'))
但我对我的模型的效率感到困惑。我的神经网络可以工作吗?如果没有,我必须使用什么样的层和激活函数?
解决方案
我的第一个问题是:我的神经网络是否需要具有这样的 relu 函数的密集层:
是的。即使您的数据只是正面的,您的网络也需要 ReLU。ReLUs(和一般的激活函数)的想法是它们增加了一定的复杂性,这样分类器就可以学会泛化。
考虑一个将图像作为输入的 CNN。这里的输入数据也仅包含正值([0-1] 或 [0-255]),它们通常具有许多层,具有 ReLU 非线性。
如果我的程序只产生正值?
您的困惑是您的实际输入-输出关系仅产生正值,但您的分类器仍然包含可能为负的权重,因此您的层输出仍然可能为负。
此外,如果你没有像 ReLU 这样的非线性,那么拥有多个层就没有意义,因为它们不会给你的分类器增加复杂性。
第二个问题是:我的神经网络是否需要一个 sigmoid 函数,如果我已经对我的数据进行了归一化,通过像这样划分它们使它们介于 0 和 1 之间?
是的。你还需要乙状结肠。道理同上。您的数据可能是正数,但您的输出层仍然能够产生负值或超出预期范围的其他值。
具有线性输出激活函数将使学习几乎不可能,特别是如果您的输出范围在 [0,1] 内。
推荐阅读
- symfony - Symfony2,每次在第一次尝试网站上的空白页面,重新加载/刷新其工作后
- spring - 如何使用 Spring OAuth2 在启用了 Spring mvc 应用程序的 SSO 上单点注销?
- asp.net-mvc-5 - 如何在 asp.net mvc 5 中修复“模型代码生成器”
- mysql - 在 MySQL 客户端/服务器协议中,压缩包是如何拆分的?
- css - 在电子邮件中的 css 边框三角形中居中文本
- arrays - 从数组中找到2个数字的最小绝对和
- python - 运行使用pyinstaller制作的exe文件时出错
- mysql - WHERE 条件下的 SQL SUBSTRING
- arrays - 如何以具有字段值的角度返回嵌套对象数组的特定字段?
- asp.net-core - 如何从 MVC 控制器使用 Azure 函数