Pytorch implementa regresión lineal - Notas de estudio de Pytorch 1

Pytorch implementa la regresión lineal

El contenido registrado en este artículo son las notas hechas al ver el video de enseñanza de pytorch relevante del Maestro Liu en la estación B.
Enlace de video: Práctica de aprendizaje profundo de Pytorch

1. Puntos de conocimiento de Python

1. Herencia de clases

Cuando se hereda una clase, debe inicializarse así:

ModuleEs la clase principal LinearModelde la que hereda la clase.

class LinearModel(torch.nn.Module):
    
    def __init__(self):
        super(LinearModel, self).__init__()
super(LinearModel, self).——init()——

super(LinearModel, self).init()Primero encuentre la clase principal de LinearModel (aquí hay una clase Module), luego convierta el objeto de la clase LinearModel selfen el objeto de la clase Módulo, y luego llame a la función del objeto Módulo de clase "convertida" init, de hecho, la comprensión simple es que la subclase convierte la clase principal init() en su propio init(), de modo que la subclase tiene init()esas cosas de la clase principal.

Mirando el código anterior nuevamente, LinearModella herencia de clase nn.Modulees inicializar las propiedades super(LinearModel, self).init()heredadas de la clase principal y usar el método de inicialización para inicializar las propiedades heredadas.nn.Modulenn.Module

class LinearModel(nn.Module):def __init__(self):
        super(LinearModel, self).__init__()
        # 输入图像channel:1;输出channel:6;5x5卷积核
        self.conv1 = nn.Conv2d(1, 6, 5)

Es decir, la subclase hereda todas las propiedades y métodos de la clase principal, y las propiedades de la clase principal se inicializarán naturalmente con los métodos de la clase principal. Por supuesto, si la lógica de inicialización es diferente a la de la clase principal, también es posible reinicializar por sí mismo sin utilizar el método de la clase principal. Por ejemplo:

class DiabetesDataset(Dataset):def __init__(self, filepath):
        xy = np.loadtxt(filepath, delimiter=',', dtype=np.float32)
        #例如xy矩阵式Nx9的,那么其shape即为(N,9),所以shape[0]指取出N,得知总共的样本数量
        self.len = xy.shape[0]
        self.x_data = torch.from_numpy(xy[:, :-1])
        self.y_data = torch.from_numpy(xy[:, [-1]])

2. Objetos invocables

El lineal aquí es el objeto instanciado de la clase Lineal, pero el objeto se puede llamar directamente debajo

self.linear = torch.nn.Linear(1, 1)#类的对象实例化
y_pred = linear(x)#该实例化的对象可以调用

Para lograr esto, debe hacer lo siguiente al crear una clase. Al definir una clase, debe definir una función de llamada, para que pueda llamar directamente al objeto:

class FooBar():
    
    def __init__(self):
        pass
    
    def __call__(self, *args, **kwargs):
        
        print("Hello" + str(args[0]))
 
foobar = FooBar()
foobar(1,2,3)

apagar:

Hello1

Debido a que aquí args es una tupla, el elemento 0 de la tupla es el número 1

3. Parámetros de la función: *arg y **kwargs

*argAquí hay una explicación complementaria sobre la suma de parámetros cuando se define la función **kwargs:

def test(*args,**kwargs):
    
    print(args)
    print(kwargs)
    
test(1,2,3,x=5,y=6)

apagar:

(1, 2, 3)
{
    
    'x': 5, 'y': 6}

Es decir,args se crea una tupla para todos los parámetros sin nombre que se pasan, y kwargsse crea un diccionario para todas las variables con nombre que se pasan, pero debe tenerse en cuenta que los parámetros que se pasan deben seguir primero a los números sin nombre, y las variables con nombre Todos al final, si no, se informará de un error.

Dos, funciones relacionadas con Pytorch

1. clase torch.nn.Module

inserte la descripción de la imagen aquí

2. Función lineal()

Función 3.torch.nn.MSELoss()

inserte la descripción de la imagen aquí

4. función antorcha.optim.SGD()

inserte la descripción de la imagen aquí

Función 5.Module.parameters()

3. Explicación detallada del código en esta sección

1. Crea un conjunto de datos

El primero es crear un conjunto de datos, donde el conjunto de datos es creado por el tensor de Pytorch.

#创建数据集
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])

2. Definir el modelo

La definición del modelo se hereda de la clase torch.nnen (Neural Network) en PytorchModule

"""模型必须继承自Module"""
class LinearModel(torch.nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()
        #构造一个对象,Linear里面分别是input_feature(输入样本的维度),output_feature,和bias(True默认 or False)
        self.linear = torch.nn.Linear(1, 1)

    def forward(self, x):
        y_pred = self.linear(x)
        return y_pred

#定义模型
model = LinearModel()

Utilice esta clase para crear un modelo lineal, es decir, Y=w*x+b. Tenga en cuenta que el resultado de instanciación lineal aquí se puede volver a llamar (llamable). Para obtener más información, consulte 1. Puntos de conocimiento de Python

 #构造一个对象,Linear里面分别是input_feature(输入样本的维度),output_feature,和bias(True默认 or False)
self.linear = torch.nn.Linear(1, 1)

La función lineal utilizada aquí, las muestras utilizadas en esta regresión lineal, la entrada de cada muestra es unidimensional, al igual que la salida.

Aviso:

Aquí, Linear() creará automáticamente pesos y sesgos de tipo Tensor, y no hay necesidad de considerar el problema de la asignación de inicialización.

3. Definir la función de pérdida y el optimizador

#构造损失函数
criterion = torch.nn.MSELoss(size_average=False)

Aquí, con la ayuda de módulos relacionados en Pytorch, se construye una función de pérdida MSE, size_average=Falselo que significa que las pérdidas múltiples se suman y no se promedian.

#构造优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

Aquí, se crea un módulo de optimización de descenso de gradiente con la ayuda de módulos relacionados en Pytorch. La clase modelo hereda de la clase torch.nn.Module. La función utilizada aquí model.parameters()es la función de la clase principal. La función de esta función es encontrar automáticamente todos los miembros. de la clase de modelo y encuentre el gradiente requerido Descienda el tensor optimizado, y luego SGD realiza automáticamente la optimización de descenso de gradiente.

4. Entrenamiento modelo

#训练模型
for epoch in range(1000):
    #这里model会自动调用forward()函数,因为是model父类的特性
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item())

    #所有梯度归零化
    optimizer.zero_grad()
    #反向传播求出梯度
    loss.backward()
    #更新权重和偏置值,即w和b
    optimizer.step()

4. Código completo

"""
Pytorch实现线性回归,向量化
"""
import torch
import visdom

#创建数据集
x_data = torch.Tensor([[1.0], [2.0], [3.0]])
y_data = torch.Tensor([[2.0], [4.0], [6.0]])

"""模型必须继承自Module"""
class LinearModel(torch.nn.Module):
    def __init__(self):
        super(LinearModel, self).__init__()
        #构造一个对象,Linear里面分别是input_feature(输入样本的维度),output_feature,和bias(True默认 or False)
        self.linear = torch.nn.Linear(1, 1)

    def forward(self, x):
        y_pred = self.linear(x)
        return y_pred

#定义模型
model = LinearModel()

#构造损失函数
criterion = torch.nn.MSELoss(size_average=False)

#构造优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)


vis = visdom.Visdom(env='main')  # 设置环境窗口的名称,如果不设置名称就默认为main
opt = {
    
    
        'xlabel': 'epochs',
        'ylabel': 'loss_value',
        'title': 'train_loss'
    }
#定义一个图像窗口
loss_window = vis.line(
    X=[0],
    Y=[0],
    opts=opt
)

#训练模型
for epoch in range(1000):
    y_pred = model(x_data)
    loss = criterion(y_pred, y_data)
    print(epoch, loss.item())

    #所有梯度归零化
    optimizer.zero_grad()
    #反向传播求出梯度
    loss.backward()
    #更新权重和偏置值,即w和b
    optimizer.step()
	#不断更新图像
    vis.line(X=[epoch], Y=[loss.item()], win=loss_window, opts=opt, update='append')

print('w= ', model.linear.weight.item())
print('b= ', model.linear.bias.item())

x_test = torch.Tensor([4.0])
y_test = model(x_test)

print('y_pred= ', y_test.data.item())

Supongo que te gusta

Origin blog.csdn.net/Er_Studying_Bai/article/details/120772226
Recomendado
Clasificación