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