Relu神经网络输出预测全为0或1,对所有输入样本的预测概率也相同

现有一个使用Relu激活函数的网络,训练过程中发现,它对所有的输入样本都输出一样的预测概率,比如二分类,对所有样本的预测概率都是[0.4,0.6]。由于预测概率都一样,因此预测标签也都一样,全预测为0或1。

一开始以为是不是网络结构搭建有问题,因为当网络参数确定后,不同的输入样本的输入数据不一样,那么输出的预测概率肯定不一样,怎么会全输出一样的概率。然后一层一层找原因,发现某一卷积层的输出值全为0。经过分析,该层使用的是Relu激活函数,而且该层训练后的权值W和偏置b都是负数,这样,输入在这一层的卷积运算结果全为负值,再经过Relu激活函数后,这一层的输出值就全为0。因此,不管输入样本是什么,经过该层后的输出都为0,从而导致网络最终输出的预测概率和输入样本完全没有关系,此时输出概率取决于这一层后面层的偏置参数b。

解决方法:

换一种网络参数的初始化方法,或者改变初始化方法中的参数(比如使用正态初始化的话可以尝试改变方差)

网络参数的初始化方法:

https://blog.csdn.net/weixin_38314865/article/details/106049511

在PyTorch中,我们可以使用`nn.Module`类来创建一个简单的前馈神经网络(Feedforward Neural Network),用于5维输入预测1维输出。以下是一个基本的BP(反向传播)神经网络模型的示例: ```python import torch import torch.nn as nn class SimpleNN(nn.Module): def __init__(self, input_dim=5, hidden_dim=10, output_dim=1): super(SimpleNN, self).__init__() self.fc1 = nn.Linear(input_dim, hidden_dim) # 第一层全连接层 self.relu = nn.ReLU() # 激活函数 self.fc2 = nn.Linear(hidden_dim, output_dim) # 输出层 def forward(self, x): out = self.fc1(x) out = self.relu(out) prediction = self.fc2(out) return prediction # 初始化模型 model = SimpleNN() # 假设我们有一个大小为(批量大小, 5)的输入数据 tensor input_data = torch.randn((batch_size, 5)) # 前向传播计算预测值 output = model(input_data) # 对于回归任务,通常直接使用均方误差(MSE)作为损失函数 loss_fn = nn.MSELoss() loss = loss_fn(output, target_tensor) # 将实际标签替换为 'target_tensor' # 反向传播更新权重 optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) optimizer.zero_grad() loss.backward() optimizer.step() ``` 在这个例子中,`fc1` 和 `fc2` 分别代表输入到隐藏层和隐藏层到输出层的线性变换,ReLU激活函数用于引入非线性。在训练过程中,我们首先计算预测值,然后计算实际输出预测之间的MSE,最后通过反向传播算法调整模型参数。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值