softmax 回归的从零开始实现 讨论区


#213

例如:
pip install mxnet==1.4


#214

谢谢~~


#215

看了3.15之后回过头来试图把所有参数初始化为同一个数,然后发现在十分类问题中似乎没有什么问题。。。更大的问题是一旦
W=nd.ones(shape=(num_inputs, num_outputs))
或者
W = nd.random.normal(scale=1, shape=(num_inputs, num_outputs))+1
即以1为中心设置weights后,loss直接nan
(如果是*0.05就没有问题)
考虑用3.7里框架的实现测试这个问题,即将参数初始化为1
net.initialize(init.One())
结果发现这里训练得非常好非常正常,毫无问题
于是考虑是否是softmax和交叉熵的简单实现导致出nan,将3.6中的loss也改为gloss.SoftmaxCrossEntropyLoss()
然后。。。。
QQ%E6%88%AA%E5%9B%BE20190803225119
这就让我很费解。。。。按理3.7和3.6里面只有loss和net的实现有区别吧,难道框架里的net还有什么过人之处?而3.6里由于参数初始化的偏差导致nan,又是什么原因呢?


#216

你说的也正是我很疑惑的地方。我为这个问题已经整了两天了还是没闹明白为什么这里有一个.sum,而之前线性回归都可以没有的。会不会是mxnet在自动求梯度方面有个bug?
真心希望懂的朋友能帮忙解答一下为什么这里会有sum而在什么情况下需要sum,不胜感激!


#217

这里有sum()是显式地告诉你最终损失函数值是需要求和之后,再求梯度的,不用也可以,因为l.backward()这句话源码里面会有sum(),这个在前面已经介绍过了


#218

非常感谢你的回复!
只是我和之前提出问题的那个朋友都尝试过不写sum,结果却出现了直接报错的情况。你试过没有啊?如果没有出错,会不会是你用的mxnet版本和我们的不一样呢?我用的是14版的。
如果需要的话回头我把我这边显示的错误贴出来。
ps:我是个小白中的小白,如果犯傻了的话请多多体谅。。。


#219

我也试了一下也报错,我的报错是:train_l_sum += l.asscalar()这句话中的 l 不是scalar类型的,如果你的报错也是这个的话,我猜想可能是下面的原因导致的:因为你上面把.sum()去掉了,所以下面这里的 l 应该仍然是一个向量,不是一个可以直接相加的数,无法正常相加。你要注意的是,示例代码中有.sum(),所以对于下面所有的 l 来说,l 都是一个单个值的张量,而如果这句话去掉了,虽然l.backward()里面会执行.sum()的操作,但是并不改变 l 本身,所以出了l.backward()这句话,l 仍然是一个batch_size大小的向量,里面的数据没有相加。希望能帮助到你


#220

老师在练习里面提的问题,都没有人关注吗…


#221

不记得前面的同学回答过这些练习了没有。
我以为的是:exp(50)太大了应该会溢出;对数要求输入值必须大于0.所以exp的输入应该要类似归一化一下吧?对数那边应该要relu一下吧?


#222

多谢热心帮助。我又试了一下,改成下面这样子(在下面使用l的地方做了sum,没有报错了)。

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, train_acc_sum, n = 0.0, 0.0, 0
for X, y in train_iter:
with autograd.record():
y_hat = net(X)
#l = loss(y_hat, y).sum()
l = loss(y_hat, y)
l.backward()
if trainer is None:
d2l.sgd(params, lr, batch_size)
else:
trainer.step(batch_size) # “softmax回归的简洁实现”一节将用到
y = y.astype(‘float32’)
#train_l_sum += l.asscalar()
l_sum = l.sum()
train_l_sum += l_sum.asscalar()
train_acc_sum += (y_hat.argmax(axis=1) == y).sum().asscalar()
n += y.size
test_acc = evaluate_accuracy(test_iter, net)
print(‘epoch %d, loss %.4f, train acc %.3f, test acc %.3f’
% (epoch + 1, train_l_sum / n, train_acc_sum / n, test_acc))

结果跑出了nan。你有遇到这种情况吗?
epoch 1, loss nan, train acc 0.147, test acc 0.100
epoch 2, loss nan, train acc 0.100, test acc 0.100
epoch 3, loss nan, train acc 0.100, test acc 0.100
epoch 4, loss nan, train acc 0.100, test acc 0.100
epoch 5, loss nan, train acc 0.100, test acc 0.100


#223

我没有发生这种状况:joy:,改变之后我的运行结果和原来的很相似,没有问题。你看看按照例程来运行代码,是不是也是这样,如果也是这样的话,那应该是超参数等问题,看看修改一下超参数能不能好点


#224

之前忘了回复了。。多谢你的热心帮忙!最近研究“房价”去了,所以没有再纠结这事了。等回头复习我再去试试。再次感谢!:slightly_smiling_face:


#226



初学小白一枚,请问下老师,这个是什么原因呢?谢谢!


#227

是下载超时了。你可以翻翻上面的讨论或上一节的讨论,应该有解决的办法。


#228

可以直接复制链接下载,再copy到指定目录下。


#229

把后面的两个"…"去掉


#230

准确度有点低呀。是我哪里错了吗?


#231

plt.subplots函数有两个return值,这里表示忽略第一个return值, 只要第二个值。这句还可以改成:figs = plt.subplots(1, n, figsize=(15, 15))[1]


#232

各位大神,请问有没有出现过fashion_mnist的图片不能显示的情况?我的错误代码如下:
NotImplementedError: Implement enable_gui in a subclass


#233

请问,为什么net被随机初始化了?还有模型的准确率为什么是类别个数的倒数???真心不动懂了。。。