





from typing import Dict, List

from nltk.translate import gleu_score

import datasets
from datasets import MetricInfo


UpperCAmelCase_ 							=       """\
@misc{wu2016googles,
      title={Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation},
      author={Yonghui Wu and Mike Schuster and Zhifeng Chen and Quoc V. Le and Mohammad Norouzi and Wolfgang Macherey
              and Maxim Krikun and Yuan Cao and Qin Gao and Klaus Macherey and Jeff Klingner and Apurva Shah and Melvin
              Johnson and Xiaobing Liu and Łukasz Kaiser and Stephan Gouws and Yoshikiyo Kato and Taku Kudo and Hideto
              Kazawa and Keith Stevens and George Kurian and Nishant Patil and Wei Wang and Cliff Young and
              Jason Smith and Jason Riesa and Alex Rudnick and Oriol Vinyals and Greg Corrado and Macduff Hughes
              and Jeffrey Dean},
      year={2016},
      eprint={1609.08144},
      archivePrefix={arXiv},
      primaryClass={cs.CL}
}
"""

UpperCAmelCase_ 							=       """\
The BLEU score has some undesirable properties when used for single
sentences, as it was designed to be a corpus measure. We therefore
use a slightly different score for our RL experiments which we call
the 'GLEU score'. For the GLEU score, we record all sub-sequences of
1, 2, 3 or 4 tokens in output and target sequence (n-grams). We then
compute a recall, which is the ratio of the number of matching n-grams
to the number of total n-grams in the target (ground truth) sequence,
and a precision, which is the ratio of the number of matching n-grams
to the number of total n-grams in the generated output sequence. Then
GLEU score is simply the minimum of recall and precision. This GLEU
score's range is always between 0 (no matches) and 1 (all match) and
it is symmetrical when switching output and target. According to
our experiments, GLEU score correlates quite well with the BLEU
metric on a corpus level but does not have its drawbacks for our per
sentence reward objective.
"""

UpperCAmelCase_ 							=       """\
Computes corpus-level Google BLEU (GLEU) score of translated segments against one or more references.
Instead of averaging the sentence level GLEU scores (i.e. macro-average precision), Wu et al. (2016) sum up the matching
tokens and the max of hypothesis and reference tokens for each sentence, then compute using the aggregate values.

Args:
    predictions (list of str): list of translations to score.
        Each translation should be tokenized into a list of tokens.
    references (list of list of str): list of lists of references for each translation.
        Each reference should be tokenized into a list of tokens.
    min_len (int): The minimum order of n-gram this function should extract. Defaults to 1.
    max_len (int): The maximum order of n-gram this function should extract. Defaults to 4.

Returns:
    'google_bleu': google_bleu score

Examples:
    Example 1:
        >>> hyp1 = ['It', 'is', 'a', 'guide', 'to', 'action', 'which',
        ...         'ensures', 'that', 'the', 'rubber', 'duck', 'always',
        ...         'disobeys', 'the', 'commands', 'of', 'the', 'cat']
        >>> ref1a = ['It', 'is', 'the', 'guiding', 'principle', 'which',
        ...          'guarantees', 'the', 'rubber', 'duck', 'forces', 'never',
        ...          'being', 'under', 'the', 'command', 'of', 'the', 'cat']

        >>> hyp2 = ['he', 'read', 'the', 'book', 'because', 'he', 'was',
        ...         'interested', 'in', 'world', 'history']
        >>> ref2a = ['he', 'was', 'interested', 'in', 'world', 'history',
        ...          'because', 'he', 'read', 'the', 'book']

        >>> list_of_references = [[ref1a], [ref2a]]
        >>> hypotheses = [hyp1, hyp2]
        >>> google_bleu = datasets.load_metric(\"google_bleu\")
        >>> results = google_bleu.compute(predictions=hypotheses, references=list_of_references)
        >>> print(round(results[\"google_bleu\"], 2))
        0.44

    Example 2:
        >>> hyp1 = ['It', 'is', 'a', 'guide', 'to', 'action', 'which',
        ...         'ensures', 'that', 'the', 'rubber', 'duck', 'always',
        ...         'disobeys', 'the', 'commands', 'of', 'the', 'cat']
        >>> ref1a = ['It', 'is', 'the', 'guiding', 'principle', 'which',
        ...          'guarantees', 'the', 'rubber', 'duck', 'forces', 'never',
        ...          'being', 'under', 'the', 'command', 'of', 'the', 'cat']
        >>> ref1b = ['It', 'is', 'a', 'guide', 'to', 'action', 'that',
        ...          'ensures', 'that', 'the', 'rubber', 'duck', 'will', 'never',
        ...          'heed', 'the', 'cat', 'commands']
        >>> ref1c = ['It', 'is', 'the', 'practical', 'guide', 'for', 'the',
        ...          'rubber', 'duck', 'army', 'never', 'to', 'heed', 'the', 'directions',
        ...          'of', 'the', 'cat']

        >>> hyp2 = ['he', 'read', 'the', 'book', 'because', 'he', 'was',
        ...         'interested', 'in', 'world', 'history']
        >>> ref2a = ['he', 'was', 'interested', 'in', 'world', 'history',
        ...          'because', 'he', 'read', 'the', 'book']

        >>> list_of_references = [[ref1a, ref1b, ref1c], [ref2a]]
        >>> hypotheses = [hyp1, hyp2]
        >>> google_bleu = datasets.load_metric(\"google_bleu\")
        >>> results = google_bleu.compute(predictions=hypotheses, references=list_of_references)
        >>> print(round(results[\"google_bleu\"], 2))
        0.61

    Example 3:
        >>> hyp1 = ['It', 'is', 'a', 'guide', 'to', 'action', 'which',
        ...         'ensures', 'that', 'the', 'rubber', 'duck', 'always',
        ...         'disobeys', 'the', 'commands', 'of', 'the', 'cat']
        >>> ref1a = ['It', 'is', 'the', 'guiding', 'principle', 'which',
        ...          'guarantees', 'the', 'rubber', 'duck', 'forces', 'never',
        ...          'being', 'under', 'the', 'command', 'of', 'the', 'cat']
        >>> ref1b = ['It', 'is', 'a', 'guide', 'to', 'action', 'that',
        ...          'ensures', 'that', 'the', 'rubber', 'duck', 'will', 'never',
        ...          'heed', 'the', 'cat', 'commands']
        >>> ref1c = ['It', 'is', 'the', 'practical', 'guide', 'for', 'the',
        ...          'rubber', 'duck', 'army', 'never', 'to', 'heed', 'the', 'directions',
        ...          'of', 'the', 'cat']

        >>> hyp2 = ['he', 'read', 'the', 'book', 'because', 'he', 'was',
        ...         'interested', 'in', 'world', 'history']
        >>> ref2a = ['he', 'was', 'interested', 'in', 'world', 'history',
        ...          'because', 'he', 'read', 'the', 'book']

        >>> list_of_references = [[ref1a, ref1b, ref1c], [ref2a]]
        >>> hypotheses = [hyp1, hyp2]
        >>> google_bleu = datasets.load_metric(\"google_bleu\")
        >>> results = google_bleu.compute(predictions=hypotheses, references=list_of_references, min_len=2)
        >>> print(round(results[\"google_bleu\"], 2))
        0.53

    Example 4:
        >>> hyp1 = ['It', 'is', 'a', 'guide', 'to', 'action', 'which',
        ...         'ensures', 'that', 'the', 'rubber', 'duck', 'always',
        ...         'disobeys', 'the', 'commands', 'of', 'the', 'cat']
        >>> ref1a = ['It', 'is', 'the', 'guiding', 'principle', 'which',
        ...          'guarantees', 'the', 'rubber', 'duck', 'forces', 'never',
        ...          'being', 'under', 'the', 'command', 'of', 'the', 'cat']
        >>> ref1b = ['It', 'is', 'a', 'guide', 'to', 'action', 'that',
        ...          'ensures', 'that', 'the', 'rubber', 'duck', 'will', 'never',
        ...          'heed', 'the', 'cat', 'commands']
        >>> ref1c = ['It', 'is', 'the', 'practical', 'guide', 'for', 'the',
        ...          'rubber', 'duck', 'army', 'never', 'to', 'heed', 'the', 'directions',
        ...          'of', 'the', 'cat']

        >>> hyp2 = ['he', 'read', 'the', 'book', 'because', 'he', 'was',
        ...         'interested', 'in', 'world', 'history']
        >>> ref2a = ['he', 'was', 'interested', 'in', 'world', 'history',
        ...          'because', 'he', 'read', 'the', 'book']

        >>> list_of_references = [[ref1a, ref1b, ref1c], [ref2a]]
        >>> hypotheses = [hyp1, hyp2]
        >>> google_bleu = datasets.load_metric(\"google_bleu\")
        >>> results = google_bleu.compute(predictions=hypotheses,references=list_of_references, min_len=2, max_len=6)
        >>> print(round(results[\"google_bleu\"], 2))
        0.4
"""
@datasets.utils.file_utils.add_start_docstrings(_DESCRIPTION							,					_KWARGS_DESCRIPTION   )
class      UpperCamelCase_						(					datasets.Metric   ):




     def 		lowerCAmelCase     (						self					)						->							MetricInfo:
          return datasets.MetricInfo(
              description=_DESCRIPTION			,  citation=_CITATION			,  inputs_description=_KWARGS_DESCRIPTION			,  features=datasets.Features(
                  {
                      'predictions': datasets.Sequence(datasets.Value('string'			,  id='token'					)			,  id='sequence'					),
                      'references': datasets.Sequence(
                          datasets.Sequence(datasets.Value('string'			,  id='token'					)			,  id='sequence'					)			,  id='references'					),
                  }					)			,  )






     def 		lowerCAmelCase     (						self			,  lowerCAmelCase_			,  lowerCAmelCase_			,  lowerCAmelCase_ = 1			,  lowerCAmelCase_ = 4			,  )						->							Dict[str, float]:
          return {
              "google_bleu": gleu_score.corpus_gleu(
                  list_of_references=lowerCAmelCase_			,  hypotheses=lowerCAmelCase_			,  min_len=lowerCAmelCase_			,  max_len=lowerCAmelCase_					)
          }










from typing import Optional

import torch
import torch.utils.checkpoint
from torch import Tensor, nn
from torch.nn import BCEWithLogitsLoss, CrossEntropyLoss, MSELoss

from ...activations import ACTaFN
from ...modeling_outputs import (
    BackboneOutput,
    BaseModelOutputWithNoAttention,
    BaseModelOutputWithPoolingAndNoAttention,
    ImageClassifierOutputWithNoAttention,
)
from ...modeling_utils import PreTrainedModel
from ...utils import (
    add_code_sample_docstrings,
    add_start_docstrings,
    add_start_docstrings_to_model_forward,
    logging,
    replace_return_docstrings,
)
from ...utils.backbone_utils import BackboneMixin
from .configuration_resnet import ResNetConfig


UpperCAmelCase_ 							=       logging.get_logger(__name__)

# General docstring
UpperCAmelCase_ 							=       """ResNetConfig"""

# Base docstring
UpperCAmelCase_ 							=       """microsoft/resnet-50"""
UpperCAmelCase_ 							=       [1, 2048, 7, 7]

# Image classification docstring
UpperCAmelCase_ 							=       """microsoft/resnet-50"""
UpperCAmelCase_ 							=       """tiger cat"""

UpperCAmelCase_ 							=       [
    """microsoft/resnet-50""",
    # See all resnet models at https://huggingface.co/models?filter=resnet
]
class      UpperCamelCase_						(					nn.Module   ):




					def __init__(						self			,  lowerCAmelCase_			,  lowerCAmelCase_			,  lowerCAmelCase_ = 3			,  lowerCAmelCase_ = 1			,  lowerCAmelCase_ = "relu"					)						->							Union[str, Any]:
										super().__init__()
										_snake_case													=			nn.Convad(
										    lowerCAmelCase_			,  lowerCAmelCase_			,  kernel_size=lowerCAmelCase_			,  stride=lowerCAmelCase_			,  padding=kernel_size // 2			,  bias=lowerCAmelCase_					)
										_snake_case													=			nn.BatchNormad(lowerCAmelCase_					)
										_snake_case													=			ACTaFN[activation] if activation is not None else nn.Identity()






					def 		lowerCAmelCase     (						self			,  lowerCAmelCase_					)						->							Tensor:
										_snake_case													=			self.convolution(lowerCAmelCase_					)
										_snake_case													=			self.normalization(lowerCAmelCase_					)
										_snake_case													=			self.activation(lowerCAmelCase_					)
										return hidden_state





class      UpperCamelCase_						(					nn.Module   ):




					def __init__(						self			,  lowerCAmelCase_					)						->							Dict:
										super().__init__()
										_snake_case													=			ResNetConvLayer(
										    config.num_channels			,  config.embedding_size			,  kernel_size=7			,  stride=2			,  activation=config.hidden_act					)
										_snake_case													=			nn.MaxPoolad(kernel_size=3			,  stride=2			,  padding=1					)
										_snake_case													=			config.num_channels






					def 		lowerCAmelCase     (						self			,  lowerCAmelCase_					)						->							Tensor:
										_snake_case													=			pixel_values.shape[1]
										if num_channels != self.num_channels:
															raise ValueError(
															    'Make sure that the channel dimension of the pixel values match with the one set in the configuration.'					)
										_snake_case													=			self.embedder(lowerCAmelCase_					)
										_snake_case													=			self.pooler(lowerCAmelCase_					)
										return embedding





class      UpperCamelCase_						(					nn.Module   ):




					def __init__(						self			,  lowerCAmelCase_			,  lowerCAmelCase_			,  lowerCAmelCase_ = 2					)						->							List[Any]:
										super().__init__()
										_snake_case													=			nn.Convad(lowerCAmelCase_			,  lowerCAmelCase_			,  kernel_size=1			,  stride=lowerCAmelCase_			,  bias=lowerCAmelCase_					)
										_snake_case													=			nn.BatchNormad(lowerCAmelCase_					)






					def 		lowerCAmelCase     (						self			,  lowerCAmelCase_					)						->							Tensor:
										_snake_case													=			self.convolution(lowerCAmelCase_					)
										_snake_case													=			self.normalization(lowerCAmelCase_					)
										return hidden_state





class      UpperCamelCase_						(					nn.Module   ):




					def __init__(						self			,  lowerCAmelCase_			,  lowerCAmelCase_			,  lowerCAmelCase_ = 1			,  lowerCAmelCase_ = "relu"					)						->							Any:
										super().__init__()
										_snake_case													=			in_channels != out_channels or stride != 1
										_snake_case													=			(
										    ResNetShortCut(lowerCAmelCase_			,  lowerCAmelCase_			,  stride=lowerCAmelCase_					) if should_apply_shortcut else nn.Identity()
										)
										_snake_case													=			nn.Sequential(
										    ResNetConvLayer(lowerCAmelCase_			,  lowerCAmelCase_			,  stride=lowerCAmelCase_					)			,  ResNetConvLayer(lowerCAmelCase_			,  lowerCAmelCase_			,  activation=lowerCAmelCase_					)			,  )
										_snake_case													=			ACTaFN[activation]






					def 		lowerCAmelCase     (						self			,  lowerCAmelCase_					)						->							str:
										_snake_case													=			hidden_state
										_snake_case													=			self.layer(lowerCAmelCase_					)
										_snake_case													=			self.shortcut(lowerCAmelCase_					)
										hidden_state += residual
										_snake_case													=			self.activation(lowerCAmelCase_					)
										return hidden_state





class      UpperCamelCase_						(					nn.Module   ):




					def __init__(						self			,  lowerCAmelCase_			,  lowerCAmelCase_			,  lowerCAmelCase_ = 1			,  lowerCAmelCase_ = "relu"			,  lowerCAmelCase_ = 4					)						->							List[str]:
										super().__init__()
										_snake_case													=			in_channels != out_channels or stride != 1
										_snake_case													=			out_channels // reduction
										_snake_case													=			(
										    ResNetShortCut(lowerCAmelCase_			,  lowerCAmelCase_			,  stride=lowerCAmelCase_					) if should_apply_shortcut else nn.Identity()
										)
										_snake_case													=			nn.Sequential(
										    ResNetConvLayer(lowerCAmelCase_			,  lowerCAmelCase_			,  kernel_size=1					)			,  ResNetConvLayer(lowerCAmelCase_			,  lowerCAmelCase_			,  stride=lowerCAmelCase_					)			,  ResNetConvLayer(lowerCAmelCase_			,  lowerCAmelCase_			,  kernel_size=1			,  activation=lowerCAmelCase_					)			,  )
										_snake_case													=			ACTaFN[activation]






					def 		lowerCAmelCase     (						self			,  lowerCAmelCase_					)						->							Optional[Any]:
										_snake_case													=			hidden_state
										_snake_case													=			self.layer(lowerCAmelCase_					)
										_snake_case													=			self.shortcut(lowerCAmelCase_					)
										hidden_state += residual
										_snake_case													=			self.activation(lowerCAmelCase_					)
										return hidden_state





class      UpperCamelCase_						(					nn.Module   ):




					def __init__(						self			,  lowerCAmelCase_			,  lowerCAmelCase_			,  lowerCAmelCase_			,  lowerCAmelCase_ = 2			,  lowerCAmelCase_ = 2			,  )						->							Tuple:
										super().__init__()

										_snake_case													=			ResNetBottleNeckLayer if config.layer_type == 'bottleneck' else ResNetBasicLayer

										_snake_case													=			nn.Sequential(
										    # downsampling is done in the first layer with stride of 2
										    layer(lowerCAmelCase_			,  lowerCAmelCase_			,  stride=lowerCAmelCase_			,  activation=config.hidden_act					)			,  *[layer(lowerCAmelCase_			,  lowerCAmelCase_			,  activation=config.hidden_act					) for _ in range(depth - 1					)]			,  )






					def 		lowerCAmelCase     (						self			,  lowerCAmelCase_					)						->							Tensor:
										_snake_case													=			input
										for layer in self.layers:
															_snake_case													=			layer(lowerCAmelCase_					)
										return hidden_state





class      UpperCamelCase_						(					nn.Module   ):




					def __init__(						self			,  lowerCAmelCase_					)						->							int:
										super().__init__()
										_snake_case													=			nn.ModuleList([]					)
										# based on `downsample_in_first_stage` the first layer of the first stage may or may not downsample the input
										self.stages.append(
										    ResNetStage(
										        lowerCAmelCase_			,  config.embedding_size			,  config.hidden_sizes[0]			,  stride=2 if config.downsample_in_first_stage else 1			,  depth=config.depths[0]			,  )					)
										_snake_case													=			zip(config.hidden_sizes			,  config.hidden_sizes[1:]					)
										for (in_channels, out_channels), depth in zip(lowerCAmelCase_			,  config.depths[1:]					):
															self.stages.append(ResNetStage(lowerCAmelCase_			,  lowerCAmelCase_			,  lowerCAmelCase_			,  depth=lowerCAmelCase_					)					)






					def 		lowerCAmelCase     (						self			,  lowerCAmelCase_			,  lowerCAmelCase_ = False			,  lowerCAmelCase_ = True					)						->							BaseModelOutputWithNoAttention:
										_snake_case													=			() if output_hidden_states else None

										for stage_module in self.stages:
															if output_hidden_states:
																				_snake_case													=			hidden_states + (hidden_state,)

															_snake_case													=			stage_module(lowerCAmelCase_					)

										if output_hidden_states:
															_snake_case													=			hidden_states + (hidden_state,)

										if not return_dict:
															return tuple(v for v in [hidden_state, hidden_states] if v is not None					)

										return BaseModelOutputWithNoAttention(
										    last_hidden_state=lowerCAmelCase_			,  hidden_states=lowerCAmelCase_			,  )





class      UpperCamelCase_						(					_lowerCamelCase   ):
					lowerCAmelCase_							=		ResNetConfig
					lowerCAmelCase_							=		'''resnet'''
					lowerCAmelCase_							=		'''pixel_values'''
					lowerCAmelCase_							=		True




					def 		lowerCAmelCase     (						self			,  lowerCAmelCase_					)						->							Dict:
										if isinstance(lowerCAmelCase_			,  nn.Convad					):
															nn.init.kaiming_normal_(module.weight			,  mode='fan_out'			,  nonlinearity='relu'					)
										elif isinstance(lowerCAmelCase_			,  (nn.BatchNormad, nn.GroupNorm)					):
															nn.init.constant_(module.weight			,  1					)
															nn.init.constant_(module.bias			,  0					)






					def 		lowerCAmelCase     (						self			,  lowerCAmelCase_			,  lowerCAmelCase_=False					)						->							List[Any]:
										if isinstance(lowerCAmelCase_			,  lowerCAmelCase_					):
															_snake_case													=			value





UpperCAmelCase_ 							=       R"""
    This model is a PyTorch [torch.nn.Module](https://pytorch.org/docs/stable/nn.html#torch.nn.Module) subclass. Use it
    as a regular PyTorch Module and refer to the PyTorch documentation for all matter related to general usage and
    behavior.

    Parameters:
        config ([`ResNetConfig`]): Model configuration class with all the parameters of the model.
            Initializing with a config file does not load the weights associated with the model, only the
            configuration. Check out the [`~PreTrainedModel.from_pretrained`] method to load the model weights.
"""

UpperCAmelCase_ 							=       R"""
    Args:
        pixel_values (`torch.FloatTensor` of shape `(batch_size, num_channels, height, width)`):
            Pixel values. Pixel values can be obtained using [`AutoImageProcessor`]. See
            [`ConvNextImageProcessor.__call__`] for details.

        output_hidden_states (`bool`, *optional*):
            Whether or not to return the hidden states of all layers. See `hidden_states` under returned tensors for
            more detail.
        return_dict (`bool`, *optional*):
            Whether or not to return a [`~utils.ModelOutput`] instead of a plain tuple.
"""
@add_start_docstrings(
    '''The bare ResNet model outputting raw features without any specific head on top.'''							,					_lowerCamelCase							,					)
class      UpperCamelCase_						(					_lowerCamelCase   ):




					def __init__(						self			,  lowerCAmelCase_					)						->							int:
										super().__init__(lowerCAmelCase_					)
										_snake_case													=			config
										_snake_case													=			ResNetEmbeddings(lowerCAmelCase_					)
										_snake_case													=			ResNetEncoder(lowerCAmelCase_					)
										_snake_case													=			nn.AdaptiveAvgPoolad((1, 1)					)
										# Initialize weights and apply final processing
										self.post_init()






					@add_start_docstrings_to_model_forward(lowerCAmelCase_					)
					@add_code_sample_docstrings(
					    checkpoint=_CHECKPOINT_FOR_DOC			,  output_type=lowerCAmelCase_			,  config_class=_CONFIG_FOR_DOC			,  modality='vision'			,  expected_output=_EXPECTED_OUTPUT_SHAPE			,  )
					def 		lowerCAmelCase     (						self			,  lowerCAmelCase_			,  lowerCAmelCase_ = None			,  lowerCAmelCase_ = None					)						->							BaseModelOutputWithPoolingAndNoAttention:
										_snake_case													=			(
										    output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
										)
										_snake_case													=			return_dict if return_dict is not None else self.config.use_return_dict

										_snake_case													=			self.embedder(lowerCAmelCase_					)

										_snake_case													=			self.encoder(
										    lowerCAmelCase_			,  output_hidden_states=lowerCAmelCase_			,  return_dict=lowerCAmelCase_					)

										_snake_case													=			encoder_outputs[0]

										_snake_case													=			self.pooler(lowerCAmelCase_					)

										if not return_dict:
															return (last_hidden_state, pooled_output) + encoder_outputs[1:]

										return BaseModelOutputWithPoolingAndNoAttention(
										    last_hidden_state=lowerCAmelCase_			,  pooler_output=lowerCAmelCase_			,  hidden_states=encoder_outputs.hidden_states			,  )





@add_start_docstrings(
    '''
    ResNet Model with an image classification head on top (a linear layer on top of the pooled features), e.g. for
    ImageNet.
    '''							,					_lowerCamelCase							,					)
class      UpperCamelCase_						(					_lowerCamelCase   ):




					def __init__(						self			,  lowerCAmelCase_					)						->							Union[str, Any]:
										super().__init__(lowerCAmelCase_					)
										_snake_case													=			config.num_labels
										_snake_case													=			ResNetModel(lowerCAmelCase_					)
										# classification head
										_snake_case													=			nn.Sequential(
										    nn.Flatten()			,  nn.Linear(config.hidden_sizes[-1]			,  config.num_labels					) if config.num_labels > 0 else nn.Identity()			,  )
										# initialize weights and apply final processing
										self.post_init()






					@add_start_docstrings_to_model_forward(lowerCAmelCase_					)
					@add_code_sample_docstrings(
					    checkpoint=_IMAGE_CLASS_CHECKPOINT			,  output_type=lowerCAmelCase_			,  config_class=_CONFIG_FOR_DOC			,  expected_output=_IMAGE_CLASS_EXPECTED_OUTPUT			,  )
					def 		lowerCAmelCase     (						self			,  lowerCAmelCase_ = None			,  lowerCAmelCase_ = None			,  lowerCAmelCase_ = None			,  lowerCAmelCase_ = None			,  )						->							ImageClassifierOutputWithNoAttention:
										_snake_case													=			return_dict if return_dict is not None else self.config.use_return_dict

										_snake_case													=			self.resnet(lowerCAmelCase_			,  output_hidden_states=lowerCAmelCase_			,  return_dict=lowerCAmelCase_					)

										_snake_case													=			outputs.pooler_output if return_dict else outputs[1]

										_snake_case													=			self.classifier(lowerCAmelCase_					)

										_snake_case													=			None

										if labels is not None:
															if self.config.problem_type is None:
																				if self.num_labels == 1:
																									_snake_case													=			'regression'
																				elif self.num_labels > 1 and (labels.dtype == torch.long or labels.dtype == torch.int):
																									_snake_case													=			'single_label_classification'
																				else:
																									_snake_case													=			'multi_label_classification'
															if self.config.problem_type == "regression":
																				_snake_case													=			MSELoss()
																				if self.num_labels == 1:
																									_snake_case													=			loss_fct(logits.squeeze()			,  labels.squeeze()					)
																				else:
																									_snake_case													=			loss_fct(lowerCAmelCase_			,  lowerCAmelCase_					)
															elif self.config.problem_type == "single_label_classification":
																				_snake_case													=			CrossEntropyLoss()
																				_snake_case													=			loss_fct(logits.view(-1			,  self.num_labels					)			,  labels.view(-1					)					)
															elif self.config.problem_type == "multi_label_classification":
																				_snake_case													=			BCEWithLogitsLoss()
																				_snake_case													=			loss_fct(lowerCAmelCase_			,  lowerCAmelCase_					)

										if not return_dict:
															_snake_case													=			(logits,) + outputs[2:]
															return (loss,) + output if loss is not None else output

										return ImageClassifierOutputWithNoAttention(loss=lowerCAmelCase_			,  logits=lowerCAmelCase_			,  hidden_states=outputs.hidden_states					)





@add_start_docstrings(
    '''
    ResNet backbone, to be used with frameworks like DETR and MaskFormer.
    '''							,					_lowerCamelCase							,					)
class      UpperCamelCase_						(					_lowerCamelCase							,					_lowerCamelCase   ):




					def __init__(						self			,  lowerCAmelCase_					)						->							List[Any]:
										super().__init__(lowerCAmelCase_					)
										super()._init_backbone(lowerCAmelCase_					)

										_snake_case													=			[config.embedding_size] + config.hidden_sizes
										_snake_case													=			ResNetEmbeddings(lowerCAmelCase_					)
										_snake_case													=			ResNetEncoder(lowerCAmelCase_					)

										# initialize weights and apply final processing
										self.post_init()






					@add_start_docstrings_to_model_forward(lowerCAmelCase_					)
					@replace_return_docstrings(output_type=lowerCAmelCase_			,  config_class=_CONFIG_FOR_DOC					)
					def 		lowerCAmelCase     (						self			,  lowerCAmelCase_			,  lowerCAmelCase_ = None			,  lowerCAmelCase_ = None					)						->							BackboneOutput:
										_snake_case													=			return_dict if return_dict is not None else self.config.use_return_dict
										_snake_case													=			(
										    output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
										)

										_snake_case													=			self.embedder(lowerCAmelCase_					)

										_snake_case													=			self.encoder(lowerCAmelCase_			,  output_hidden_states=lowerCAmelCase_			,  return_dict=lowerCAmelCase_					)

										_snake_case													=			outputs.hidden_states

										_snake_case													=			()
										for idx, stage in enumerate(self.stage_names					):
															if stage in self.out_features:
																				feature_maps += (hidden_states[idx],)

										if not return_dict:
															_snake_case													=			(feature_maps,)
															if output_hidden_states:
																				output += (outputs.hidden_states,)
															return output

										return BackboneOutput(
										    feature_maps=lowerCAmelCase_			,  hidden_states=outputs.hidden_states if output_hidden_states else None			,  attentions=lowerCAmelCase_			,  )



