class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.fc1 = nn.Linear(784, 128)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(128, 10)
__init__()
是 Python 类中的一个特殊方法,用于在创建对象时初始化和设置对象。它也被称为构造方法,因为它构造和初始化对象。
当从类创建对象时,__init__()
方法会自动调用,它的第一个参数是 self
,指代正在创建的对象。它还可以接受其他参数,用于设置对象的初始状态。
以下是一个带有 __init__()
方法的类的示例,它接受两个参数并将它们设置为对象的属性:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
在这个示例中,Person
类具有一个 __init__()
方法,它接受 name
和 age
参数并将它们设置为对象的属性。当从这个类创建一个对象时,__init__()
方法会自动调用,并使用指定的值初始化对象。例如:
person1 = Person("Alice", 25)
print(person1.name) # 输出:"Alice"
print(person1.age) # 输出:25
super(MyModel, self).__init__()
super():对于 Python 中的类继承,子类可以继承父类的属性和方法。当子类定义自己的构造函数时,通常需要调用父类的构造函数来初始化从父类继承的属性和方法。这时可以使用 super()
函数来调用父类的构造函数。
在 Python 3 中,可以使用 super()
函数来调用父类的方法。super()
函数有两个参数:第一个参数是当前子类的类名,第二个参数是当前子类的实例。调用 super()
函数时,需要指定要调用的父类方法的名称,然后使用点号操作符来调用该方法。
例如,假设我们有一个父类 MyParent
和一个子类 MyChild
,并且在子类中重写了父类的构造函数。在子类的构造函数中,可以使用 super(MyChild, self).__init__()
来调用父类的构造函数。
要设置父类构造函数的参数,可以在调用 super()
函数时传递这些参数。例如,假设父类的构造函数有一个参数 x
,子类的构造函数也有一个同名参数 x
,则可以使用 super(MyChild, self).__init__(x)
来调用父类的构造函数,并将参数 x
传递给父类构造函数。
总之,super(MyModel, self).__init__()
是一种调用父类构造函数并使用从父类继承的属性和方法初始化子类实例的方法。如果父类的构造函数有参数,可以在调用 super()
函数时传递这些参数来设置父类构造函数的参数。
self.fc1 = nn.Linear(784, 128)
self.fc1 = nn.Linear(784, 128)
:这行代码定义了一个名为 fc1
的全连接层(nn.Linear
),它将输入的大小为 784 的张量(即输入特征数量)转换为大小为 128 的张量(即输出特征数量)。
在这个代码片段中,nn
是 PyTorch 中的一个模块,它包含了各种常用的神经网络层。nn.Linear
是其中的一个类,它表示一个全连接层,其构造函数接受两个参数:输入特征数量和输出特征数量。
self.fc1
是一个类成员变量,它被定义为一个 nn.Linear
对象。在这个模型中,self
表示当前类的实例,即神经网络模型。通过将 nn.Linear
对象赋值给 self.fc1
,我们将其添加为模型的一个层。这个层将输入张量的大小从 784 转换为 128,即将输入的每个特征与 128 个权重相乘并加上一个偏置项,得到输出特征。
self.relu = nn.ReLU()
在深度学习中,激活函数用于给神经网络中的每个神经元引入非线性特性。ReLU (Rectified Linear Unit) 是一种常用的激活函数之一,它定义为:ReLU(x) = max(0, x) 其中 x 是神经元的输入。这意味着,当输入 x 大于等于零时,ReLU 函数返回 x,否则返回零。
self.fc2 = nn.Linear(128, 10)
和fc1相同,定义了一个名为fc2的全连接层,将输入大小为128的特征数量转换为大小为10的特征数量输出。
def forward(self, x):
x = x.view(-1, 784)
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
return x
def forward(self, x):是一个在 PyTorch 中定义神经网络前向传递的方法。在 PyTorch 中,我们可以通过继承 nn.Module
类来创建自定义的神经网络。在这个自定义的神经网络中,我们需要定义 forward
方法来执行模型的前向传递。
在这个 forward
方法中,self
表示我们定义的神经网络对象,x
是神经网络的输入数据。前向传递过程就是将输入数据 x
传递给神经网络中的各个层,以计算模型的输出。
具体地说,我们可以通过在 forward
方法中对神经网络的各个层进行调用来定义模型的前向传递。
x.view(-1, 784)
:是一个 PyTorch 张量操作,用于调整张量的形状(即维度)。在这个操作中,x
是输入的张量,-1
表示这一维度的大小由 PyTorch 自动推断,而 784
表示目标形状的另一个维度的大小。
例如:view
操作将形状从 (batch_size, 1, 28, 28)
调整为 (batch_size, 784)
。
在机器学习中,通常需要将输入数据转换为张量。对于图像数据,通常使用三维张量来表示,其中第一维表示样本数量,第二维和第三维表示图像的高度和宽度。但是,在将图像输入神经网络之前,我们通常需要将图像转换为一维张量。
在这种情况下,我们可以使用 view
操作来调整张量的形状。例如,在这行代码中,我们将输入张量 x
的形状调整为 (batch_size, 784)
,其中 batch_size
表示输入的样本数量,784
表示输入的图像已经被展开成了一维向量,具有 784 个元素。使用 -1
作为一个维度的大小,可以让 PyTorch 自动计算该维度的大小,以确保张量的总大小保持不变。
然后将输入数据 x
传递给全连接层 fc1
,然后将输出传递给 ReLU 激活函数层 relu
,最后将其传递给第二个全连接层 fc2
。最终,我们将 fc2
的输出作为模型的输出返回。