该模型基于Pytorch框架,Resnet模型,6000张猫狗训练图片,2000张猫狗验证图片训练而成的猫狗二分类模型,训练图片已上传至魔搭数据集--《猫狗分类图片数据集》
模型共用10个Epoch, 准确率达到: 98.45%
Epoch 1/10, Loss: 0.20265997878890088
Epoch 2/10, Loss: 0.13546315805510956
Epoch 3/10, Loss: 0.11217681157026202
Epoch 4/10, Loss: 0.1097535806797207
Epoch 5/10, Loss: 0.10935504358271732
Epoch 6/10, Loss: 0.0952360593525574
Epoch 7/10, Loss: 0.09554296578875089
Epoch 8/10, Loss: 0.08706574823875773
Epoch 9/10, Loss: 0.0826349301422213
Epoch 10/10, Loss: 0.07863278850229417
Validation Accuracy: 98.45%
模型测试网站:http://8.137.35.67/
服务器采用阿里云ECS服务器:1CPU,2G内存+Ubuntu+Gunicorn+Nginx,Web端采用Flask程序编写实现
关于模型问题可以加QQ咨询:122405553
模型设计部分代码如下:
###### BasicBlock 类的具体实现
expansion = 1
def __init__(self, in_channels, out_channels, stride=1, downsample=None):
super(BasicBlock, self).__init__()
self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(out_channels)
self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=1, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(out_channels)
self.downsample = downsample
self.stride = stride
def forward(self, x):
identity = x
out = self.conv1(x)
out = self.bn1(out)
out = F.relu(out)
out = self.conv2(out)
out = self.bn2(out)
if self.downsample is not None:
identity = self.downsample(x)
out += identity
out = F.relu(out)
return out
##### ResNet 类的具体实现
def __init__(self, block, layers, num_classes=1000):
super(ResNet, self).__init__()
self.in_channels = 64
self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3, bias=False)
self.bn1 = nn.BatchNorm2d(64)
self.relu = nn.ReLU(inplace=True)
self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
self.layer1 = self._make_layer(block, 64, layers[0])
self.layer2 = self._make_layer(block, 128, layers[1], stride=2)
self.layer3 = self._make_layer(block, 256, layers[2], stride=2)
self.layer4 = self._make_layer(block, 512, layers[3], stride=2)
self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
self.fc = nn.Linear(512 * block.expansion, num_classes)
def _make_layer(self, block, out_channels, blocks, stride=1):
downsample = None
if stride != 1 or self.in_channels != out_channels * block.expansion:
downsample = nn.Sequential(
nn.Conv2d(self.in_channels, out_channels * block.expansion, kernel_size=1, stride=stride, bias=False),
nn.BatchNorm2d(out_channels * block.expansion),
)
layers = []
layers.append(block(self.in_channels, out_channels, stride, downsample))
self.in_channels = out_channels * block.expansion
for _ in range(1, blocks):
layers.append(block(self.in_channels, out_channels))
return nn.Sequential(*layers)
def forward(self, x):
x = self.conv1(x)
x = self.bn1(x)
x = self.relu(x)
x = self.maxpool(x)
x = self.layer1(x)
x = self.layer2(x)
x = self.layer3(x)
x = self.layer4(x)
x = self.avgpool(x)
x = torch.flatten(x, 1)
x = self.fc(x)
return x
Clone with HTTP
git clone https://www.modelscope.cn/XCsunny/cats_vs_dogs.git
评论