


'''simple docstring'''



from __future__ import annotations

import inspect
import unittest

import numpy as np

from transformers import DeiTConfig
from transformers.testing_utils import require_tf, require_vision, slow
from transformers.utils import cached_property, is_tf_available, is_vision_available

from ...test_configuration_common import ConfigTester
from ...test_modeling_tf_common import TFModelTesterMixin, floats_tensor, ids_tensor
from ...test_pipeline_mixin import PipelineTesterMixin


if is_tf_available():
							import tensorflow as tf

							from transformers import (
							    TFDeiTForImageClassification,
							    TFDeiTForImageClassificationWithTeacher,
							    TFDeiTForMaskedImageModeling,
							    TFDeiTModel,
							)
							from transformers.models.deit.modeling_tf_deit import TF_DEIT_PRETRAINED_MODEL_ARCHIVE_LIST


if is_vision_available():
							from PIL import Image

							from transformers import DeiTImageProcessor






class 	UpperCamelCase__:




				def __init__(		self      :			int				,   lowerCAmelCase      :			Any				,   lowerCAmelCase      :			Dict=13				,   lowerCAmelCase      :			Any=30				,   lowerCAmelCase      :			Dict=2				,   lowerCAmelCase      :			List[str]=3				,   lowerCAmelCase      :			Optional[Any]=True				,   lowerCAmelCase      :			Any=True				,   lowerCAmelCase      :			str=32				,   lowerCAmelCase      :			Union[str, Any]=2				,   lowerCAmelCase      :			Any=4				,   lowerCAmelCase      :			List[Any]=37				,   lowerCAmelCase      :			List[Any]="gelu"				,   lowerCAmelCase      :			Tuple=0.1				,   lowerCAmelCase      :			Union[str, Any]=0.1				,   lowerCAmelCase      :			Tuple=10				,   lowerCAmelCase      :			Dict=0.02				,   lowerCAmelCase      :			Union[str, Any]=3				,   lowerCAmelCase      :			Optional[Any]=None				,   lowerCAmelCase      :			Tuple=2				,   )->					str:

										"""simple docstring"""




										UpperCAmelCase					    =     parent
										UpperCAmelCase					    =     batch_size
										UpperCAmelCase					    =     image_size
										UpperCAmelCase					    =     patch_size
										UpperCAmelCase					    =     num_channels
										UpperCAmelCase					    =     is_training
										UpperCAmelCase					    =     use_labels
										UpperCAmelCase					    =     hidden_size
										UpperCAmelCase					    =     num_hidden_layers
										UpperCAmelCase					    =     num_attention_heads
										UpperCAmelCase					    =     intermediate_size
										UpperCAmelCase					    =     hidden_act
										UpperCAmelCase					    =     hidden_dropout_prob
										UpperCAmelCase					    =     attention_probs_dropout_prob
										UpperCAmelCase					    =     type_sequence_label_size
										UpperCAmelCase					    =     initializer_range
										UpperCAmelCase					    =     scope
										UpperCAmelCase					    =     encoder_stride

										# in DeiT, the seq length equals the number of patches + 2 (we add 2 for the [CLS] and distilation tokens)
										UpperCAmelCase					    =     (image_size // patch_size) ** 2
										UpperCAmelCase					    =     num_patches + 2




				def 					a__(		self      :			Optional[Any]				)->					int:

										"""simple docstring"""




										UpperCAmelCase					    =     floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]				)

										UpperCAmelCase					    =     None
										if self.use_labels:
																UpperCAmelCase					    =     ids_tensor([self.batch_size]				,   self.type_sequence_label_size				)

										UpperCAmelCase					    =     self.get_config()

										return config, pixel_values, labels




				def 					a__(		self      :			Dict				)->					Any:

										"""simple docstring"""




										return DeiTConfig(
										    image_size=self.image_size				,   patch_size=self.patch_size				,   num_channels=self.num_channels				,   hidden_size=self.hidden_size				,   num_hidden_layers=self.num_hidden_layers				,   num_attention_heads=self.num_attention_heads				,   intermediate_size=self.intermediate_size				,   hidden_act=self.hidden_act				,   hidden_dropout_prob=self.hidden_dropout_prob				,   attention_probs_dropout_prob=self.attention_probs_dropout_prob				,   is_decoder=__lowerCAmelCase				,   initializer_range=self.initializer_range				,   encoder_stride=self.encoder_stride				,   )




				def 					a__(		self      :			Union[str, Any]				,   lowerCAmelCase      :			int				,   lowerCAmelCase      :			Union[str, Any]				,   lowerCAmelCase      :			Tuple				)->					str:

										"""simple docstring"""




										UpperCAmelCase					    =     TFDeiTModel(config=__lowerCAmelCase				)
										UpperCAmelCase					    =     model(__lowerCAmelCase				)
										self.parent.assertEqual(result.last_hidden_state.shape				,   (self.batch_size, self.seq_length, self.hidden_size)				)




				def 					a__(		self      :			Dict				,   lowerCAmelCase      :			int				,   lowerCAmelCase      :			List[str]				,   lowerCAmelCase      :			Optional[Any]				)->					Union[str, Any]:

										"""simple docstring"""




										UpperCAmelCase					    =     TFDeiTForMaskedImageModeling(config=__lowerCAmelCase				)
										UpperCAmelCase					    =     model(__lowerCAmelCase				)
										self.parent.assertEqual(
										    result.reconstruction.shape				,   (self.batch_size, self.num_channels, self.image_size, self.image_size)				)

										# test greyscale images
										UpperCAmelCase					    =     1
										UpperCAmelCase					    =     TFDeiTForMaskedImageModeling(__lowerCAmelCase				)

										UpperCAmelCase					    =     floats_tensor([self.batch_size, 1, self.image_size, self.image_size]				)
										UpperCAmelCase					    =     model(__lowerCAmelCase				)
										self.parent.assertEqual(result.reconstruction.shape				,   (self.batch_size, 1, self.image_size, self.image_size)				)




				def 					a__(		self      :			Union[str, Any]				,   lowerCAmelCase      :			Dict				,   lowerCAmelCase      :			Any				,   lowerCAmelCase      :			Tuple				)->					List[str]:

										"""simple docstring"""




										UpperCAmelCase					    =     self.type_sequence_label_size
										UpperCAmelCase					    =     TFDeiTForImageClassification(__lowerCAmelCase				)
										UpperCAmelCase					    =     model(__lowerCAmelCase				,   labels=__lowerCAmelCase				)
										self.parent.assertEqual(result.logits.shape				,   (self.batch_size, self.type_sequence_label_size)				)

										# test greyscale images
										UpperCAmelCase					    =     1
										UpperCAmelCase					    =     TFDeiTForImageClassification(__lowerCAmelCase				)

										UpperCAmelCase					    =     floats_tensor([self.batch_size, 1, self.image_size, self.image_size]				)
										UpperCAmelCase					    =     model(__lowerCAmelCase				,   labels=__lowerCAmelCase				)
										self.parent.assertEqual(result.logits.shape				,   (self.batch_size, self.type_sequence_label_size)				)





				def 					a__(		self      :			Any				)->					List[Any]:

										"""simple docstring"""




										UpperCAmelCase					    =     self.prepare_config_and_inputs()
										UpperCAmelCase    ,    UpperCAmelCase    ,    UpperCAmelCase					    =     config_and_inputs
										UpperCAmelCase					    =     {'''pixel_values''': pixel_values}
										return config, inputs_dict







@require_tf
class 	UpperCamelCase__(       lowerCAmelCase						,    lowerCAmelCase						,    unittest.TestCase	):
				__magic_name__    :				List[str]  		=	(
				    (
				        TFDeiTModel,
				        TFDeiTForImageClassification,
				        TFDeiTForImageClassificationWithTeacher,
				        TFDeiTForMaskedImageModeling,
				    )
				    if is_tf_available()
				    else ()
				)
				__magic_name__    :				Any  		=	(
				    {
				        'feature-extraction': TFDeiTModel,
				        'image-classification': (TFDeiTForImageClassification, TFDeiTForImageClassificationWithTeacher),
				    }
				    if is_tf_available()
				    else {}
				)

				__magic_name__    :				Optional[Any]  		=	False
				__magic_name__    :				Any  		=	False
				__magic_name__    :				Union[str, Any]  		=	False
				__magic_name__    :				Tuple  		=	False




				def 					a__(		self      :			int				)->					Optional[int]:

										"""simple docstring"""




										UpperCAmelCase					    =     TFDeiTModelTester(self				)
										UpperCAmelCase					    =     ConfigTester(self				,   config_class=__lowerCAmelCase				,   has_text_modality=__lowerCAmelCase				,   hidden_size=37				)




				def 					a__(		self      :			Tuple				)->					Union[str, Any]:

										"""simple docstring"""




										self.config_tester.run_common_tests()




				@unittest.skip(reason='''DeiT does not use inputs_embeds'''				)
				def 					a__(		self      :			int				)->					Any:

										"""simple docstring"""




										pass




				def 					a__(		self      :			List[Any]				)->					Optional[int]:

										"""simple docstring"""




										UpperCAmelCase    ,    UpperCAmelCase					    =     self.model_tester.prepare_config_and_inputs_for_common()

										for model_class in self.all_model_classes:
																UpperCAmelCase					    =     model_class(__lowerCAmelCase				)
																self.assertIsInstance(model.get_input_embeddings()				,   (tf.keras.layers.Layer)				)
																UpperCAmelCase					    =     model.get_output_embeddings()
																self.assertTrue(x is None or isinstance(__lowerCAmelCase				,   tf.keras.layers.Dense				)				)




				def 					a__(		self      :			Union[str, Any]				)->					Optional[int]:

										"""simple docstring"""




										UpperCAmelCase    ,    UpperCAmelCase					    =     self.model_tester.prepare_config_and_inputs_for_common()

										for model_class in self.all_model_classes:
																UpperCAmelCase					    =     model_class(__lowerCAmelCase				)
																UpperCAmelCase					    =     inspect.signature(model.call				)
																# signature.parameters is an OrderedDict => so arg_names order is deterministic
																UpperCAmelCase					    =     [*signature.parameters.keys()]

																UpperCAmelCase					    =     ['''pixel_values''']
																self.assertListEqual(arg_names[:1]				,   __lowerCAmelCase				)




				def 					a__(		self      :			Optional[int]				)->					int:

										"""simple docstring"""




										UpperCAmelCase					    =     self.model_tester.prepare_config_and_inputs()
										self.model_tester.create_and_check_model(*__lowerCAmelCase				)




				def 					a__(		self      :			Tuple				)->					Dict:

										"""simple docstring"""




										UpperCAmelCase					    =     self.model_tester.prepare_config_and_inputs()
										self.model_tester.create_and_check_for_masked_image_modeling(*__lowerCAmelCase				)




				def 					a__(		self      :			Union[str, Any]				)->					int:

										"""simple docstring"""




										UpperCAmelCase					    =     self.model_tester.prepare_config_and_inputs()
										self.model_tester.create_and_check_for_image_classification(*__lowerCAmelCase				)




				def 					a__(		self      :			Any				,   lowerCAmelCase      :			Dict				,   lowerCAmelCase      :			List[str]				,   lowerCAmelCase      :			str=False				)->					Any:

										"""simple docstring"""




										UpperCAmelCase					    =     super()._prepare_for_class(__lowerCAmelCase				,   __lowerCAmelCase				,   return_labels=__lowerCAmelCase				)

										if return_labels:
																if "labels" in inputs_dict and "labels" not in inspect.signature(model_class.call				).parameters:
																						del inputs_dict["labels"]

										return inputs_dict





				@slow
				def 					a__(		self      :			List[str]				)->					Dict:

										"""simple docstring"""




										for model_name in TF_DEIT_PRETRAINED_MODEL_ARCHIVE_LIST[:1]:
																UpperCAmelCase					    =     TFDeiTModel.from_pretrained(__lowerCAmelCase				)
																self.assertIsNotNone(__lowerCAmelCase				)







def 				lowerCamelCase__				(	):




						'''simple docstring'''






						UpperCAmelCase					    =     Image.open('''./tests/fixtures/tests_samples/COCO/000000039769.png'''					)
						return image






@require_tf
@require_vision
class 	UpperCamelCase__(       unittest.TestCase	):




				@cached_property
				def 					a__(		self      :			List[str]				)->					Any:

										"""simple docstring"""




										return (
										    DeiTImageProcessor.from_pretrained('''facebook/deit-base-distilled-patch16-224'''				)
										    if is_vision_available()
										    else None
										)





				@slow
				def 					a__(		self      :			List[str]				)->					Tuple:

										"""simple docstring"""




										UpperCAmelCase					    =     TFDeiTForImageClassificationWithTeacher.from_pretrained('''facebook/deit-base-distilled-patch16-224'''				)

										UpperCAmelCase					    =     self.default_image_processor
										UpperCAmelCase					    =     prepare_img()
										UpperCAmelCase					    =     image_processor(images=__lowerCAmelCase				,   return_tensors='''tf'''				)

										# forward pass
										UpperCAmelCase					    =     model(**__lowerCAmelCase				)

										# verify the logits
										UpperCAmelCase					    =     tf.TensorShape((1, 1000)				)
										self.assertEqual(outputs.logits.shape				,   __lowerCAmelCase				)

										UpperCAmelCase					    =     tf.constant([-1.0266, 0.1912, -1.2861]				)

										self.assertTrue(np.allclose(outputs.logits[0, :3]				,   __lowerCAmelCase				,   atol=1E-4				)				)









'''simple docstring'''



import copy
import inspect
import unittest

from transformers import AutoBackbone
from transformers.configuration_utils import PretrainedConfig
from transformers.testing_utils import require_timm, require_torch, torch_device
from transformers.utils.import_utils import is_torch_available

from ...test_backbone_common import BackboneTesterMixin
from ...test_configuration_common import ConfigTester
from ...test_modeling_common import ModelTesterMixin, floats_tensor


if is_torch_available():
	import torch

	from transformers import TimmBackbone, TimmBackboneConfig

from ...test_pipeline_mixin import PipelineTesterMixin






class 	UpperCamelCase__:




				def __init__(		self      :			List[str]				,   lowerCAmelCase      :			int				,   lowerCAmelCase      :			Optional[int]=None				,   lowerCAmelCase      :			Optional[int]=None				,   lowerCAmelCase      :			List[str]=None				,   lowerCAmelCase      :			int="resnet50"				,   lowerCAmelCase      :			Optional[int]=3				,   lowerCAmelCase      :			Union[str, Any]=32				,   lowerCAmelCase      :			List[Any]=3				,   lowerCAmelCase      :			Tuple=True				,   lowerCAmelCase      :			str=True				,   )->					Union[str, Any]:

										"""simple docstring"""




										UpperCAmelCase					    =     parent
										UpperCAmelCase					    =     out_indices if out_indices is not None else [4]
										UpperCAmelCase					    =     stage_names
										UpperCAmelCase					    =     out_features
										UpperCAmelCase					    =     backbone
										UpperCAmelCase					    =     batch_size
										UpperCAmelCase					    =     image_size
										UpperCAmelCase					    =     num_channels
										UpperCAmelCase					    =     use_pretrained_backbone
										UpperCAmelCase					    =     is_training




				def 					a__(		self      :			Optional[Any]				)->					Optional[int]:

										"""simple docstring"""




										UpperCAmelCase					    =     floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]				)
										UpperCAmelCase					    =     self.get_config()

										return config, pixel_values




				def 					a__(		self      :			int				)->					Optional[Any]:

										"""simple docstring"""




										return TimmBackboneConfig(
										    image_size=self.image_size				,   num_channels=self.num_channels				,   out_features=self.out_features				,   out_indices=self.out_indices				,   stage_names=self.stage_names				,   use_pretrained_backbone=self.use_pretrained_backbone				,   backbone=self.backbone				,   )




				def 					a__(		self      :			Dict				,   lowerCAmelCase      :			str				,   lowerCAmelCase      :			Dict				)->					Tuple:

										"""simple docstring"""




										UpperCAmelCase					    =     TimmBackbone(config=lowerCAmelCase				)
										model.to(lowerCAmelCase				)
										model.eval()
										with torch.no_grad():
																UpperCAmelCase					    =     model(lowerCAmelCase				)
										self.parent.assertEqual(
										    result.feature_map[-1].shape				,   (self.batch_size, model.channels[-1], 14, 14)				,   )





				def 					a__(		self      :			str				)->					Optional[Any]:

										"""simple docstring"""




										UpperCAmelCase					    =     self.prepare_config_and_inputs()
										UpperCAmelCase    ,    UpperCAmelCase					    =     config_and_inputs
										UpperCAmelCase					    =     {'''pixel_values''': pixel_values}
										return config, inputs_dict







@require_torch
@require_timm
class 	UpperCamelCase__(       lowerCAmelCase						,    lowerCAmelCase						,    lowerCAmelCase						,    unittest.TestCase	):
				__magic_name__    :				List[str]  		=	(TimmBackbone,) if is_torch_available() else ()
				__magic_name__    :				Any  		=	{"feature-extraction": TimmBackbone} if is_torch_available() else {}
				__magic_name__    :				Union[str, Any]  		=	False
				__magic_name__    :				int  		=	False
				__magic_name__    :				Tuple  		=	False
				__magic_name__    :				List[str]  		=	False




				def 					a__(		self      :			int				)->					str:

										"""simple docstring"""




										UpperCAmelCase					    =     TimmBackboneModelTester(self				)
										UpperCAmelCase					    =     ConfigTester(self				,   config_class=lowerCAmelCase				,   has_text_modality=lowerCAmelCase				)




				def 					a__(		self      :			List[str]				)->					Dict:

										"""simple docstring"""




										self.config_tester.create_and_test_config_to_json_string()
										self.config_tester.create_and_test_config_to_json_file()
										self.config_tester.create_and_test_config_from_and_save_pretrained()
										self.config_tester.create_and_test_config_with_num_labels()
										self.config_tester.check_config_can_be_init_without_params()
										self.config_tester.check_config_arguments_init()




				def 					a__(		self      :			List[Any]				)->					Optional[Any]:

										"""simple docstring"""




										UpperCAmelCase					    =     '''resnet18'''
										UpperCAmelCase					    =     '''microsoft/resnet-18'''

										UpperCAmelCase					    =     AutoBackbone.from_pretrained(lowerCAmelCase				,   use_timm_backbone=lowerCAmelCase				)
										UpperCAmelCase					    =     AutoBackbone.from_pretrained(lowerCAmelCase				)

										self.assertEqual(len(timm_model.out_features				)				,   len(transformers_model.out_features				)				)
										self.assertEqual(len(timm_model.stage_names				)				,   len(transformers_model.stage_names				)				)
										self.assertEqual(timm_model.channels				,   transformers_model.channels				)
										# Out indices are set to the last layer by default. For timm models, we don't know
										# the number of layers in advance, so we set it to (-1,), whereas for transformers
										# models, we set it to [len(stage_names) - 1] (kept for backward compatibility).
										self.assertEqual(timm_model.out_indices				,   (-1,)				)
										self.assertEqual(transformers_model.out_indices				,   [len(timm_model.stage_names				) - 1]				)

										UpperCAmelCase					    =     AutoBackbone.from_pretrained(lowerCAmelCase				,   use_timm_backbone=lowerCAmelCase				,   out_indices=[1, 2, 3]				)
										UpperCAmelCase					    =     AutoBackbone.from_pretrained(lowerCAmelCase				,   out_indices=[1, 2, 3]				)

										self.assertEqual(timm_model.out_indices				,   transformers_model.out_indices				)
										self.assertEqual(len(timm_model.out_features				)				,   len(transformers_model.out_features				)				)
										self.assertEqual(timm_model.channels				,   transformers_model.channels				)




				@unittest.skip('''TimmBackbone doesn\'t support feed forward chunking'''				)
				def 					a__(		self      :			Union[str, Any]				)->					Tuple:

										"""simple docstring"""




										pass




				@unittest.skip('''TimmBackbone doesn\'t have num_hidden_layers attribute'''				)
				def 					a__(		self      :			Dict				)->					Dict:

										"""simple docstring"""




										pass




				@unittest.skip('''TimmBackbone initialization is managed on the timm side'''				)
				def 					a__(		self      :			Tuple				)->					List[Any]:

										"""simple docstring"""




										pass




				@unittest.skip('''TimmBackbone models doesn\'t have inputs_embeds'''				)
				def 					a__(		self      :			List[str]				)->					Optional[Any]:

										"""simple docstring"""




										pass




				@unittest.skip('''TimmBackbone models doesn\'t have inputs_embeds'''				)
				def 					a__(		self      :			Optional[Any]				)->					Optional[Any]:

										"""simple docstring"""




										pass




				@unittest.skip('''TimmBackbone model cannot be created without specifying a backbone checkpoint'''				)
				def 					a__(		self      :			Any				)->					Optional[int]:

										"""simple docstring"""




										pass




				@unittest.skip('''Only checkpoints on timm can be loaded into TimmBackbone'''				)
				def 					a__(		self      :			Optional[int]				)->					Optional[int]:

										"""simple docstring"""




										pass




				@unittest.skip('''model weights aren\'t tied in TimmBackbone.'''				)
				def 					a__(		self      :			str				)->					str:

										"""simple docstring"""




										pass




				@unittest.skip('''model weights aren\'t tied in TimmBackbone.'''				)
				def 					a__(		self      :			Any				)->					int:

										"""simple docstring"""




										pass




				@unittest.skip('''Only checkpoints on timm can be loaded into TimmBackbone'''				)
				def 					a__(		self      :			List[Any]				)->					int:

										"""simple docstring"""




										pass




				@unittest.skip('''Only checkpoints on timm can be loaded into TimmBackbone'''				)
				def 					a__(		self      :			List[Any]				)->					List[str]:

										"""simple docstring"""




										pass




				@unittest.skip('''TimmBackbone doesn\'t have hidden size info in its configuration.'''				)
				def 					a__(		self      :			List[str]				)->					Dict:

										"""simple docstring"""




										pass




				@unittest.skip('''TimmBackbone doesn\'t support output_attentions.'''				)
				def 					a__(		self      :			str				)->					Tuple:

										"""simple docstring"""




										pass




				@unittest.skip('''Safetensors is not supported by timm.'''				)
				def 					a__(		self      :			List[Any]				)->					List[Any]:

										"""simple docstring"""




										pass




				@unittest.skip('''Will be fixed soon by reducing the size of the model used for common tests.'''				)
				def 					a__(		self      :			int				)->					Tuple:

										"""simple docstring"""




										pass




				def 					a__(		self      :			Dict				)->					Union[str, Any]:

										"""simple docstring"""




										UpperCAmelCase    ,    UpperCAmelCase					    =     self.model_tester.prepare_config_and_inputs_for_common()

										for model_class in self.all_model_classes:
																UpperCAmelCase					    =     model_class(lowerCAmelCase				)
																UpperCAmelCase					    =     inspect.signature(model.forward				)
																# signature.parameters is an OrderedDict => so arg_names order is deterministic
																UpperCAmelCase					    =     [*signature.parameters.keys()]

																UpperCAmelCase					    =     ['''pixel_values''']
																self.assertListEqual(arg_names[:1]				,   lowerCAmelCase				)




				def 					a__(		self      :			Union[str, Any]				)->					Optional[Any]:

										"""simple docstring"""




										UpperCAmelCase    ,    UpperCAmelCase					    =     self.model_tester.prepare_config_and_inputs_for_common()
										UpperCAmelCase					    =     True
										UpperCAmelCase					    =     self.has_attentions

										# no need to test all models as different heads yield the same functionality
										UpperCAmelCase					    =     self.all_model_classes[0]
										UpperCAmelCase					    =     model_class(lowerCAmelCase				)
										model.to(lowerCAmelCase				)

										UpperCAmelCase					    =     self._prepare_for_class(lowerCAmelCase				,   lowerCAmelCase				)
										UpperCAmelCase					    =     model(**lowerCAmelCase				)
										UpperCAmelCase					    =     outputs[0][-1]

										# Encoder-/Decoder-only models
										UpperCAmelCase					    =     outputs.hidden_states[0]
										hidden_states.retain_grad()

										if self.has_attentions:
																UpperCAmelCase					    =     outputs.attentions[0]
																attentions.retain_grad()

										output.flatten()[0].backward(retain_graph=lowerCAmelCase				)

										self.assertIsNotNone(hidden_states.grad				)

										if self.has_attentions:
																self.assertIsNotNone(attentions.grad				)





				def 					a__(		self      :			Optional[int]				)->					Optional[Any]:

										"""simple docstring"""




										UpperCAmelCase    ,    UpperCAmelCase					    =     self.model_tester.prepare_config_and_inputs_for_common()

										for model_class in self.all_model_classes:
																UpperCAmelCase					    =     model_class(lowerCAmelCase				)
																model.to(lowerCAmelCase				)
																model.eval()
																UpperCAmelCase					    =     model(**lowerCAmelCase				)

																self.assertEqual(len(result.feature_maps				)				,   len(config.out_indices				)				)
																self.assertEqual(len(model.channels				)				,   len(config.out_indices				)				)

																# Check output of last stage is taken if out_features=None, out_indices=None
																UpperCAmelCase					    =     copy.deepcopy(lowerCAmelCase				)
																UpperCAmelCase					    =     None
																UpperCAmelCase					    =     model_class(lowerCAmelCase				)
																model.to(lowerCAmelCase				)
																model.eval()
																UpperCAmelCase					    =     model(**lowerCAmelCase				)

																self.assertEqual(len(result.feature_maps				)				,   1				)
																self.assertEqual(len(model.channels				)				,   1				)

																# Check backbone can be initialized with fresh weights
																UpperCAmelCase					    =     copy.deepcopy(lowerCAmelCase				)
																UpperCAmelCase					    =     False
																UpperCAmelCase					    =     model_class(lowerCAmelCase				)
																model.to(lowerCAmelCase				)
																model.eval()
																UpperCAmelCase					    =     model(**lowerCAmelCase				)





