今天看一点在外人看来也许是非常简单的代码,但是越看越模糊,直到查了一些资料才基本搞明白。没办法,小白前进的路上总会有各种崎岖。

相关代码链接:https://github.com/zergtant/pytorch-handbook/blob/master/chapter3/3.1-logistic-regression.ipynb

首先,在数据准备阶段,作者使用german.data-numeric中的前900条用作训练,后100条用作测试,因此有如下代码:

train_data=data[:900,:l-1]
train_lab=data[:900,l-1]-1
test_data=data[900:,:l-1]
test_lab=data[900:,l-1]-1

注意,这里为什么需要在label中-1呢?打开原始数据看一下就明白了,主要原因是原始的数据标签范围是1和2,而在代码中使用的是sigmoid函数,其对应的范围是0-1,因此需要把原始的label-1.这不是最让我困惑的!

在测试集上计算准确率时,作者有如下代码:

def test(pred,lab):
    t=pred.max(-1)[1]==lab
    return torch.mean(t.float())

pred.max(-1)[1]是什么意思呢?注意原始网络的变换是nn.Linear(24,2)即由24个维度变换到2个维度,因此对每一个测试样本而言,其都会对应一个2维向量表示其属于第1维或第2维对应分类的概率。在批处理(batch)是情况下,神经网络的输出pred应该是样本个数*2的一个矩阵。因此,max(-1)中的-1表示按照最后一个维度(行)求最大值,即求每一个样本(每一行)概率的最大值。然后pred.max(-1)[1]中的方括号[1]则表示返回最大值的索引,即返回0或者1,正好与我们原始数据的label相对应。然后t=pred.max(-1)[1]==lab的返回值为一个长度为样本个数的0,1向量,最后return torch.mean(t.float())恰好为准确率的定义。

 

torch.max()[0], 只返回最大值的每个数

troch.max()[1], 只返回最大值的每个索引

 

也许是我太小白了,我觉得作者的代码写得很精妙!

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐