我有一个简单的神经网络 - 一些线性层,层与层之间以及网络末端之后有 tanh。例如,我有一个形状为 (100, 2) 的输入张量,我希望输出的大小为 (100, 5)。但第一列中的值在 [0, 1] 范围内,也就是说,在末端使用 S 形激活函数是合适的。其他列中的值在 [-1, 1] 范围内,也就是说可以使用“tanh”激活函数。但我不明白如何为第一个输出列设置 S 形,为其他输出设置“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
它。只需定义您自己的类并实现您自己的自定义逻辑,如下所示:虽然您可以尝试 @sachin-hosmani 的答案,但您应该始终在特定范围内对输入进行规范化
(例如 [0, 1] 或 [-1, 1])。对于表格数据,每列都是独立的。 使用不同范围内的值作为输入或使用不同的激活函数作为模型的输出,同时使用相同的损失函数可能会对训练进度产生负面影响。