如果这个问题非常基本的话,很抱歉。我觉得网上有丰富的资源,但大多数都是半完整的,或者跳过了我想知道的细节。
我正在尝试用毕火炬来实现LeNet以供实践。
https://pytorch.org/tutorials/beginner/blitz/neural_networks_tutorial.html
,
发布于 2019-12-08 02:16:01
为什么在这个例子和许多在线例子中,定义了init中的卷积层和fc层,而在前向定义了次采样和激活函数?
任何具有可训练参数的层都应该在__init__中定义。二次抽样、某些激活、辍学等没有任何可训练的参数,因此可以在__init__中定义,也可以在forward期间通过torch.nn.functional接口直接使用。
某些函数使用torch.nn.functional,其他函数使用torch.nn的目的是什么?
torch.nn.functional函数是在大多数torch.nn层的核心使用的实际函数,它们调用C++编译代码。例如,nn.Conv2d子类nn.Module,任何包含可训练参数的自定义层或模型都应该这样做。该类处理注册参数,并封装培训和测试所需的其他一些必要功能。在forward过程中,实际使用nn.functional.conv2d进行卷积运算。正如第一个问题中提到的,在执行像ReLU这样的无参数操作时,使用nn.ReLU类和nn.functional.relu函数实际上没有区别。
他们被提供的原因是他们给了一些做非常规事情的自由。例如,在我前几天写的this answer中,提供一个没有nn.functional.conv2d的解决方案是很困难的。
,假设我想尝试不同的图像大小,比如28x28 (MNIST)。本教程建议我调整MNIST的大小。是否有一种方法来代替改变LeNet的值?如果我不换呢?
没有明显的方法来改变现有的,经过训练的模型,以支持不同的图像大小。线性层输入的大小必然是固定的,模型中该点的特征数通常取决于网络输入的大小。如果输入的大小与模型设计的大小不同,那么当数据进展到线性层时,它将有错误的元素数并导致程序崩溃。有些模型可以处理一系列的输入大小,通常在线性层之前使用nn.AdaptiveAvgPool2d层来确保线性层的输入形状总是相同的。即便如此,如果输入图像大小太小,则网络中的下采样和/或池操作将导致特征映射在某个点消失,导致程序崩溃。
num_flat_features的目的是什么?如果您想将特性扁平化,就不能只做x= x.view(-1,16*5*5)吗?
当你定义线性层时,你需要告诉它权重矩阵有多大。线性层的权值只是一个无约束矩阵(和偏置向量)。因此,权重矩阵的形状由输入形状决定,但在向前运行之前不知道输入形状,因此在初始化模型时需要将其作为附加参数(或硬编码)提供。
去问真正的问题。是的,在forward期间您可以简单地使用
x = x.view(-1, 16*5*5)更好的,使用
x = torch.flatten(x, start_dim=1)本教程是在将.flatten函数添加到库之前编写的。作者实际上只是编写了他们自己的扁平功能,不管x的形状如何,都可以使用它。这可能是因为您有一些可移植的代码,可以在您的模型中使用,而无需编写硬编码。从编程的角度来看,泛化这些东西是很好的,因为这意味着如果您决定更改模型的一部分,就不必担心更改这些神奇的数字(尽管这种关注似乎没有扩展到初始化)。
https://stackoverflow.com/questions/59231709
复制相似问题