# 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` الخاصة بالعقدة الضيقة (bottleneck) وليس في طبقة الالتفاف الأولى `1x1`. ويُعرف هذا التصميم بشكل عام باسم "ResNet v1.5".

قدّم ResNet اتصالات متبقية، تتيح تدريب شبكات بعدد غير مسبوق من الطبقات (حتى 1000). فاز ResNet بمسابقة ILSVRC & COCO لعام 2015، وهو إنجاز مهم في مجال الرؤية الحاسوبية العميقة.

المستخلص من الورقة البحثية هو كالتالي:

*تُعد الشبكات العصبية الأعمق أكثر صعوبة في التدريب. نقدم إطارًا للتعلم المتبقي لتسهيل تدريب الشبكات التي تكون أعمق بكثير من تلك المستخدمة سابقًا. نعيد صياغة الطبقات صراحةً على أنها تتعلم دوالًا متبقية مع الإشارة إلى مدخلات الطبقة، بدلاً من تعلم دوال غير مرجعية. نقدم أدلة تجريبية شاملة تُظهر أن هذه الشبكات المتبقية أسهل في التحسين، ويمكنها تحقيق دقة أعلى من خلال زيادة عمقها بشكل كبير. على مجموعة بيانات ImageNet، نقيّم الشبكات المتبقية بعمق يصل إلى 152 طبقة، أي أعمق بثمانية أضعاف من شبكات VGG مع الحفاظ على تعقيد أقل. يحقق تجميع من هذه الشبكات المتبقية خطأً بنسبة 3.57% على مجموعة اختبار ImageNet. فاز هذا النتيجة بالمركز الأول في مهمة التصنيف في ILSVRC 2015. كما نقدم تحليلًا على CIFAR-10 باستخدام 100 و1000 طبقة. يُعد عمق التمثيلات ذا أهمية مركزية للعديد من مهام التعرف البصري. بفضل تمثيلاتنا العميقة للغاية فقط، نحقق تحسينًا نسبيًا بنسبة 28% على مجموعة بيانات COCO للكشف عن الكائنات. تُعد الشبكات العميقة المتبقية أساسًا لمشاركاتنا في مسابقات ILSVRC & COCO 2015، حيث فزنا أيضًا بالمراكز الأولى في مهام كشف 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/ar/model_doc/resnet#transformers.ResNetForImageClassification) دعمًا لهذا [دفتر الملاحظات](https://colab.research.google.com/github/huggingface/notebooks/blob/main/examples/image_classification.ipynb).
- انظر أيضاً: [دليل مهمة تصنيف الصور](../tasks/image_classification)

إذا كنت مهتمًا بتقديم مورد ليُدرج هنا، فلا تتردد في فتح طلب سحب وسنقوم بمراجعته! يُفضَّل أن يُظهر المورد شيئًا جديدًا بدلاً من تكرار مورد موجود مسبقًا.

## 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/ar/main_classes/configuration#transformers.PreTrainedConfig) ويمكن استخدامها للتحكم في مخرجات النموذج. اقرأ التوثيق الخاص بـ [PreTrainedConfig](/docs/transformers/main/ar/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/ar/model_doc/resnet#transformers.ResNetConfig)) : فئة إعدادات النموذج التي تحتوي على جميع معاملات النموذج. عند التهيئة باستخدام ملف إعدادات، لا يتم تحميل الأوزان المرتبطة بالنموذج، بل الإعدادات فقط. راجع طريقة [from_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.from_pretrained) لتحميل أوزان النموذج.

نموذج Resnet الأساسي الذي يُخرج حالات مخفية خام دون أي رأس محدد في الأعلى.

يرث هذا النموذج من [PreTrainedModel](/docs/transformers/main/ar/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/ar/model_doc/convnext#transformers.ConvNextImageProcessor). راجع [ConvNextImageProcessor.__call__()](/docs/transformers/main/ar/model_doc/molmo2#transformers.Molmo2ImageProcessor.__call__) للتفاصيل (`processor_class` يستخدم [ConvNextImageProcessor](/docs/transformers/main/ar/model_doc/convnext#transformers.ConvNextImageProcessor) لمعالجة الصور).

output_hidden_states (`bool`, *اختياري*) : ما إذا كان سيتم إرجاع الحالات المخفية لجميع الطبقات. راجع `hidden_states` ضمن الموترات المُرجعة لمزيد من التفاصيل.

return_dict (`bool`، *اختياري*) : ما إذا كان سيتم إرجاع [ModelOutput](/docs/transformers/main/ar/main_classes/output#transformers.utils.ModelOutput) بدلاً من tuple عادي.

**يعيد:** `BaseModelOutputWithPoolingAndNoAttention` أو `tuple(torch.Tensor)`

`BaseModelOutputWithPoolingAndNoAttention` أو مجموعة مرتبة من `torch.Tensor` (إذا تم تمرير `return_dict=False` أو عندما يكون `config.return_dict=False`) وتتضمن عناصر مختلفة اعتماداً على الإعداد ([ResNetConfig](/docs/transformers/main/ar/model_doc/resnet#transformers.ResNetConfig)) والمدخلات.

تتجاوز طريقة [ResNetModel](/docs/transformers/main/ar/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/ar/model_doc/resnet#transformers.ResNetConfig)) : فئة إعدادات النموذج التي تحتوي على جميع معاملات النموذج. عند التهيئة باستخدام ملف إعدادات، لا يتم تحميل الأوزان المرتبطة بالنموذج، بل الإعدادات فقط. راجع طريقة [from_pretrained()](/docs/transformers/main/ar/main_classes/model#transformers.PreTrainedModel.from_pretrained) لتحميل أوزان النموذج.

نموذج ResNet مع رأس تصنيف صور في الأعلى (طبقة خطية فوق الميزات المجمعة)، على سبيل المثال لـ ImageNet.

يرث هذا النموذج من [PreTrainedModel](/docs/transformers/main/ar/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/ar/model_doc/convnext#transformers.ConvNextImageProcessor). راجع [ConvNextImageProcessor.__call__()](/docs/transformers/main/ar/model_doc/molmo2#transformers.Molmo2ImageProcessor.__call__) للتفاصيل (`processor_class` يستخدم [ConvNextImageProcessor](/docs/transformers/main/ar/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/ar/main_classes/output#transformers.utils.ModelOutput) بدلاً من tuple عادي.

**يعيد:** [ImageClassifierOutputWithNoAttention](/docs/transformers/main/ar/main_classes/output#transformers.modeling_outputs.ImageClassifierOutputWithNoAttention) أو `tuple(torch.Tensor)`

[ImageClassifierOutputWithNoAttention](/docs/transformers/main/ar/main_classes/output#transformers.modeling_outputs.ImageClassifierOutputWithNoAttention) أو مجموعة من `torch.Tensor` (إذا تم تمرير `return_dict=False` أو عندما يكون `config.return_dict=False`) تتكون من عناصر مختلفة اعتماداً على الإعداد ([ResNetConfig](/docs/transformers/main/ar/model_doc/resnet#transformers.ResNetConfig)) والمدخلات.

تتجاوز طريقة [ResNetForImageClassification](/docs/transformers/main/ar/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])
...
```

