softmax回归的简洁实现 讨论区


#64

大家好我是一个初学者。本章的第一个练习就遇到了问题。
在实践“softmax回归的简洁实现”的时候,发现jupyter会卡在d2l.train_ch3()的执行行长期无法结束,并且也没有任何输出。
包括使用附带源码d2l-zh-1.0/chapter_deep-learning-basics/softmax-regression-gluon.ipynb也是一样的现象。

有些怀疑是mxnet的问题。我是使用conda安装的mxnet 1.2.1版本,MacOS10.14.5,没有使用GPU。
另外,用keras实现的同样数据集同样模型可以在几秒之内正常训练完毕。

请问这可能是哪个层面的问题?如何准确定位?
谢谢帮助!


#65

一直对 这里求损失的方法 loss 不是很明白,预测值y_hat 返回的形状是(256,10),真实值y的形状是(10),并且真实值 y 里返回的是标量。网络预测的时候一个样本返回的是一个包含10个概率的张量,loss 方法里是把最大值所在的位置和真实值比较是否相等来判断是否预测成功。是不是哪里会把真实值标量转换成张量格式,比如真实值1转换成[0,1,0,0,0,0,0,0,0,0],网络是怎么把张量和标量关联起来的,就是对这里不太明白,请赐教,谢谢!
def train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size,
params=None, lr=None, trainer=None): for epoch in range(num_epochs):
train_l_sum = 0 train_acc_sum = 0
for X, y in train_iter:
with autograd.record(): y_hat = net(X)
l = loss(y_hat, y)


#66

那就先快后慢吧。不过我觉得这个只有一层网络,精度已经提升不了。我试过加大训练次数,学习率减小,batch_size加大。损失怎么都在0.4以上,精度0.85左右。


#67

已经下降不了了,只有一层网络,估计到极限了。


#68

:joy:简洁实现那里,并没有对预测数据进行softmax,除了在loss里面,不过这里并没啥影响


#69

你这个函数只是计算了一个batch的准确率,可是evaluate_accuracy()计算的整个训练/测试集的准确率呀,计算的对象都不一样,数值肯定不同


#70

来自小白的疑问:查找实现的源码时,确实能找到这些函数/类定义,比如说这节的SoftmaxCrossEntropyLoss(Loss):这个类,但是想要看其实现原理,即内部的成员函数时,成员函数中使用的函数,却不知道去哪里找,比如说上面的类中有一个pred = F.log_softmax(pred, self._axis),这个log_softmax()找不到在哪里,不知道其具体的实现细节,还望有经验的大佬能指教指教!!!对于很多类中都有的self,同样也不知道她是什么,貌似她有很多成员函数,但是也不知道去哪里找她的具体定义、实现


#71

对于 分开定义softmax运算和交叉熵损失函数可能会造成数值不稳定 , 能不能举个例子,不是特别明白


#72


这些都是固定写法吗?


#73

请大家帮忙解惑:首先请先看两行代码:(抱歉访客只能贴一张图)
from mxnet.gluon import loss as gloss, nn

loss = gloss.SoftmaxCrossEntropyLoss()

num_epochs = 5
d2l.train_ch3(net, train_iter, test_iter, loss, num_epochs, batch_size, None,
None, trainer)

loss很明显是一个对象,我查看了源码,也没有看到类中有call方法,为什么可以直接使用loss这么一个类的实例+()来构成一个函数呢?源码如下图

我对Python面向对象不是很了解,希望大家能够帮忙解惑,谢谢大家。