softmax回归的简洁实现 讨论区


#43

损失函数采用了log函数而log函数在
当yhat很小的时候,相应的损失函数就会求出一个很大的值。进行权重更新的话,更新的权重值会更大。权重的增大不合理 导致预测的yhat更低
如此恶性循环。大概就是这样吧。梯度下降本身是一个寻找最优点的问题。tensorflow中逻辑回归中采用了指数下降的学习率,从而找到凹函数的极值点。极值电处是对权重和偏置的优化停止了吧


#44

奇怪,加不加gluon.nn.Flatten()都不影响拟合呀,这是怎么回事?


#45

前一节Gluon教程里,《线性回归 - 使用Gluon》的net并没有gluon.nn.Flatten(),但那一节和本节中的数据集的结构好像也没有不同,请问为什么在本节中要使用这个Flatten层呢?


#46

根据Dense层的文档,默认也会进行Flatten的,这也解决了我刚刚的疑问 - 有没有开头的Flatten层效果是一样的。


#48

我们仍然使用FashionMNIST。我们将代码保存在…/utils.py这样这里不用复制一遍。

但是其实utils里面的load_data_fashion_mnist跟前面的代码并不一样,比如前面的代码shape是(28, 28, 1),这里用了transpose,而且连维度也不一样,(28, 28, 1)是3维,transpose里面假设的data是4维.能否解释一下transpose的原因,还有维度的变化?


#49

def fun(x):
net = gluon.nn.Sequential()
with net.name_scope():
net.add(gluon.nn.Flatten())
net.add(gluon.nn.Dense(10))
net.initialize()

def main():
这段代码如果是定义在某函数中,在main函数中向net传输数据,并进行训练,是否需要在main函数中将net声明位global?


#50

num_epochs = 5
gb.train_cpu(net, train_iter, test_iter, loss, num_epochs, batch_size, None,None, trainer)

name ‘train_cpu’ is not defined,
gluonbook 已导入,但运行后提示上面信息;另外查了gluonbook,其中只有一个train的函数,gluonbook的版本0.6


#51

对不起看漏了…


#52

使用gluon明显比不使用gluon快好多, 为什么呢?


#53

同样表示好奇。不知道gluon版本的实现做了什么优化呢?


#54

你好,想请教一下,数值更加稳定是指的是什么数据?为什么将两个运算定义在一起,就能提高它的稳定性?


#55

记得没错的话softmax函数里面的运算是指数级的,可能会出现数值溢出的情况,两者放在一起就不会有大的指数级运算,这样数值就更加稳定了


#56

小白入门,请问在运行softmax那节中的evaluate_accuracy(test_iter, net)函数
报错: 如何修改?
AttributeError Traceback (most recent call last)
in ()
----> 1 evaluate_accuracy(test_iter, net)

in evaluate_accuracy(data_iter, net)
1 def evaluate_accuracy(data_iter, net):
2 acc = 0
----> 3 for X, y in data_iter:
4 acc += accuracy(net(X), y)
5 return acc / len(data_iter)

F:\Anaconda\envs\gluon\lib\site-packages\mxnet\gluon\data\dataloader.py in iter(self)
282 # multi-worker
283 return _MultiWorkerIter(self._num_workers, self._dataset,
–> 284 self._batchify_fn, self._batch_sampler)
285
286 def len(self):

F:\Anaconda\envs\gluon\lib\site-packages\mxnet\gluon\data\dataloader.py in init(self, num_workers, dataset, batchify_fn, batch_sampler)
142 args=(self._dataset, self._key_queue, self._data_queue, self._batchify_fn))
143 worker.daemon = True
–> 144 worker.start()
145 workers.append(worker)
146

F:\Anaconda\envs\gluon\lib\multiprocessing\process.py in start(self)
103 ‘daemonic processes are not allowed to have children’
104 _cleanup()
–> 105 self._popen = self._Popen(self)
106 self._sentinel = self._popen.sentinel
107 _children.add(self)

F:\Anaconda\envs\gluon\lib\multiprocessing\context.py in _Popen(process_obj)
221 @staticmethod
222 def _Popen(process_obj):
–> 223 return _default_context.get_context().Process._Popen(process_obj)
224
225 class DefaultContext(BaseContext):

F:\Anaconda\envs\gluon\lib\multiprocessing\context.py in _Popen(process_obj)
320 def _Popen(process_obj):
321 from .popen_spawn_win32 import Popen
–> 322 return Popen(process_obj)
323
324 class SpawnContext(BaseContext):

F:\Anaconda\envs\gluon\lib\multiprocessing\popen_spawn_win32.py in init(self, process_obj)
63 try:
64 reduction.dump(prep_data, to_child)
—> 65 reduction.dump(process_obj, to_child)
66 finally:
67 set_spawning_popen(None)

F:\Anaconda\envs\gluon\lib\multiprocessing\reduction.py in dump(obj, file, protocol)
58 def dump(obj, file, protocol=None):
59 ‘’‘Replacement for pickle.dump() using ForkingPickler.’’’
—> 60 ForkingPickler(file, protocol).dump(obj)
61
62 #

AttributeError: Can’t pickle local object ‘Dataset.transform_first…base_fn’


#57

请参考这里的一个绕开方式,


#58

谢谢您的回复,发现时多线程的问题后,做了这样修改,但是在mlp时也是同样的错误所以就改掉了gluonbook\utls.py里涉及多线程的含少数,坐等更新了 — —


#59

请问你是怎么解决的

import sys

sys.path.append(’…’)

import gluonbook as gb

from mxnet import autograd,gluon,nd

from mxnet.gluon import loss as gloss

D:\Anaconda3\lib\site-packages\h5py_init_.py:36: FutureWarning: Conversion of the second argument of issubdtype from float to np.floating is deprecated. In future, it will be treated as np.float64 == np.dtype(float).type.
from ._conv import register_converters as _register_converters

batch_size = 256

train_iter,test_iter = gb.load_data_fashion_mnist(batch_size)

num_inputs = 784

num_outputs = 10

num_hiddens = 256

W1 = nd.random.normal(scale = 0.01,shape = (num_inputs,num_hiddens))

b1 = nd.zeros(num_hiddens)

W2 = nd.random.normal(scale = 0.01,shape = (num_hiddens,num_outputs))

b2 = nd.zeros(num_outputs)

params = [W1,b1,W2,b2]

for param in params:

param.attach_grad()

def relu(X):

return nd.maximum(X,0)

def net(X):

X = X.reshape((-1,num_inputs))

H = relu(nd.dot(X,W1)+b)

return nd.dot(H,W2) + b2

loss = gloss.SoftmaxCrossEntropyLoss()

gb.train_cpu(net,train_iter,test_iter,loss,num_epochs,batch_size,params,lr)


AttributeError Traceback (most recent call last)
in ()
1 num_epochs = 5
2 lr = 0.5
----> 3 gb.train_cpu(net,train_iter,test_iter,loss,num_epochs,batch_size,params,lr)

AttributeError: module ‘gluonbook’ has no attribute ‘train_cpu’


#60

第二次运行代码后出现:

Reloaded modules:

结果报错为:

AssertionError: HybridBlock requires the first argument to forward be either Symbol or NDArray, but got <class ‘mxnet.ndarray.ndarray.NDArray’>


#61

您好!我在对比阅读“Softmax回归的‘Gluon实现’与‘从零开始实现 ”两节内容时候,动手实现了书中描述的代码,但是对于衡量模型准确率的代码有疑问,麻烦您抽空帮我解答一下:
书中的代码,在gb.train_ch3()函数中使用 bg.evaluate_accuracy()函数来计算预测准确率。
而我按照“每预测正确一个标签,得一分,最后将得分除以测试集的标签数”来设计函数衡量预测准确率(函数如下):

    def pred_accuracy( net, test_iter ):  # 标签预测准确率
        for X, y in test_iter:
            break
        true_labels = gb.get_fashion_mnist_labels(y.asnumpy())
        pred_labels = gb.get_fashion_mnist_labels(net(X).argmax(axis=1).asnumpy())
        acc=0
        for true, pred in zip(true_labels, pred_labels):
            if true==pred: # 预测准确,得一分
                acc += 1
        acc /= len(true_labels)
        return acc

该函数计算得到的结果与 bg.evaluate_accuracy()得到的结果不一致,请问是为什么呢?


#62


损失函数与准确率怎么不与迭代次数具有相关性,而是跳跃变化?最值不是出现在最后一次迭代上


#63

请问我自己建了个load_data_mnist数据集的函数放在utils.py中,通过d2l.load_data_mnist获取数据会出现
’AttributeError: module ‘d2lzh’ has no attribute 'load_data_mnist’的情况下是为什么呢