我有一个简单的神经网络 - 一些线性层,层之间和网络末端之后有 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:])
您不应该为此使用
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)