是否可以在神经网络的最后一层为不同的输出设置不同的激活函数?

问题描述 投票:0回答:1

我有一个简单的神经网络 - 一些线性层,层之间和网络末端之后有 tanh。例如,我的输入张量的形状为 (100, 2),我希望输出的大小为 (100, 5)。但第一列的值在 [0, 1] 范围内,即适合在最后使用 sigmoid 激活函数。另一列中的值在 [-1, 1] 范围内,即可以使用“tanh”激活函数。但我不明白如何设置第一个输出列的 sigmoid 和另一个输出的“tanh”?是否可以?或者,我应该对输出中的第一列应用 abs() 并在最终线性层之后设置“tanh”?

感谢您的帮助!

现在我有了下一个型号:


nn.Sequential(nn.Linear(input_size, hidden_size),
nn.Tanh(),
nn.Linear(hidden_size, output_size),
nn.Tanh())

y = model(x)
y[:,0] = torch.abs(y[:,0])

但我想要:

model = nn.Sequential(nn.Linear(input_size, hidden_size),
nn.Tanh(),
nn.Linear(hidden_size, output_size))

并对第一个输出应用 nn.Sigmoid() ,对其他输出应用 nn.Tanh() :

y = model(x)
act_1 = nn.Sequential(nn.Sigmoid())
act_2 = nn.Sequential(nn.Tanh())

y[:,0] = act_1(y[:,0])
y[:,1:] = act_2(y[:,1:])
pytorch neural-network
1个回答
0
投票

您不应该为此使用

Sequential
。像这样定义你自己的类

import torch
import torch.nn as nn

class CustomModel(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super(CustomModel, self).__init__()
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.fc2 = nn.Linear(hidden_size, output_size)
        self.tanh = nn.Tanh()
        self.sigmoid = nn.Sigmoid()
    
    def forward(self, x):
        x = self.tanh(self.fc1(x))
        
        x = self.fc2(x)
        
        # Sigmoid for the first column
        x[:, 0] = self.sigmoid(x[:, 0])
        # Tanh for the rest of the columns
        x[:, 1:] = self.tanh(x[:, 1:])
        
        return x

input_size = 2
hidden_size = 10
output_size = 5
model = CustomModel(input_size, hidden_size, output_size)

x = torch.randn(100, 2)

y = model(x)
print(y)
© www.soinside.com 2019 - 2024. All rights reserved.