神经网络学习,因为输出变量中有负数,所以把激活函数从sigmoid变成了tanh,但是预测结果还是只有正数,请问有人知道是怎么回事吗?
以下为ChatGPT回答:
如果你在输出层使用了tanh激活函数,那么理论上输出值的范围应该是[-1, 1]之间。如果你的模型输出只有正数,那么这可能说明你的模型存在问题。
有以下一些可能导致这个问题的原因:
1. 数据预处理不正确:如果你对数据进行了归一化或标准化操作,而且没有正确地将其还原到原始尺度上,那么输出结果可能会受到影响。请检查你的数据预处理代码是否正确,确保数据被还原到正确的尺度上。
2. 模型结构问题:如果你的模型结构不正确,可能会导致输出结果异常。请检查你的模型结构,确保它符合你所需要解决的问题,并且没有出现过拟合或欠拟合等问题。
3. 训练参数设置不当:如果你的训练参数设置不当,可能会导致模型无法收敛或者出现其他问题。请检查你的训练参数,并调整学习率、批大小等参数,以便更好地优化模型。
4. 输出层的激活函数可能未正确定义:请检查你的代码,确认你已经正确地将tanh激活函数用于输出层,并且没有误将其用于其他层。
希望以上信息可以帮到你找出问题所在,祝你好运!
以下回答参考GPT并且由Bony-整理:
即使将激活函数从sigmoid改为tanh,神经网络的输出仍然可能是正数或负数。如果预测结果始终是正数,有可能是以下原因之一:
数据预处理的问题。如果在预处理数据时将所有标签值强制转换为正数,那么训练出的模型也只能预测正数。需要检查数据预处理的代码是否存在这种情况。
模型设计的问题。如果模型的最后一层没有正确配置,则输出结果可能会始终为正数。可以检查模型的最后一层的激活函数和输出维度是否正确。
模型训练的问题。如果模型训练不充分,模型可能无法学习到负数的预测结果。可以检查模型的训练数据是否足够多,并且训练次数是否充足。
总之,需要对模型、数据预处理和训练过程进行仔细的检查,以找到问题所在。
在引入修正线性单元之前,大多数神经网络使用sigmoid函数g(z)=σ(z)g(z)=\sigma(z)g(z)=σ(z),或者双曲正切函数g(z)=tanh(z)g(z)=tanh(z)g(z)=tanh(z)作为激活函数。这两个激活函数密切相关,因为tanh(z)=2σ(2z)−1tanh(z)=2\sigma(2z)-1tanh(z)=2σ(2z)−1 。
与修正线性单元不同,sigmoid单元和tanh单元在其大部分定义域内都饱和,仅仅当zzz在 0 附近才有一个较高的梯度,这会使得基于梯度的学习变得非常困难。因此,现在不鼓励将这两种单元用作前馈神经网络中的激活函数。
有一些网络不能使用修正线性单元,因此sigmoid激活函数是个更好的选择,尽管它存在饱和问题。
根据参考资料中的描述,tanh函数的输出应该是在 -1 和 1 之间的。如果模型的输出仍然只有正数,那么有可能是其他部分代码的问题,例如数据处理、模型定义等。因此,可以尝试进行以下步骤来解决问题:
针对参考资料中的tanh函数的描述,可以通过以下代码尝试画出tanh函数的曲线:
import matplotlib.pyplot as plt
import numpy as np
def tanh(x):
return np.tanh(x)
x = np.linspace(-8, 8, 100)
y = tanh(x)
plt.plot(x, y)
plt.show()
如果正确实现,应该可以看到图像在 -1 和 1 之间来回震荡。如果图像偏移了或不对称,说明可能存在其他的问题。