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) ) )