Softmax回归的从零实现

有没有人在pycharm里遇到过Figure未响应的情况?只在Animator里加了show() 和pause()

class Animator:  #@save
    """在动画中绘制数据"""
    def __init__(self, xlabel=None, ylabel=None, legend=None, xlim=None,
                 ylim=None, xscale='linear', yscale='linear',
                 fmts=('-', 'm--', 'g-.', 'r:'), nrows=1, ncols=1,
                 figsize=(3.5, 2.5)):
        # 增量地绘制多条线
        if legend is None:
            legend = []
        d2l.use_svg_display()
        self.fig, self.axes = d2l.plt.subplots(nrows, ncols, figsize=figsize)
        if nrows * ncols == 1:
            self.axes = [self.axes, ]
        # 使用lambda函数捕获参数
        self.config_axes = lambda: d2l.set_axes(
            self.axes[0], xlabel, ylabel, xlim, ylim, xscale, yscale, legend)
        self.X, self.Y, self.fmts = None, None, fmts

    def add(self, x, y):
        # 向图表中添加多个数据点
        # hasattr() 函数用于判断对象是否包含对应的属性。
        if not hasattr(y, "__len__"):
            y = [y]
        n = len(y)
        if not hasattr(x, "__len__"):
            x = [x] * n
        if not self.X:
            self.X = [[] for _ in range(n)]
        if not self.Y:
            self.Y = [[] for _ in range(n)]
        for i, (a, b) in enumerate(zip(x, y)):
            if a is not None and b is not None:
                self.X[i].append(a)
                self.Y[i].append(b)
        self.axes[0].cla()
        for x, y, fmt in zip(self.X, self.Y, self.fmts):
            self.axes[0].plot(x, y, fmt)
        self.config_axes()
        d2l.plt.show()
        d2l.plt.pause(0.01)
        display.display(self.fig)
        display.clear_output(wait=True)

也遇到了这个问题,应该是数据没有加载成功导致的,原来数据的存放目录没有按照示例的目录放,重新严格按照示例走了一遍,解决了这个错误。

#@save 无法保存特定函数:
如图,在Visual Studio 2022 中按照书上的代码编写了函数和类。
#@save 只在d2l包中保存了class类的内容,format函数的内容d2l包告诉我未找到。(fig 1)

(fig 1)

为什么#@save无法保存书上编写的内容了?请帮帮我,谢谢。

1 Like

你好,这个问题解决了吗,我也遇到同样的问题

已解决:为什么求 cross_entropy 时,切片/索引要采用 range(len(y_hat)) 的形式?我试着换成冒号 : ,但求出的结果会有 nan,导致训练不能继续。

解决方法:找到了 NumPy 的相关文档 Indexing on ndarrays — NumPy v1.26 Manual



请问这里的train_ch3并未在d2l库中,我应该如何解决这个问题呢?

y是向量,y.size().numel()等同于y.numel(),我觉得作者这里用y.size().numel()方法获取标签数是为了兼容不同shape的y

您好 我也遇到了这个问题 请问您知道如何解决么

感觉如果y^很小就应该找其他损失函数了,比如多项式什么的,交叉熵导数那得飞起

问一个很蠢的问题,我是用pycharm来实现这个,在上一节的图像分类数据中,实际上需要最后添加plt.show()来展示图像,这一节要在pycharm中运行,应该也要这样做,但是我找不到添加plt.show()的位置了

程序输出是<Figure size 350x250 with 1 Axes>

支持。书里用了一种简略的、很有个人风格的写法去执行实际很直观的按元素求和。个人认为作为教学用途的代码还是应当以可读性为先,尽量减少此类用法。

如何缩短训练时间,还有怎么查看torch的版本是cpu还是gpu

import torch

print(torch.cuda.is_available())

如果是GPU版本,应该输出 True

1 Like

现在的API那些更新了,有很多都不能直接用了,有考虑更新下代码么

好吧,我也理解错了。。。。。。。。。。。。

我也遇到了这个问题,animation根本显示不出来,各种方法都试了还是不行,请问你解决了么?

损失函数是交叉熵,实际只是把不同的y_hat加起来了。y在softmax中只起到了索引的作用

好像是没有权限新建文件夹?
路径是不是有问题

这里使用自定义优化器的时候是l.sum 而使用内置优化器的时候是l.mean 这是为什么