1、灰色图片是如何在计算机显示的?彩色的呢
答:图像由数组表示,像素值表示图像的内容。对于灰度图像,使用二维数组,像素表示灰度值,范围为256个整数。值为0表示白色,值255表示黑色,中间有不同的灰度。对于彩色图像,通常使用三种颜色通道(红、绿、蓝),每个通道使用一个独立的256范围二维阵列。像素值0再次表示白色,255表示实心红色、绿色或蓝色。这三个二维数组形成一个最终的三维数组(秩3张量),表示彩色图像。
2、MNIST_SAMPLE数据集中的文件和文件夹是如何组织的?为什么?
答:分为train和valid两个子文件夹,前者包含用于模型训练的数据,后者包含用于验证每个训练步骤后模型性能的数据。在验证集上对模型进行评估有两个目的:人类可解释的度量,如准确性(与用于训练的抽象的损失函数不同),通过在未接受过训练的数据集上评估模型来帮助检测过度拟合(简言之,过拟合模型在训练集上表现得越来越好,但在验证集上表现得越来越差)。当然,每个实践者都可以生成自己的训练/验证数据分割。公共数据集通常是预先分割的,以简化实现/发布之间结果的比较。
在MNIST_SAMPLE中每个子文件夹有两个子文件夹3和7,其中包含相应图像类的.jpg文件。这是由图片组成的数据集的常用方法。对于完整的MNIST数据集,有10个子文件夹,每个数字对应一个图像子文件夹
3、“像素相似性”方法是如何对数字进行分类
找出3的平均像素值,然后对7的像素值做同样的处理。得到两组的平均值,根据与这两个理想数字哪个最相似,即可分类。
4、什么是列表推导式?现在创建一个从列表中选择奇数并将其加倍的函数
list=[a**2 for a in range(10) if a%2!=0]
5、什么是"rank-3 tensor"?
答:张量的秩是它的维数。确定秩的一个简单方法是引用张量中的一个数字所需的索引数量。标量可以表示为秩0的张量(无索引),向量可以表示为秩1的张量(一个索引,例如v[i]),矩阵可以表示为秩2的张量(两个索引,例如A[i,j]),秩3的张量是长方体或“矩阵堆栈”(三个索引,例如b[i,j,k])。特别地,张量的秩与它的形状或维数无关,例如,形状为2x2x2的张量和形状为3x5x7的张量都具有秩3。
注意,术语“rank”在张量和矩阵的上下文中有不同的含义(这里它指的是线性无关的列向量的数目)。
6、tensor、rank和 shape的区别是什么?如何从shape中得到rank?
答:tensor是对标量、矢量和矩阵的推广,rank是阶可以理解为深度,比如一阶张量、二阶张量、三阶张量。shape是形状,指明每一层多少个元素
7、什么是RMSE和L1norm?
答:均方根误差(RMSE)又称L2范数,平均绝对差(MAE)又称L1范数,是两种常用的测量“距离”的方法。简单的差异是行不通的,因为有些差异是正的,有些是负的,相互抵消。因此,需要一个专注于差异大小的函数来正确测量距离。最简单的方法是将差异的绝对值相加,这就是MAE。RMSE取平方的平均值(使所有值为正),然后取平方根(撤消平方)。
8、如何一次对数千个数字进行计算而且比Python循环快几千倍
答:由于Python中的循环非常慢,所以最好将操作表示为数组操作,而不是在单个元素中循环。如果可以做到这一点,那么使用NumPy或PyTorch将快上千倍,因为它们使用的底层C代码比纯Python快得多。更好的是,Pythorch允许您在GPU上运行操作,如果可以执行并行操作,则可以显著提高速度
9、创建一个包含1到9的3×3张量或数组。加倍。选择右下角的四个数字。
答:
In [ ]: a = torch.Tensor(list(range(1,10))).view(3,3); print(a)
Out [ ]: tensor([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
In [ ]: b = 2*a; print(b)
Out [ ]: tensor([[ 2., 4., 6.],
[ 8., 10., 12.],
[14., 16., 18.]])
In [ ]: b[1:,1:]
Out []: tensor([[10., 12.],
[16., 18.]])
10、metrics的计算是使用训练集还是验证集?为什么
答:度量通常在验证集上计算。由于验证集是模型的不可见数据,评估验证集上的度量更好,以便确定是否存在任何过度拟合,以及如果给定相似的数据,模型在多大程度上可以泛化。
性能指标(metrics)是衡量一个模型好坏的关键,通过衡量模型输出y_predict和y_true之间的某种"距离"得出的。作为验证集评价模型好坏的主要依据,参考文章:https://www.cnblogs.com/zongfa/p/9431807.html
11、什么是SGD?
答:随机梯度下降是一种优化算法。具体地说,SGD是一种更新模型参数的算法,以使给定的损失函数最小化,该损失函数在预测和目标上被评估。SGD(以及许多优化算法)背后的关键思想是,损失函数的梯度提供了损失函数在参数空间中如何变化的指示,我们可以用它来确定如何最好地更新参数,以最小化损失函数。SGD就是这么做的。
12、为什么SGD使用mini-batches?
答:不对整个数据集进行梯度下降,速度太慢了,对每一个批次进行迭代更新速度加快
13、SGD应用于深度学习的七个步骤?
- 初始化权重
- 对于每张图片,使用这些权重预测出现的是3还是7
- 基于这些预测,计算模型的损失
- 计算梯度,改变权重会怎样改变损失
- 根据该计算,更改所有的权重
- 回到步骤2,重复这些动作
- 迭代到你想停止训练过程(当模型已经足够好,或者你不想训练太久)
14、如何在模型中初始化权重?
答:随机初始化
15、什么是loss
答:loss(损失)即是反应输出的值与实际值的差异,loss越小,模型的性能也越好。
16、为什么不能总是使用高学习率
高学习率会导致跨过最低点,无法收敛。
17、什么是梯度?
梯度可以简单的理解为函数的导数,它可以告诉我们模型如何变得更好
18、如何计算梯度?
19、为什么不能使用accuracy作为损失函数?
accuracy是一个几乎在所有地方都是一个常数的函数,因此其导数为零,无法更新权重
20、画sigmoid函数图,形状有什么特别的?
接受任何正或负的输入值,其y值范围是从0平滑到1的输出值,可以更轻松的找到gradients
21、loss函数和metric有什么区别?
metric:为了人们更好的判断模型的性能
loss:为了模型能够更好的学习并且是一个有意义的导数函数,不能有大的扁平部分和大的跳跃部分必须相当平滑对微小的变化作出反应
22、使用学习率计算新的权重的函数叫什么?
23、DataLoader
类是干什么的
torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None, batch_sampler=None, num_workers=0, collate_fn=None, pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None, multiprocessing_context=None)
可迭代的数据装载器,dataset类决定数据从哪里读取以及如何读取。
24、编写伪代码,展示在每个epoch,SGD的基本步骤
25、创建一个函数,传[1,2,3,4]和'abcd'这两个参数,返回[(1,'a'),(2,'b'),(3,'c'),(4,'d')],输出的数据结构有何特别之处
26、view在pytorch中是干什么的?
在pytorch中view函数的作用为重构张量的维度,跟numpy中的resize类似,两者用法不太一样
27、神经网络中的偏差
参数是什么?为什么需要它
28、@这个操作在python中是干什么的?
矩阵做点积的操作
29、backward
这个方法是干什么的
反向传播,计算梯度更新权重
30、为什么要将梯度归零
将梯度归零是为了不影响后面的梯度运算
31、需要传递什么给Learner
需要传递的参数:DataLoader、model、optiom、loss、metric
32、python的训练循环
33、什么是ReLu?画该值从-2到2
34、什么是激活函数?
非线性函数,比如sigmoid、relu等
35、F.relu和nn.ReLU的区别是什么?
import torch.nn.functional as F
out = F.relu(input)
import torch.nn as nn
nn.RuLU()
这两种方法都是调用relu激活函数,只是使用的场景不一样,F.relu()是函数调用,使用在foreward函数里。而nn.ReLU()是模块调用,一般在定义网络层的时候使用。
36、通用逼近定理表明,仅使用一个非线性函数就可以根据需要逼近任何函数。那么,为什么我们通常需要更多?
对于更深层次的模型,我们不需要太多参数,事实证明使用较小矩阵和较多层比使用较大矩阵和较少层能获得更好的结果