evaluador_tarea_7_8 / models.py
minoruskore's picture
Añadir implementación de un entorno de desarrollo y carga de modelos con evaluación de precisión
237774d
import torch
import torch.nn as nn
from torchvision import models
class Stem(nn.Module):
def __init__(self):
super(Stem, self).__init__()
self.conv = nn.Sequential(
nn.Conv2d(3, 64, kernel_size=7, stride=2),
nn.MaxPool2d(kernel_size=3, stride=2),
)
def forward(self, x):
x = self.conv(x)
return x
class ResidualBlock(nn.Module):
def __init__(self, in_channels, out_channels, stride=1):
super(ResidualBlock, self).__init__()
self.conv1 = nn.Sequential(
nn.Conv2d(in_channels, out_channels // 4, stride=1, kernel_size=1),
nn.BatchNorm2d(out_channels // 4),
nn.ReLU(inplace=True),
)
self.conv2 = nn.Sequential(
nn.Conv2d(
out_channels // 4,
out_channels // 4,
stride=stride,
kernel_size=3,
padding=1,
),
nn.BatchNorm2d(out_channels // 4),
nn.ReLU(inplace=True),
)
self.conv3 = nn.Sequential(
nn.Conv2d(out_channels // 4, out_channels, kernel_size=1, stride=1),
nn.BatchNorm2d(out_channels),
)
self.shortcut = (
nn.Identity()
if in_channels == out_channels
else nn.Sequential(
nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=stride),
nn.BatchNorm2d(out_channels),
)
)
self.relu = nn.ReLU(inplace=True)
def forward(self, x):
identity = self.shortcut(x)
x = self.conv1(x)
x = self.conv2(x)
x = self.conv3(x)
x += identity
x = self.relu(x)
return x
def make_layer(in_channels, out_channels, block, num_blocks):
layers = []
for i in range(num_blocks):
layers.append(block(in_channels, out_channels))
in_channels = out_channels
return layers
class FromZero(nn.Module):
def __init__(self, num_classes=10):
super(FromZero, self).__init__()
self.stem = Stem()
self.layer1 = nn.Sequential(*make_layer(64, 64, ResidualBlock, 2))
self.layer2 = nn.Sequential(
ResidualBlock(64, 128, stride=2), ResidualBlock(128, 128)
)
self.layer3 = nn.Sequential(
ResidualBlock(128, 256, stride=2), ResidualBlock(256, 256)
)
self.layer4 = nn.Sequential(
ResidualBlock(256, 512, stride=2), ResidualBlock(512, 512)
)
self.flatten = nn.Flatten()
self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
self.fc = nn.Linear(512, num_classes)
def forward(self, x):
x = self.stem(x)
x = self.layer1(x)
x = self.layer2(x)
x = self.layer3(x)
x = self.layer4(x)
x = self.avgpool(x)
x = self.flatten(x)
x = self.fc(x)
return x
class PreTrained(nn.Module):
def __init__(self, num_classes):
super().__init__()
self.model = models.resnet18(
weights=models.ResNet18_Weights.IMAGENET1K_V1, progress=True
)
for param in self.model.parameters():
param.requires_grad = False
self.model.fc = nn.Sequential(
nn.Linear(self.model.fc.in_features, 512),
nn.ReLU(inplace=True),
nn.Linear(512, num_classes),
)
def forward(self, x):
return self.model(x)