Pytorch实现Softmax和Cross-entropy

Softmax

 将输出归一化到(0,1)区间,可以将Softmax输出当作概率,从而使用Cross Entropy计算 Loss。

def softmax(X):
    X_exp = torch.exp(X)
    partition = X_exp.sum(1, keepdim = True)
    return X_exp / partition

Cross-entropy

 输出为 y_hat[0, 0] 和 y_hat[2, 1] 内的值。

y = torch.tensor([0, 2])
y_hat = torch.tensor([[0.1, 0.3, 0.6], [0.3, 0.2, 0.5]])
y_hat[[0, 1], y]

 假设 y_hat 的每一行都是某个样本的预测概率分布(每一行的和在经过前面的softmax函数之后为1),而 y 中对应的是实际的 label 所对应的下标号码。

def cross_entropy(y_hat, y):
    return -torch.log(y_hat[range(len(y_hat)), y])
cross_entropy(y_hat, y)

计算分类准确率

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())

 首先,如果y_hat是矩阵,那么假定第二个维度存储着每个类别的预测分数。其中len(y_hat.shape) > 1用于判断 y_hat 是否存在第二个维度,如果存在,再通过y_hat.shape[1] > 1判断第二维度的大小是否大于 1。如果大于,那么取出 y_hat 中每一行预测分数最大的下标存入 y_hat 中,之后再将 y_hat 预测出来的类别和真实元素 y 进行比较。由于等式运算符 == 对数据类型很敏感,因此我们将 y_hat 的数据类型转换为与 y 的数据类型一致。结果是一个包含 0(错)和 1(对)的张量。进行求和之后会得到正确的预测数量。

accuracy(y_hat, y) / len(y)

 将函数结果和样本数相除,可以得到预测的准确率。

你可能感兴趣的:(Pytorch个人学习笔记,深度学习)