如何对神经网络进行编程,以便在输入图像时,输出是一个数值,而不是图像属于某个类别的概率?换句话说,一个不分类的 CNN。例如,当输入一张椅子的图像时,模型不应该给出图像是椅子的机会,而是给出椅子的预测年龄、椅子的预测价格等。我是目前不确定如何编写这样的神经网络。
如何创建非分类 CNN 以从图像中获取信息?
这可以被认为是一个损失函数设计问题。如果您针对多类分类等优化网络权重,则期望您的网络学习此任务的权重(您将为此任务使用交叉熵损失)。如果您优化网络以在最后一层输出单个值并将其视为年龄预测的回归问题,那么您的网络可以学习此特定任务的权重(您可以在此处使用均方误差损失之类的东西)。
让我给你一个关于如何做到这一点的弱指导。假设您的输入是椅子的图像,并且您想使用预训练的 resnet 预测它们的年龄,这就是您可以在 pytorch 中执行此操作的方式。
定义
X:输入图片
Y:ground truth 值列表,这里是年龄。即:[1.4, 2.5, 2.2, ....]
修改你的神经网络,在最后一层给出一个输出
model = torchvision.models.resnet18(pretrained=True)
num_ftrs = model.fc.in_features
model.fc = torch.nn.Linear(num_ftrs, 1)
适当地设计你的损失函数。您可以将年龄预测视为标准回归问题。当然,这里有更好的损失设计。
标准 = torch.nn.MSELoss()
所以在训练期间使用这个损失
loss =criteria(output, target) 其中输出是你的神经网络预测,目标是你的真实值。
这是您可以为您的任务修改现有架构的方式。希望能帮助到你。
您通常将 SoftMax 层用作用作分类器的神经网络的输出层。
现在,如果你想让你的神经网络预测椅子的年龄,预测椅子的价格,就像线性回归一样(输出是连续的),你必须移除 SoftMax 层并添加一个或多个层,这样输出最后一层在输出端只给出一个值。(这是对您的年龄或价格的预测)。而且,您可以使用 MSE 进行反向传播,而不是 logit 损失。
因此,就像 keshik 在另一个答案中提到的那样,这完全是关于使用的最后一层和使用的损失函数。根据您使用的内容,您的权重会得到训练。
这也是迁移学习中所做的。根据您想要完成的任务,您可以更改最后一层并重新训练您的网络。