0
点赞
收藏
分享

微信扫一扫

Softmax回归--分类--有监督

jjt二向箔 2024-09-14 阅读 17

输出和类别的维度一样。

一、当我们想将先线性层的输出直接视为概率,存在一些问题:

1.不能限制输出数字总和为1。

2.不能保证都是正数。

所以会使用softmax进行归一化。

二、交叉熵损失

交叉熵是一个衡量两个概率分布之间差异的很好的度量,它测量给定模型编码数据所需的比特数。

三、

在训练softmax回归模型后,给出任何样本特征,我们可以预测每个输出类别的概率。

通常我们使用预测概率最高的类别作为输出类别。

如果预测与实际类别(标签)一致,则预测是正确的。

四、手搓代码

随机初始化weight,拟合线性模型,把输出y进行softmax得到每一类的概率。取得最高的作为输出类别,然后进行交叉损失和梯度下降。

五、

def accuracy(y_hat, y):  

    """计算预测正确的数量"""

    if len(y_hat.shape) > 1 and y_hat.shape[1] > 1:

        y_hat = y_hat.argmax(axis=1)

    cmp = y_hat.type(y.dtype) == y

    return float(cmp.type(y.dtype).sum())

def evaluate_accuracy(net, data_iter):  

    """计算在指定数据集上模型的精度"""

    if isinstance(net, torch.nn.Module):

        net.eval()  # 将模型设置为评估模式

    metric = Accumulator(2)  # 正确预测数、预测总数

    with torch.no_grad():

        for X, y in data_iter:

            metric.add(accuracy(net(X), y), y.numel())

    return metric[0] / metric[1]

class Accumulator:  #@save

    """在n个变量上累加"""

    def __init__(self, n):

        self.data = [0.0] * n

    def add(self, *args):

        self.data = [a + float(b) for a, b in zip(self.data, args)]

    def reset(self):

        self.data = [0.0] * len(self.data)

    def __getitem__(self, idx):

        return self.data[idx]

举报

相关推荐

0 条评论