# ResNet

## Обзор

Модель ResNet была предложена в работе [Deep Residual Learning for Image Recognition](https://huggingface.co/papers/1512.03385) Kaiming He, Xiangyu Zhang, Shaoqing Ren и Jian Sun. Наша реализация следует небольшим изменениям, внесённым [Nvidia](https://catalog.ngc.nvidia.com/orgs/nvidia/resources/resnet_50_v1_5_for_pytorch): мы применяем `stride=2` для даунсемплинга в свёртке `3x3` бутылочного горлышка, а не в первой свёртке `1x1`. Это решение обычно известно как «ResNet v1.5».

ResNet ввёл остаточные соединения, которые позволяют обучать сети с беспрецедентным числом слоёв (до 1000). ResNet одержал победу на конкурсе ILSVRC & COCO 2015 года, что стало важной вехой в области глубокого компьютерного зрения.

Аннотация из статьи следующая:

*Более глубокие нейронные сети сложнее обучать. Мы предлагаем фреймворк остаточного обучения, облегчающий обучение сетей, значительно более глубоких, чем те, что использовались ранее. Мы явно переформулируем слои как обучение остаточных функций относительно входов слоя, вместо обучения функций без ссылки на вход. Мы приводим исчерпывающие эмпирические доказательства того, что эти остаточные сети легче оптимизировать и могут повышать точность за счет значительно увеличенной глубины. На наборе данных ImageNet мы оцениваем остаточные сети глубиной до 152 слоев — в 8 раз глубже сетей VGG, но при этом с меньшей сложностью. Ансамбль этих остаточных сетей достигает ошибки 3,57% на тестовом наборе ImageNet. Этот результат занял 1-е место в задаче классификации ILSVRC 2015. Мы также представляем анализ на CIFAR-10 с 100 и 1000 слоями. Глубина представлений имеет центральное значение для многих задач визуального распознавания. Исключительно благодаря нашим чрезвычайно глубоким представлениям мы получаем относительное улучшение на 28% на наборе данных COCO для обнаружения объектов. Глубокие остаточные сети являются основой наших работ на соревнованиях ILSVRC & COCO 2015, где мы также заняли 1-е места в задачах обнаружения на ImageNet, локализации на ImageNet, обнаружения на COCO и сегментации на COCO.*

На рисунке ниже представлена архитектура ResNet. Источник — [оригинальная статья](https://huggingface.co/papers/1512.03385).

Эта модель была предоставлена [Francesco](https://huggingface.co/Francesco). Исходный код можно найти [здесь](https://github.com/KaimingHe/deep-residual-networks).

## Ресурсы

Список официальных ресурсов Hugging Face и сообщества (отмечены значком 🌎), которые помогут вам начать работу с ResNet.

- [ResNetForImageClassification](/docs/transformers/main/ru/model_doc/resnet#transformers.ResNetForImageClassification) поддерживается в этом [ноутбуке](https://colab.research.google.com/github/huggingface/notebooks/blob/main/examples/image_classification.ipynb).
- См. также: [Руководство по задаче классификации изображений](../tasks/image_classification)

Если вы хотите предложить ресурс для включения в этот раздел, пожалуйста, создайте Pull Request, и мы его рассмотрим! В идеале ресурс должен демонстрировать что-то новое, а не дублировать существующие материалы.

## ResNetConfig[[transformers.ResNetConfig]]

#### transformers.ResNetConfig[[transformers.ResNetConfig]]

```python
transformers.ResNetConfig(transformers_version: str | None = None, architectures: list[str] | None = None, output_hidden_states: bool | None = False, return_dict: bool | None = True, dtype: str | torch.dtype | None = None, chunk_size_feed_forward: int = 0, is_encoder_decoder: bool = False, id2label: dict[int, str] | dict[str, str] | None = None, label2id: dict[str, int] | dict[str, str] | None = None, problem_type: Literal['regression', 'single_label_classification', 'multi_label_classification'] | None = None, num_channels: int = 3, embedding_size: int = 64, hidden_sizes: list[int] | tuple[int, ...] | None = (256, 512, 1024, 2048), depths: list[int] | tuple[int, ...] | None = (3, 4, 6, 3), layer_type: str = 'bottleneck', hidden_act: str = 'relu', downsample_in_first_stage: bool = False, downsample_in_bottleneck: bool = False)
```

[Источник](https://github.com/huggingface/transformers/blob/main/src/transformers/models/resnet/configuration_resnet.py#L27)

**Параметры:**

num_channels (`int`, *необязательный*, по умолчанию `3`) : Количество входных каналов.

embedding_size (`int`, *необязательный*, по умолчанию `64`) : Размерность эмбеддингов и скрытых состояний.

hidden_sizes (`Union[list[int], tuple[int, ...]]`, *необязательный*, по умолчанию `(256, 512, 1024, 2048)`) : Размерность (скрытый размер) на каждом этапе модели.

depths (`Union[list[int], tuple[int, ...]]`, *необязательный*, по умолчанию `(3, 4, 6, 3)`) : Глубина каждого слоя в Transformer.

layer_type (`str`, *необязательный*, по умолчанию `"bottleneck"`) : Слой, который следует использовать. Допустимые значения: `"basic"` (используется для небольших моделей, таких как resnet-18 или resnet-34) или `"bottleneck"` (используется для более крупных моделей, начиная с resnet-50).

hidden_act (`str`, *необязательный*, по умолчанию `relu`) : Нелинейная функция активации (функция или строка) в декодере. Например, `"gelu"`, `"relu"`, `"silu"` и т. д.

downsample_in_first_stage (`bool`, *необязательный*, по умолчанию `False`) : Если `True`, на первом этапе входные данные будут уменьшены с помощью `stride` 2.

downsample_in_bottleneck (`bool`, *необязательный*, по умолчанию `False`) : Если `True`, первый свёрточный слой 1x1 в ResNetBottleNeckLayer уменьшает размерность входных данных с шагом `stride`, равным 2.

Это класс конфигурации для хранения настроек модели ResNetModel. Он используется для создания модели Resnet в соответствии с указанными аргументами, определяя архитектуру модели. Создание конфигурации с параметрами по умолчанию даст конфигурацию, аналогичную конфигурации [microsoft/resnet-50](https://huggingface.co/microsoft/resnet-50)

Объекты конфигурации наследуются от [PreTrainedConfig](/docs/transformers/main/ru/main_classes/configuration#transformers.PreTrainedConfig) и могут использоваться для управления выводами модели. Подробнее см. в документации [PreTrainedConfig](/docs/transformers/main/ru/main_classes/configuration#transformers.PreTrainedConfig).

Пример:
```python
>>> from transformers import ResNetConfig, ResNetModel

>>> # Initializing a ResNet resnet-50 style configuration
>>> configuration = ResNetConfig()

>>> # Initializing a model (with random weights) from the resnet-50 style configuration
>>> model = ResNetModel(configuration)

>>> # Accessing the model configuration
>>> configuration = model.config
```

#### validate_layer_type[[transformers.ResNetConfig.validate_layer_type]]

```python
validate_layer_type()
```

[Источник](https://github.com/huggingface/transformers/blob/main/src/transformers/models/resnet/configuration_resnet.py#L72)

Убедитесь, что `layer_types` определена корректно.

## ResNetModel[[transformers.ResNetModel]]

#### transformers.ResNetModel[[transformers.ResNetModel]]

```python
transformers.ResNetModel(config: ResNetConfig)
```

[Источник](https://github.com/huggingface/transformers/blob/main/src/transformers/models/resnet/modeling_resnet.py#L291)

**Параметры:**

config ([ResNetConfig](/docs/transformers/main/ru/model_doc/resnet#transformers.ResNetConfig)) : класс конфигурации модели со всеми параметрами модели. Инициализация с файлом конфигурации не загружает веса, связанные с моделью, только конфигурацию. Используйте метод [from_pretrained()](/docs/transformers/main/ru/main_classes/model#transformers.PreTrainedModel.from_pretrained) для загрузки весов модели.

Модель Resnet без дополнительных слоёв, выводящая необработанные скрытые состояния.

Эта модель наследуется от [PreTrainedModel](/docs/transformers/main/ru/main_classes/model#transformers.PreTrainedModel). Общие методы, которые библиотека реализует для всех своих моделей (например, загрузка или сохранение, изменение размера входных эмбеддингов, обрезка головок и т. д.), описаны в документации родительского класса.

Эта модель также является подклассом [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) в PyTorch. Используйте её как обычный модуль PyTorch и обращайтесь к документации PyTorch по всем вопросам, связанным с общим использованием и поведением.

#### forward[[transformers.ResNetModel.forward]]

```python
forward(pixel_values: Tensor, output_hidden_states: bool | None = None, return_dict: bool | None = None, **kwargs)
```

[Источник](https://github.com/huggingface/transformers/blob/main/src/transformers/models/resnet/modeling_resnet.py#L301)

**Параметры:**

pixel_values (`torch.Tensor` формы `(batch_size, num_channels, image_size, image_size)`) : Тензоры, соответствующие входным изображениям. Значения пикселей можно получить с помощью [ConvNextImageProcessor](/docs/transformers/main/ru/model_doc/convnext#transformers.ConvNextImageProcessor). Подробности см. в [ConvNextImageProcessor.__call__()](/docs/transformers/main/ru/model_doc/molmo2#transformers.Molmo2ImageProcessor.__call__) (`processor_class` использует [ConvNextImageProcessor](/docs/transformers/main/ru/model_doc/convnext#transformers.ConvNextImageProcessor) для обработки изображений).

output_hidden_states (`bool`, *необязательный*) : Нужно ли возвращать скрытые состояния всех слоёв. Подробнее о `hidden_states` в разделе возвращаемых тензоров.

return_dict (`bool`, *необязательный*) : Нужно ли возвращать [ModelOutput](/docs/transformers/main/ru/main_classes/output#transformers.utils.ModelOutput) вместо обычного кортежа.

**Возвращает:** `BaseModelOutputWithPoolingAndNoAttention` или `tuple(torch.Tensor)`

Объект `BaseModelOutputWithPoolingAndNoAttention` или кортеж `torch.Tensor` (если передано `return_dict=False` или если `config.return_dict=False`), содержащий различные элементы в зависимости от конфигурации ([ResNetConfig](/docs/transformers/main/ru/model_doc/resnet#transformers.ResNetConfig)) и входных данных.

Метод forward класса [ResNetModel](/docs/transformers/main/ru/model_doc/resnet#transformers.ResNetModel) переопределяет специальный метод `__call__`.

Хотя рецепт для прямого прохода должен быть определён внутри этой функции, после этого следует вызывать экземпляр `Module`, а не эту функцию, поскольку первый выполняет шаги предварительной и постобработки, тогда как второй молча их игнорирует.

- **last_hidden_state** (`torch.Tensor` формы `(batch_size, num_channels, height, width)`) -- Последовательность скрытых состояний на выходе последнего слоя модели.
- **pooler_output** (`torch.Tensor` формы `(batch_size, hidden_size)`) -- Скрытое состояние последнего слоя после операции пулинга по пространственным измерениям.
- **hidden_states** (`tuple(torch.Tensor)`, *необязательный*, возвращается при передаче `output_hidden_states=True` или когда `config.output_hidden_states=True`) -- Кортеж `torch.Tensor` (один для вывода слоя встраиваний, если модель имеет слой встраиваний, + один для вывода каждого слоя) формы `(batch_size, num_channels, height, width)`.

  Скрытые состояния модели на выходе каждого слоя, а также необязательные выходные значения начального слоя встраивания.

Пример:

```python
```

## ResNetForImageClassification[[transformers.ResNetForImageClassification]]

#### transformers.ResNetForImageClassification[[transformers.ResNetForImageClassification]]

```python
transformers.ResNetForImageClassification(config: ResNetConfig)
```

[Источник](https://github.com/huggingface/transformers/blob/main/src/transformers/models/resnet/modeling_resnet.py#L340)

**Параметры:**

config ([ResNetConfig](/docs/transformers/main/ru/model_doc/resnet#transformers.ResNetConfig)) : класс конфигурации модели со всеми параметрами модели. Инициализация с файлом конфигурации не загружает веса, связанные с моделью, только конфигурацию. Используйте метод [from_pretrained()](/docs/transformers/main/ru/main_classes/model#transformers.PreTrainedModel.from_pretrained) для загрузки весов модели.

Модель ResNet с головной частью для классификации изображений (линейный слой поверх пуллинг-функций), например, для ImageNet.

Эта модель наследуется от [PreTrainedModel](/docs/transformers/main/ru/main_classes/model#transformers.PreTrainedModel). Общие методы, которые библиотека реализует для всех своих моделей (например, загрузка или сохранение, изменение размера входных эмбеддингов, обрезка головок и т. д.), описаны в документации родительского класса.

Эта модель также является подклассом [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) в PyTorch. Используйте её как обычный модуль PyTorch и обращайтесь к документации PyTorch по всем вопросам, связанным с общим использованием и поведением.

#### forward[[transformers.ResNetForImageClassification.forward]]

```python
forward(pixel_values: typing.Optional[torch.Tensor] = None, labels: typing.Optional[torch.LongTensor] = None, output_hidden_states: bool | None = None, return_dict: bool | None = None, **kwargs)
```

[Источник](https://github.com/huggingface/transformers/blob/main/src/transformers/models/resnet/modeling_resnet.py#L353)

**Параметры:**

pixel_values (`torch.Tensor` формы `(batch_size, num_channels, image_size, image_size)`, *необязательно*) : Тензоры, соответствующие входным изображениям. Значения пикселей можно получить с помощью [ConvNextImageProcessor](/docs/transformers/main/ru/model_doc/convnext#transformers.ConvNextImageProcessor). Подробности см. в [ConvNextImageProcessor.__call__()](/docs/transformers/main/ru/model_doc/molmo2#transformers.Molmo2ImageProcessor.__call__) (`processor_class` использует [ConvNextImageProcessor](/docs/transformers/main/ru/model_doc/convnext#transformers.ConvNextImageProcessor) для обработки изображений).

labels (`torch.LongTensor` формы `(batch_size,)`, *необязательный*) : Метки для вычисления функции потерь классификации/регрессии изображений. Индексы должны находиться в диапазоне `[0, ..., config.num_labels - 1]`. Если `config.num_labels > 1`, вычисляется функция потерь классификации (Cross-Entropy).

output_hidden_states (`bool`, *необязательный*) : Нужно ли возвращать скрытые состояния всех слоёв. Подробнее о `hidden_states` в разделе возвращаемых тензоров.

return_dict (`bool`, *необязательный*) : Нужно ли возвращать [ModelOutput](/docs/transformers/main/ru/main_classes/output#transformers.utils.ModelOutput) вместо обычного кортежа.

**Возвращает:** [ImageClassifierOutputWithNoAttention](/docs/transformers/main/ru/main_classes/output#transformers.modeling_outputs.ImageClassifierOutputWithNoAttention) или `tuple(torch.Tensor)`

Объект [ImageClassifierOutputWithNoAttention](/docs/transformers/main/ru/main_classes/output#transformers.modeling_outputs.ImageClassifierOutputWithNoAttention) или кортеж `torch.Tensor` (если передано `return_dict=False` или если `config.return_dict=False`), содержащий различные элементы в зависимости от конфигурации ([ResNetConfig](/docs/transformers/main/ru/model_doc/resnet#transformers.ResNetConfig)) и входных данных.

Метод forward класса [ResNetForImageClassification](/docs/transformers/main/ru/model_doc/resnet#transformers.ResNetForImageClassification) переопределяет специальный метод `__call__`.

Хотя рецепт для прямого прохода должен быть определён внутри этой функции, после этого следует вызывать экземпляр `Module`, а не эту функцию, поскольку первый выполняет шаги предварительной и постобработки, тогда как второй молча их игнорирует.

- **loss** (`torch.Tensor` формы `(1,)`, *необязательный*, возвращается, если задан `labels`) -- Потери классификации (или регрессии, если config.num_labels==1).
- **logits** (`torch.Tensor` формы `(batch_size, config.num_labels)`) — Оценки классификации (или регрессии, если config.num_labels==1) до применения SoftMax.
- **hidden_states** (`tuple(torch.Tensor)`, *необязательный*, возвращается при передаче `output_hidden_states=True` или при `config.output_hidden_states=True`) -- Кортеж `torch.Tensor` (один для вывода слоя встраиваний, если модель имеет слой встраиваний, + один для вывода каждого этапа) формы `(batch_size, num_channels, height, width)`. Скрытые состояния (также называемые картами признаков) модели на выходе каждого этапа.

Пример:

```python
>>> from transformers import AutoImageProcessor, ResNetForImageClassification
>>> import torch
>>> from datasets import load_dataset

>>> dataset = load_dataset("huggingface/cats-image")
>>> image = dataset["test"]["image"][0]

>>> image_processor = AutoImageProcessor.from_pretrained("microsoft/resnet-50")
>>> model = ResNetForImageClassification.from_pretrained("microsoft/resnet-50")

>>> inputs = image_processor(image, return_tensors="pt")

>>> with torch.no_grad():
...     logits = model(**inputs).logits

>>> # model predicts one of the 1000 ImageNet classes
>>> predicted_label = logits.argmax(-1).item()
>>> print(model.config.id2label[predicted_label])
...
```

