EmotionClassifier / ResnetExpression.py
Airin-chan's picture
Upload 2 files
9f20d50 verified
from torch import nn
import torch
class resnet (nn.Module) :
def __init__ (self, n_in,n_out,strid=1,padding=1) :
super(resnet, self).__init__()
self.cnn1 = nn.Conv2d(in_channels=n_in, out_channels=n_out, kernel_size=3, stride=strid, padding=1)
self.cnn2 = nn.Conv2d(in_channels=n_out, out_channels=n_out, kernel_size=3, stride=1, padding=1)
self.normal = nn.BatchNorm2d(n_out)
self.normal2 = nn.BatchNorm2d(n_out)
self.relu = nn.ReLU()
self.relu2 = nn.ReLU()
self.relu3 = nn.ReLU()
self.shorcut = nn.Identity()
if strid != 1 or n_in != n_out :
self.shorcut = nn.Sequential(
nn.Conv2d(in_channels=n_in, out_channels=n_out, kernel_size=1, stride=strid),
nn.BatchNorm2d(n_out)
)
def forward(self, x) :
identity = self.shorcut(x)
x = self.normal(self.cnn1(x))
x = self.relu(x)
x = self.normal2(self.cnn2(x))
x = self.relu2(x)
x = x + identity
x = self.relu3(x)
return x
class Resnet (nn.Module) :
def __init__ (self,num_class= 3) :
super(Resnet, self).__init__()
self.cnn1 = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=7, stride=2, padding=3)
self.normal1 = nn.BatchNorm2d(64)
self.relu = nn.ReLU()
self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
self.resnet1 = resnet(64,64)
self.resnet2 = resnet(64,128,2)
self.resnet3 = resnet(128,256,2)
self.resnet4 = resnet(256,512,2)
self.pooling = nn.AdaptiveAvgPool2d((1,1))
self.linear1 = nn.Linear(512, num_class)
def forward(self, x) :
x = self.cnn1(x)
x = self.normal1(x)
x = self.relu(x)
x = self.maxpool(x)
x = self.resnet1(x)
x = self.resnet2(x)
x = self.resnet3(x)
x = self.resnet4(x)
x = self.pooling(x)
x = torch.flatten(x,1)
x = self.linear1(x)
return x