jittor.models.squeezenet 源代码

# ***************************************************************
# 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