10. Uso y modificación del modelo de red.

10.1 Descargar modelo de red

import torchvision

#trauin_data = torchvision.datasets.ImageNet("./dataset",split="train",download=True,transform=torchvision.transforms.ToTensor())   # 这个数据集没有办法再公开的访问了    
vgg16_true = torchvision.models.vgg16(pretrained=True) # 下载卷积层对应的参数是多少、池化层对应的参数时多少,这些参数时ImageNet训练好了的
vgg16_false = torchvision.models.vgg16(pretrained=False) # 没有预训练的参数
print("ok")
print(vgg16_true)

resultado:

ok 
VGG( 
  (características): Sequential( 
    (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): ReLU( 
    inplace =Verdadero) 
    (2): Conv2d(64, 64, kernel_size=(3, 3), zancada=(1, 1), relleno=(1, 1)) (3): ReLU(inplace=Verdadero) ( 
    4 
    ) : MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False) (5) 
    : Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), relleno =(1, 1)) 
    (6): ReLU(inplace=True) 
    (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1) ) 
    (8): ReLU(inplace=True) 
    (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False)
    (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (11): ReLU(inplace=True) (12): 
    Conv2d 
    ( 256, 256, tamaño_núcleo=(3, 3), zancada=(1, 1), relleno=(1, 1)) (13): 
    ReLU(inplace=True) 
    (14): Conv2d(256, 256, tamaño_núcleo= (3, 3), zancada=(1, 1), relleno=(1, 1)) ( 
    15): ReLU(inplace=True) 
    (16): MaxPool2d(kernel_size=2, zancada=2, relleno=0, dilatación=1, ceil_mode=False) 
    (17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (18): ReLU(inplace 
    = Verdadero) 
    (19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (20): ReLU(inplace=True) (21 
    ) 
    : Conv2d(512, 512, kernel_size=(3, 3), zancada=(1, 1), relleno=(1, 1))
    (22): ReLU(inplace=True)  
    (23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False)
    (24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (25): ReLU 
    ( inplace=True) 
    (26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (27): ReLU(inplace=True) 
    ( 
    28 ): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (29): ReLU(inplace 
    =True) 
    (30): MaxPool2d(kernel_size= 2, zancada=2, relleno=0, dilatación=1, ceil_mode=False) 
  ) 
  (avgpool): AdaptiveAvgPool2d(output_size=(7, 7)) 
  (clasificador): Secuencial( 
    (0): Lineal(in_features=25088, out_features =4096, sesgo=Verdadero) 
    (1): ReLU(in situ=Verdadero) 
    (2): Abandono(p=0,5, in situ=Falso)
    (3): Lineal(in_features=4096, out_features=4096, sesgo=True) 
    (4): ReLU(inplace=True)
    (5): Abandono(p=0.5, inplace=False) 
    (6): Lineal(in_features=4096, out_features=1000, sesgo=True) 
  )

10.2 Ver uso de la función 

import torchvision
help(torchvision.models.vgg16)

resultado:

Ayuda sobre la función vgg16 en el módulo torchvision.models.vgg: 

vgg16(pretrained:bool=False, Progress:bool=True, **kwargs:Any) -> torchvision.models.vgg.VGG 
    Modelo VGG de 16 capas (configuración "D ") 
    `"Redes convolucionales muy profundas para el reconocimiento de imágenes a gran escala" <https://arxiv.org/pdf/1409.1556.pdf>`_. 
    El tamaño de entrada mínimo requerido del modelo es 32x32. 
    
    Args: 
        preentrenado (bool): si es verdadero, devuelve un modelo previamente entrenado en ImageNet. 
        progreso (bool): si es verdadero, muestra una barra de progreso de la descarga a stderr.

 10.3 Agregar modelo de red

import torchvision
from torch import nn

dataset = torchvision.datasets.CIFAR10("./dataset",train=True,transform=torchvision.transforms.ToTensor(),download=True)       
vgg16_true = torchvision.models.vgg16(pretrained=True) # 下载卷积层对应的参数是多少、池化层对应的参数时多少,这些参数时ImageNet训练好了的
vgg16_true.add_module('add_linear',nn.Linear(1000,10)) # 在VGG16后面添加一个线性层,使得输出为适应CIFAR10的输出,CIFAR10需要输出10个种类

print(vgg16_true)

resultado:

Archivos ya descargados y verificados 
VGG( 
  (características): Sequential( 
    (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1 
    ) : ReLU(inplace=True) 
    (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU(inplace=True 
    ) ) 
    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False) (5): 
    Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 
    (6): ReLU(inplace=True) 
    (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=( 1, 1)) 
    (8): ReLU(inplace=True) 
    (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False)
    (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (11): ReLU(inplace=True) (12): 
    Conv2d 
    ( 256, 256, tamaño_núcleo=(3, 3), zancada=(1, 1), relleno=(1, 1)) (13): 
    ReLU(inplace=True) 
    (14): Conv2d(256, 256, tamaño_núcleo= (3, 3), zancada=(1, 1), relleno=(1, 1)) ( 
    15): ReLU(inplace=True) 
    (16): MaxPool2d(kernel_size=2, zancada=2, relleno=0, dilatación=1, ceil_mode=False) 
    (17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (18): ReLU(inplace 
    = Verdadero) 
    (19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (20): ReLU(inplace=True) (21 
    ) 
    : Conv2d(512, 512, kernel_size=(3, 3), zancada=(1, 1), relleno=(1, 1))
    (22): ReLU(inplace=True) 
    (23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False) (24): 
    Conv2d(512, 512, kernel_size=(3 , 3), zancada=(1, 1), relleno=(1, 1)) 
    (25): ReLU(inplace=True) ( 
    26): Conv2d(512, 512, kernel_size=(3, 3), zancada= (1, 1), relleno=(1, 1)) 
    (27): ReLU(inplace=True) 
    (28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 
    (29): ReLU(inplace=True) 
    (30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False) ) 
  ( 
  avgpool): AdaptiveAvgPool2d (output_size=(7, 7)) 
  (clasificador): Secuencial( 
    (0): Lineal(in_features=25088, out_features=4096, sesgo=True)
    (1): ReLU(inplace=True) 
    (2): Abandono(p=0.5, inplace=False) 
    (3): Lineal(in_features=4096, out_features=4096, sesgo=True) 
    (4): ReLU(inplace= Verdadero) 
    (5): Abandono(p=0.5, inplace=False) 
    (6): Lineal(in_features=4096, out_features=1000, sesgo=True) 
  ) 
  (add_linear): Lineal(in_features=1000, out_features=10, sesgo =Verdadero) 
)

10.4 Modificación del modelo de red

import torchvision
from torch import nn

vgg16_false = torchvision.models.vgg16(pretrained=False) # 没有预训练的参数     
print(vgg16_false)
vgg16_false.classifier[6] = nn.Linear(4096,10)
print(vgg16_false)

resultado:

VGG( 
  (características): Sequential( 
    (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): ReLU(inplace 
    = Verdadero) 
    (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (3): ReLU(inplace=True) (4 
    ) 
    : MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False) (5) 
    : Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding= (1, 1)) 
    (6): ReLU(inplace=True) 
    (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 
    (8): ReLU(inplace=True) 
    (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False) (10): 
    Conv2d(128, 256, kernel_size=(3 , 3), zancada=(1, 1), relleno=(1, 1))
    (11): ReLU(inplace=True) 
    (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (13): ReLU 
    ( inplace=True) 
    (14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (15): ReLU(inplace=True) 
    ( 
    16 ): MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False) (17) 
    : Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 
    (18): ReLU(inplace=True) ( 
    19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1 )) 
    (20): ReLU(inplace=True) 
    (21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (22) 
    : ReLU(in situ=Verdadero)
    (23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False) (24): Conv2d(512 
    , 512, kernel_size=(3, 3), stride=(1, 1 ), padding=(1, 1)) 
    (25): ReLU(inplace=True) 
    (26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1 , 1)) 
    (27): ReLU(inplace=True) 
    (28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) ( 
    29 ): ReLU(inplace=True) 
    (30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False) ) ( 
  avgpool 
  ): AdaptiveAvgPool2d(output_size=(7, 7)) 
  ( clasificador): Secuencial ( 
    (0): Lineal (in_features=25088, out_features=4096, sesgo=True) 
    (1): ReLU(inplace=True)
    (2): Abandono(p=0.5, inplace=False) 
    (3): Lineal(in_features=4096, out_features=4096, sesgo=True) 
    (4): ReLU(inplace=True) 
    (5): Abandono(p= 0.5, inplace=False) 
    (6): Lineal(in_features=4096, out_features=1000, sesgo=True) 
  ) 
) 
VGG( 
  (características): Sequential( 
    (0): Conv2d(3, 64, kernel_size=(3, 3 ), zancada=(1, 1), relleno=(1, 1)) 
    (1): ReLU(inplace=True) 
    (2): Conv2d(64, 64, kernel_size=(3, 3), zancada=(1 , 1), padding=(1, 1)) 
    (3): ReLU(inplace=True) 
    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False) 
    (5 ): Conv2d(64, 128, kernel_size=(3, 3), zancada=(1, 1), relleno=(1, 1))
    (6): ReLU(inplace=True) 
    (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (8): ReLU 
    ( inplace=True) 
    (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False) (10): 
    Conv2d(128, 256, kernel_size=(3, 3), stride= (1, 1), relleno=(1, 1)) 
    (11): ReLU(inplace=True) 
    (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 
    (13): ReLU(inplace=True) ( 
    14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1 )) 
    (15): ReLU(inplace=True) 
    (16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False) (17): 
    Conv2d(256, 512, kernel_size= (3, 3), zancada=(1, 1), relleno=(1, 1))
    (18): ReLU(inplace=True) 
    (19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (20): ReLU 
    ( inplace=True) 
    (21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (22): ReLU(inplace=True) 
    ( 
    23 ): MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False) (24) 
    : Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) 
    (25): ReLU(inplace=True) 
    (26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1 )) 
    (27): ReLU(inplace=True) 
    (28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (29) 
    : ReLU(in situ=Verdadero)
    (30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilatación=1, ceil_mode=False) ) (avgpool): AdaptiveAvgPool2d( 
  output_size 
  =(7, 7)) 
  (clasificador): Sequential( 
    (0) : Lineal(in_features=25088, out_features=4096, sesgo=True) 
    (1): ReLU(inplace=True) 
    (2): Abandono(p=0.5, inplace=False) 
    (3): Lineal(in_features=4096, out_features =4096, sesgo=Verdadero) 
    (4): ReLU(inplace=True) 
    (5): Abandono(p=0.5, inplace=False) 
    (6): Lineal(in_features=4096, out_features=10, sesgo=True) 
  ) 
)

Supongo que te gusta

Origin blog.csdn.net/qq_54932411/article/details/132513293
Recomendado
Clasificación