# ***************************************************************
# Copyright (c) 2023 Jittor. All Rights Reserved.
# Maintainers:
# Wenyang Zhou <576825820@qq.com>
# Dun Liang <randonlang@gmail.com>.
#
# This file is subject to the terms and conditions defined in
# file 'LICENSE.txt', which is part of this source code package.
# ***************************************************************
# This model is generated by pytorch converter.
import jittor as jt
from jittor import nn
__all__ = ['SqueezeNet', 'squeezenet1_0', 'squeezenet1_1']
class Fire(nn.Module):
def __init__(self, inplanes, squeeze_planes, expand1x1_planes, expand3x3_planes):
super(Fire, self).__init__()
self.inplanes = inplanes
self.squeeze = nn.Conv(inplanes, squeeze_planes, kernel_size=1)
self.squeeze_activation = nn.Relu()
self.expand1x1 = nn.Conv(squeeze_planes, expand1x1_planes, kernel_size=1)
self.expand1x1_activation = nn.Relu()
self.expand3x3 = nn.Conv(squeeze_planes, expand3x3_planes, kernel_size=3, padding=1)
self.expand3x3_activation = nn.Relu()
def execute(self, x):
x = self.squeeze_activation(self.squeeze(x))
return jt.concat([self.expand1x1_activation(self.expand1x1(x)), self.expand3x3_activation(self.expand3x3(x))], dim=1)
[文档]
class SqueezeNet(nn.Module):
'''
Squeezenet源自论文 `SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size <https://arxiv.org/abs/1602.07360>`__。
注意:
当 version 为 '1_0' 时, 模型结构特定为:
Conv1 -> Relu -> Pool -> Fire(96, 16, 64, 64) -> ... -> Fire(512, 64, 256, 256)
当 version 为 '1_1' 时, 模型结构为:
Conv1 -> Relu -> Pool -> Fire(64, 16, 64, 64) -> ... -> Fire(512, 64, 256, 256)
最终, 模型通过一个分类器进行类别判断, 分类器包含一个Dropout层、一个1x1卷积层和一个平均池化层。
参数:
- version (str, optional): SqueezeNet的版本, 可以是'1_0'或'1_1', 分别对应不同的网络结构配置。版本'1_0'使用7x7的卷积核进行第一层卷积, 版本'1_1'则使用更小的3x3卷积核以进一步减小模型大小。默认值: '1_0'。
- num_classes (int, optional): 模型最后输出的类别数。默认值: 1000
代码示例:
>>> import jittor as jt
>>> from jittor.models.squeezenet import SqueezeNet
>>> model = SqueezeNet(version='1_0', num_classes=1000)
>>> x = jt.rand([10, 3, 224, 224])
>>> output = model.execute(x)
>>> print(output.shape)
[10,1000,]
'''
def __init__(self, version='1_0', num_classes=1000):
super(SqueezeNet, self).__init__()
self.num_classes = num_classes
if (version == '1_0'):
self.features = nn.Sequential(
nn.Conv(3, 96, kernel_size=7, stride=2),
nn.Relu(),
nn.Pool(kernel_size=3, stride=2, ceil_mode=True, op='maximum'),
Fire(96, 16, 64, 64),
Fire(128, 16, 64, 64),
Fire(128, 32, 128, 128),
nn.Pool(kernel_size=3, stride=2, ceil_mode=True, op='maximum'),
Fire(256, 32, 128, 128),
Fire(256, 48, 192, 192),
Fire(384, 48, 192, 192),
Fire(384, 64, 256, 256),
nn.Pool(kernel_size=3, stride=2, ceil_mode=True, op='maximum'),
Fire(512, 64, 256, 256)
)
elif (version == '1_1'):
self.features = nn.Sequential(
nn.Conv(3, 64, kernel_size=3, stride=2),
nn.Relu(),
nn.Pool(kernel_size=3, stride=2, ceil_mode=True, op='maximum'),
Fire(64, 16, 64, 64),
Fire(128, 16, 64, 64),
nn.Pool(kernel_size=3, stride=2, ceil_mode=True, op='maximum'),
Fire(128, 32, 128, 128),
Fire(256, 32, 128, 128),
nn.Pool(kernel_size=3, stride=2, ceil_mode=True, op='maximum'),
Fire(256, 48, 192, 192),
Fire(384, 48, 192, 192),
Fire(384, 64, 256, 256),
Fire(512, 64, 256, 256)
)
else:
raise ValueError('Unsupported SqueezeNet version {version}:1_0 or 1_1 expected'.format(version=version))
final_conv = nn.Conv(512, self.num_classes, kernel_size=1)
self.classifier = nn.Sequential(
nn.Dropout(p=0.5),
final_conv,
nn.Relu(),
nn.AdaptiveAvgPool2d((1, 1))
)
def execute(self, x):
x = self.features(x)
x = self.classifier(x)
return jt.reshape(x, (x.shape[0], (- 1)))
def _squeezenet(version, **kwargs):
'''
使用给定的版本和optional参数创建一个SqueezeNet模型
参数:
- `version` (str): SqueezeNet的版本, 目前支持 '1_0' 和 '1_1'。
- `**kwargs`: optional参数列表, 用于指定模型的其他设置, 如 `num_classes` 可以用于设定模型的输出类别数量。
返回值:
- 返回一个初始化的SqueezeNet模型实例。
代码示例:
>>> import jittor as jt
>>> from jittor.models import _squeezenet
>>> model = _squeezenet('1_1')
'''
model = SqueezeNet(version, **kwargs)
return model
[文档]
def squeezenet1_0(pretrained=False, **kwargs):
'''
构建一个squeezenet1_0模型
Squeezenet源自论文 `SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size <https://arxiv.org/abs/1602.07360>`__。
参数:
- `pretrained` (bool, optional): 表示是否预加载预训练模型。默认为 `False`。
- `kwargs`: 其他optional参数。
返回值:
- 返回构建好的squeezenet1_0模型实例。如果 `pretrained` 为 `True`, 则返回在ImageNet上预训练的模型。
代码示例:
>>> import jittor as jt
>>> from jittor.models.squeezenet import *
>>> net = squeezenet1_0(pretrained=False)
>>> x = jt.rand(1, 3, 224, 224)
>>> y = net(x)
>>> y.shape
[1, 1000]
'''
model = _squeezenet('1_0', **kwargs)
if pretrained: model.load("jittorhub://squeezenet1_0.pkl")
return model
[文档]
def squeezenet1_1(pretrained=False, **kwargs):
'''
构建一个squeezenet1_1模型
Squeezenet源自论文 `SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5MB model size <https://arxiv.org/abs/1602.07360>`__。
参数:
- `pretrained` (bool, optional): 表示是否预加载预训练模型。默认为 `False`。
- `kwargs`: 其他optional参数。
返回值:
- 返回构建好的squeezenet1_1模型实例。如果 `pretrained` 为 `True`, 则返回在ImageNet上预训练的模型。
代码示例:
>>> import jittor as jt
>>> from jittor.models.squeezenet import *
>>> net = squeezenet1_1(pretrained=False)
>>> x = jt.rand(1, 3, 224, 224)
>>> y = net(x)
>>> y.shape
[1, 1000]
'''
model = _squeezenet('1_1', **kwargs)
if pretrained: model.load("jittorhub://squeezenet1_1.pkl")
return model