Task 2

@pytorch深度学习预备知识

数据操作

在这里插入图片描述
1、首先在学长的帮助下,我学会了如何配置环境,包括下载d21库和torch库。
2、然后是学习了一些numpy库的基础知识,比如如何创建张量、如何访问它的大小等。
Task 2_第1张图片
3、紧接着是一些运算符,包括逻辑运算符和算术运算符,与C语言基本一致,同时我了解到了如何把两个torch张量连接起来。代码如下:Task 2_第2张图片
4、我理解的广播机制就是两个不同形状的矩阵在做运算时pytorch会自动扩展向量。在这里插入图片描述
5、我认为比较难以理解的是节省内存这一小节,在通过观看李沐老师的视频讲解后才有一点理解。Task 2_第3张图片

数据预处理

1、首先我学会了如何读取数据集:
创建一个人工数据集,并存储在CSV(逗号分隔值)文件 …/data/house_tiny.csv中。 以其他格式存储的数据也可以通过类似的方式进行处理。 下面我们将数据集按行写入CSV文件中。

import os
os.makedirs(os.path.join('..', 'data'), exist_ok=True)
data_file = os.path.join('..', 'data', 'house_tiny.csv')    #先在本地创建一个文件
with open(data_file, 'w') as f:
    f.write('NumRooms,Alley,Price\n')                       # 再把数据写入
    f.write('NA,Pave,127500\n')  
    f.write('2,NA,106000\n')
    f.write('4,NA,178100\n')
    f.write('NA,NA,140000\n')
Copy to clipboard

要从创建的CSV文件中加载原始数据集,我们导入pandas包并调用read_csv函数。该数据集有四行三列。其中每行描述了房间数量(“NumRooms”)、巷子类型(“Alley”)和房屋价格(“Price”)。

import pandas as pd
data = pd.read_csv(data_file)
print(data)                                                 #用pandas库读取文件

Task 2_第4张图片
2、处理缺失值
一般是使用删除法和插值法。Task 2_第5张图片

线性代数

1、如何创建矩阵并且如何求其转置:
Task 2_第6张图片
2、我理解了深浅拷贝的区别。
***浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存(分支)。浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。

***深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象,是“值”而不是“引用”(不是分支)拷贝第一层级的对象属性或数组元素递归拷贝所有层级的对象属性和数组元素深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。
Task 2_第7张图片
Task 2_第8张图片
Task 2_第9张图片
3、矩阵点积、向量积、矩阵乘法
Task 2_第10张图片
4、范数
Task 2_第11张图片

微积分

1、通过学习书本我复习了一遍数学分析的求导数、偏导数和积分等知识,并且学会了如何用jupyter来绘图、标注坐标轴。
Task 2_第12张图片

def use_svg_display():  #@save
    """使用svg格式在Jupyter中显示绘图"""
    backend_inline.set_matplotlib_formats('svg')
def set_figsize(figsize=(3.5, 2.5)):  #@save
    """设置matplotlib的图表大小"""
    use_svg_display()
    d2l.plt.rcParams['figure.figsize'] = figsize
    #@save
def set_axes(axes, xlabel, ylabel, xlim, ylim, xscale, yscale, legend):
    """设置matplotlib的轴"""
    axes.set_xlabel(xlabel)
    axes.set_ylabel(ylabel)
    axes.set_xscale(xscale)
    axes.set_yscale(yscale)
    axes.set_xlim(xlim)
    axes.set_ylim(ylim)
    if legend:
        axes.legend(legend)
    axes.grid()
#@save
def plot(X, Y=None, xlabel=None, ylabel=None, legend=None, xlim=None,
         ylim=None, xscale='linear', yscale='linear',
         fmts=('-', 'm--', 'g-.', 'r:'), figsize=(3.5, 2.5), axes=None):
    """绘制数据点"""
    if legend is None:
        legend = []

    set_figsize(figsize)
    axes = axes if axes else d2l.plt.gca()

    # 如果X有一个轴,输出True
    def has_one_axis(X):
        return (hasattr(X, "ndim") and X.ndim == 1 or isinstance(X, list)
                and not hasattr(X[0], "__len__"))

    if has_one_axis(X):
        X = [X]
    if Y is None:
        X, Y = [[]] * len(X), X
    elif has_one_axis(Y):
        Y = [Y]
    if len(X) != len(Y):
        X = X * len(Y)
    axes.cla()
    for x, y, fmt in zip(X, Y, fmts):
        if len(x):
            axes.plot(x, y, fmt)
        else:
            axes.plot(y, fmt)
    set_axes(axes, xlabel, ylabel, xlim, ylim, xscale, yscale, legend)
x = np.arange(0, 3, 0.1)
plot(x, [f(x), 2 * x - 3], 'x', 'f(x)', legend=['f(x)', 'Tangent line (x=1)'])

Task 2_第13张图片
2、Python控制流的梯度计算
使用自动微分的一个好处是: 即使构建函数的计算图需要通过Python控制流(例如,条件、循环或任意函数调用),我们仍然可以计算得到的变量的梯度。 在下面的代码中,while循环的迭代次数和if语句的结果都取决于输入a的值。
Task 2_第14张图片

概率论知识回顾

1、简单地说,机器学习就是做出预测。

根据病人的临床病史,我们可能想预测他们在下一年心脏病发作的概率。 在飞机喷气发动机的异常检测中,我们想要评估一组发动机读数为正常运行情况的概率有多大。 在强化学习中,我们希望智能体(agent)能在一个环境中智能地行动。 这意味着我们需要考虑在每种可行的行为下获得高奖励的概率。 当我们建立推荐系统时,我们也需要考虑概率。 例如,假设我们为一家大型在线书店工作,我们可能希望估计某些用户购买特定图书的概率。 为此,我们需要使用概率学。 有完整的课程、专业、论文、职业、甚至院系,都致力于概率学的工作。 所以很自然地,我们在这部分的目标不是教授整个科目。 相反,我们希望教给读者基础的概率知识,使读者能够开始构建第一个深度学习模型, 以便读者可以开始自己探索它。

现在让我们更认真地考虑第一个例子:根据照片区分猫和狗。 这听起来可能很简单,但对于机器却可能是一个艰巨的挑战。 首先,问题的难度可能取决于图像的分辨率。
Task 2_第15张图片
如图所示,虽然人类很容易以像素的分辨率识别猫和狗, 但它在像素上变得具有挑战性,而且在像素下几乎是不可能的。 换句话说,我们在很远的距离(从而降低分辨率)区分猫和狗的能力可能会变为猜测。 概率给了我们一种正式的途径来说明我们的确定性水平。 如果我们完全肯定图像是一只猫,我们说标签是”猫”的概率,表示为”猫”等于。 如果我们没有证据表明“猫”或“狗”,那么我们可以说这两种可能性是相等的, 即”猫””狗”。 如果我们不十分确定图像描绘的是一只猫,我们可以将概率赋值为”猫”。

现在考虑第二个例子:给出一些天气监测数据,我们想预测明天北京下雨的概率。 如果是夏天,下雨的概率是0.5。

在这两种情况下,我们都不确定结果,但这两种情况之间有一个关键区别。 在第一种情况中,图像实际上是狗或猫二选一。 在第二种情况下,结果实际上是一个随机的事件。 因此,概率是一种灵活的语言,用于说明我们的确定程度,并且它可以有效地应用于广泛的领域中。
2、通过看书本我复习了一遍概率论的一些知识点,包括什么是随机变量、各种分布、贝叶斯定理、期望和方差等。并动手用python代码实现。

counts = multinomial.Multinomial(10, fair_probs).sample((500,))
cum_counts = counts.cumsum(dim=0)
estimates = cum_counts / cum_counts.sum(dim=1, keepdims=True)

d2l.set_figsize((6, 4.5))
for i in range(6):
    d2l.plt.plot(estimates[:, i].numpy(),
                 label=("P(die=" + str(i + 1) + ")"))
d2l.plt.axhline(y=0.167, color='black', linestyle='dashed')
d2l.plt.gca().set_xlabel('Groups of experiments')
d2l.plt.gca().set_ylabel('Estimated probability')
d2l.plt.legend();

Task 2_第16张图片

你可能感兴趣的:(python,深度学习,numpy)