jittor.models.densenet 源代码

# ***************************************************************
# Copyright (c) 2023 Jittor. All Rights Reserved. 
# Maintainers: 
#     Guowei Yang <471184555@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
from jittor import init
from collections import OrderedDict


[文档] def densenet121(pretrained=False, **kwargs): ''' 构建一个Densenet121模型 Densenet源自论文 `Densely Connected Convolutional Networks <https://arxiv.org/pdf/1608.06993.pdf>`__, DenseNet的特点是每个层都与前面的层连接, 这种连接方式使得网络的特征传递更加高效, 同时也有助于解决梯度消失的问题。DenseNet的网络结构包含了多个DenseBlock和Transition层, 其中DenseBlock用于特征提取, Transition层用于特征维度的缩减。 参数: - `pretrained` (bool, optional): 如果为 `True`, 返回在ImageNet上预训练的模型。默认为 `False`。 - `**kwargs`: 可变参数, 用于传递额外的配置选项。 返回值: - 返回构建好的Densenet121模型实例。如果 `pretrained` 为 `True`, 则返回在ImageNet上预训练的模型。 代码示例: >>> import jittor as jt >>> from jittor.models.densenet import * >>> net = densenet121(pretrained=False) >>> x = jt.rand(1, 3, 224, 224) >>> y = net(x) >>> y.shape [1, 1000] ''' model = DenseNet(num_init_features=64, growth_rate=32, block_config=(6, 12, 24, 16), **kwargs) if pretrained: model.load("jittorhub://densenet121.pkl") return model
[文档] def densenet161(pretrained=False, **kwargs): ''' 构建一个Densenet161模型 Densenet源自论文 `Densely Connected Convolutional Networks <https://arxiv.org/pdf/1608.06993.pdf>`__ , DenseNet的特点是每个层都与前面的层连接, 这种连接方式使得网络的特征传递更加高效, 同时也有助于解决梯度消失的问题。DenseNet的网络结构包含了多个DenseBlock和Transition层, 其中DenseBlock用于特征提取, Transition层用于特征维度的缩减。 参数: - `pretrained` (bool, optional): 如果为 `True`, 返回在ImageNet上预训练的模型。默认为 `False`。 - `**kwargs`: 可变参数, 用于传递额外的配置选项。 返回值: - 返回构建好的Densenet161模型实例。如果 `pretrained` 为 `True`, 则返回在ImageNet上预训练的模型。 代码示例: >>> import jittor as jt >>> from jittor.models.densenet import * >>> net = densenet161(pretrained=False) >>> x = jt.rand(1, 3, 224, 224) >>> y = net(x) >>> y.shape [1, 1000] ''' model = DenseNet(num_init_features=96, growth_rate=48, block_config=(6, 12, 36, 24), **kwargs) if pretrained: model.load("jittorhub://densenet161.pkl") return model
[文档] def densenet169(pretrained=False, **kwargs): ''' 构建一个Densenet169模型 Densenet源自论文 `Densely Connected Convolutional Networks <https://arxiv.org/pdf/1608.06993.pdf>`__ , DenseNet的特点是每个层都与前面的层连接, 这种连接方式使得网络的特征传递更加高效, 同时也有助于解决梯度消失的问题。DenseNet的网络结构包含了多个DenseBlock和Transition层, 其中DenseBlock用于特征提取, Transition层用于特征维度的缩减。 参数: - `pretrained` (bool, optional): 如果为 `True`, 返回在ImageNet上预训练的模型。默认为 `False`。 - `**kwargs`: 可变参数, 用于传递额外的配置选项。 返回值: - 返回构建好的Densenet169模型实例。如果 `pretrained` 为 `True`, 则返回在ImageNet上预训练的模型。 代码示例: >>> import jittor as jt >>> from jittor.models.densenet import * >>> net = densenet169(pretrained=False) >>> x = jt.rand(1, 3, 224, 224) >>> y = net(x) >>> y.shape [1, 1000] ''' model = DenseNet(num_init_features=64, growth_rate=32, block_config=(6, 12, 32, 32), **kwargs) if pretrained: model.load("jittorhub://densenet169.pkl") return model
[文档] def densenet201(pretrained=False, **kwargs): ''' 构建一个Densenet201模型 Densenet源自论文 `Densely Connected Convolutional Networks <https://arxiv.org/pdf/1608.06993.pdf>`__ , DenseNet的特点是每个层都与前面的层连接, 这种连接方式使得网络的特征传递更加高效, 同时也有助于解决梯度消失的问题。DenseNet的网络结构包含了多个DenseBlock和Transition层, 其中DenseBlock用于特征提取, Transition层用于特征维度的缩减。 参数: - `pretrained` (bool, optional): 如果为 `True`, 返回在ImageNet上预训练的模型。默认为 `False`。 - `**kwargs`: 可变参数, 用于传递额外的配置选项。 返回值: - 返回构建好的Densenet201模型实例。如果 `pretrained` 为 `True`, 则返回在ImageNet上预训练的模型。 代码示例: >>> import jittor as jt >>> from jittor.models.densenet import * >>> net = densenet201(pretrained=False) >>> x = jt.rand(1, 3, 224, 224) >>> y = net(x) >>> y.shape [1, 1000] ''' model = DenseNet(num_init_features=64, growth_rate=32, block_config=(6, 12, 48, 32), **kwargs) if pretrained: model.load("jittorhub://densenet201.pkl") return model
class _DenseLayer(nn.Sequential): def __init__(self, num_input_features, growth_rate, bn_size, drop_rate): super(_DenseLayer, self).__init__() self.add_module('norm1', nn.BatchNorm(num_input_features)) self.add_module('relu1', nn.ReLU()) self.add_module('conv1', nn.Conv(num_input_features, (bn_size * growth_rate), 1, stride=1, bias=False)) self.add_module('norm2', nn.BatchNorm((bn_size * growth_rate))) self.add_module('relu2', nn.ReLU()) self.add_module('conv2', nn.Conv((bn_size * growth_rate), growth_rate, 3, stride=1, padding=1, bias=False)) self.drop_rate = drop_rate self.drop = nn.Dropout(self.drop_rate) def execute(self, x): new_features = super(_DenseLayer, self).execute(x) if (self.drop_rate > 0): new_features = self.drop(new_features) return jt.concat([x, new_features], dim=1) class _DenseBlock(nn.Sequential): def __init__(self, num_layers, num_input_features, bn_size, growth_rate, drop_rate): super(_DenseBlock, self).__init__() for i in range(num_layers): layer = _DenseLayer((num_input_features + (i * growth_rate)), growth_rate, bn_size, drop_rate) self.add_module('denselayer%d' % (i + 1), layer) class _Transition(nn.Sequential): def __init__(self, num_input_features, num_output_features): super(_Transition, self).__init__() self.add_module('norm', nn.BatchNorm(num_input_features)) self.add_module('relu', nn.ReLU()) self.add_module('conv', nn.Conv(num_input_features, num_output_features, 1, stride=1, bias=False)) self.add_module('pool', nn.Pool(2, stride=2, op='mean'))
[文档] class DenseNet(nn.Module): ''' DenseNet源自论文 `Densely Connected Convolutional Networks <https://arxiv.org/pdf/1608.06993.pdf>`__, DenseNet的特点是每个层都与前面的层连接, 这种连接方式使得网络的特征传递更加高效, 同时也有助于解决梯度消失的问题。DenseNet的网络结构包含了多个DenseBlock和Transition层, 其中DenseBlock用于特征提取, Transition层用于特征维度的缩减。 参数: - growth_rate (int): 每层添加的过滤器数量(论文中的 `k`)。 - block_config (list of 4 ints): 每个池化块中的层数。 - num_init_features (int): 第一个卷积层学习的过滤器数量。 - bn_size (int): 瓶颈层的数量的乘法因子(即瓶颈层中的特征数量为 bn_size * k)。 - drop_rate (float): 每个密集层后的丢弃率。 - num_classes (int): 分类类别数。 属性: - features (nn.Sequential): 特征提取层。 - classifier (nn.Linear): 分类层。 代码示例: >>> import jittor as jt >>> from jittor.models.densenet import DenseNet >>> model = DenseNet(growth_rate=32, block_config=(6, 12, 24, 16), ... num_init_features=64, bn_size=4, drop_rate=0.5, ... num_classes=1000) >>> input = jt.randn(1, 3, 224, 224) >>> output = model(input) >>> output.shape [1,1000,] ''' def __init__(self, growth_rate=32, block_config=(6, 12, 24, 16), num_init_features=64, bn_size=4, drop_rate=0, num_classes=1000): super(DenseNet, self).__init__() self.features = nn.Sequential(OrderedDict([ ('conv0', nn.Conv(3, num_init_features, 7, stride=2, padding=3, bias=False)), ('norm0', nn.BatchNorm(num_init_features)), ('relu0', nn.ReLU()), ('pool0', nn.Pool(3, stride=2, padding=1, op='maximum')), ])) num_features = num_init_features for (i, num_layers) in enumerate(block_config): block = _DenseBlock(num_layers=num_layers, num_input_features=num_features, bn_size=bn_size, growth_rate=growth_rate, drop_rate=drop_rate) self.features.add_module('denseblock%d' % (i + 1), block) num_features = (num_features + (num_layers * growth_rate)) if (i != (len(block_config) - 1)): trans = _Transition(num_input_features=num_features, num_output_features=(num_features // 2)) self.features.add_module('transition%d' % (i + 1), trans) num_features = (num_features // 2) self.features.add_module('norm5', nn.BatchNorm(num_features)) self.classifier = nn.Linear(num_features, num_classes) for m in self.modules(): if isinstance(m, nn.Conv): nn.init.invariant_uniform_(m.weight) elif isinstance(m, nn.BatchNorm): nn.init.constant_(m.weight, 1) nn.init.constant_(m.bias, 0) elif isinstance(m, nn.Linear): nn.init.constant_(m.bias, 0) def execute(self, x): features = self.features(x) out = nn.relu(features) out = out.mean([2,3]) out = self.classifier(out) return out