



from typing import Optional, Tuple, Union

import tensorflow as tf

from ...activations_tf import ACTaFN
from ...modeling_tf_outputs import (
    TFBaseModelOutputWithNoAttention,
    TFBaseModelOutputWithPoolingAndNoAttention,
    TFImageClassifierOutputWithNoAttention,
)
from ...modeling_tf_utils import TFPreTrainedModel, TFSequenceClassificationLoss, keras_serializable, unpack_inputs
from ...tf_utils import shape_list
from ...utils import add_code_sample_docstrings, add_start_docstrings, add_start_docstrings_to_model_forward, logging
from .configuration_resnet import ResNetConfig


UpperCAmelCase							=       logging.get_logger(__name__)

# General docstring
UpperCAmelCase							=       """ResNetConfig"""

# Base docstring
UpperCAmelCase							=       """microsoft/resnet-50"""
UpperCAmelCase							=       [1, 2_048, 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 			__snake_case   ( tf.keras.layers.Layer):







							'''simple docstring'''






							def __init__(				self	,	a_	,	a_ = 3	,	a_ = 1	,	a_ = "relu"	,	**a_		):
											super().__init__(**a_		)
											a__					   =		kernel_size // 2
											a__					   =		tf.keras.layers.ConvaD(
											    a_	,	kernel_size=a_	,	strides=a_	,	padding="""valid"""	,	use_bias=a_	,	name="""convolution"""		)
											# Use same default momentum and epsilon as PyTorch equivalent
											a__					   =		tf.keras.layers.BatchNormalization(epsilon=1E-5	,	momentum=0.9	,	name="""normalization"""		)
											a__					   =		ACTaFN[activation] if activation is not None else tf.keras.layers.Activation("""linear"""		)


							def _a   (				self	,	a_		):
											# Pad to match that done in the PyTorch Conv2D model
											a__					   =		a__					   =		(self.pad_value, self.pad_value)
											a__					   =		tf.pad(a_	,	[(0, 0), height_pad, width_pad, (0, 0)]		)
											a__					   =		self.conv(a_		)
											return hidden_state







							def _a   (				self	,	a_	,	a_ = False		):
											a__					   =		self.convolution(a_		)
											a__					   =		self.normalization(a_	,	training=a_		)
											a__					   =		self.activation(a_		)
											return hidden_state




class 			__snake_case   ( tf.keras.layers.Layer):







							'''simple docstring'''






							def __init__(				self	,	a_	,	**a_		):
											super().__init__(**a_		)
											a__					   =		TFResNetConvLayer(
											    config.embedding_size	,	kernel_size=7	,	stride=2	,	activation=config.hidden_act	,	name="""embedder"""	,	)
											a__					   =		tf.keras.layers.MaxPoolaD(pool_size=3	,	strides=2	,	padding="""valid"""	,	name="""pooler"""		)
											a__					   =		config.num_channels







							def _a   (				self	,	a_	,	a_ = False		):
											a__   ,      a__   ,      a__   ,      a__					   =		shape_list(a_		)
											if tf.executing_eagerly() and 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."""		)
											a__					   =		pixel_values
											a__					   =		self.embedder(a_		)
											a__					   =		tf.pad(a_	,	[[0, 0], [1, 1], [1, 1], [0, 0]]		)
											a__					   =		self.pooler(a_		)
											return hidden_state




class 			__snake_case   ( tf.keras.layers.Layer):







							'''simple docstring'''






							def __init__(				self	,	a_	,	a_ = 2	,	**a_		):
											super().__init__(**a_		)
											a__					   =		tf.keras.layers.ConvaD(
											    a_	,	kernel_size=1	,	strides=a_	,	use_bias=a_	,	name="""convolution"""		)
											# Use same default momentum and epsilon as PyTorch equivalent
											a__					   =		tf.keras.layers.BatchNormalization(epsilon=1E-5	,	momentum=0.9	,	name="""normalization"""		)







							def _a   (				self	,	a_	,	a_ = False		):
											a__					   =		x
											a__					   =		self.convolution(a_		)
											a__					   =		self.normalization(a_	,	training=a_		)
											return hidden_state




class 			__snake_case   ( tf.keras.layers.Layer):







							'''simple docstring'''






							def __init__(				self	,	a_	,	a_	,	a_ = 1	,	a_ = "relu"	,	**a_		):
											super().__init__(**a_		)
											a__					   =		in_channels != out_channels or stride != 1
											a__					   =		TFResNetConvLayer(a_	,	stride=a_	,	name="""layer.0"""		)
											a__					   =		TFResNetConvLayer(a_	,	activation=a_	,	name="""layer.1"""		)
											a__					   =		(
											    TFResNetShortCut(a_	,	stride=a_	,	name="""shortcut"""		)
											    if should_apply_shortcut
											    else tf.keras.layers.Activation("""linear"""	,	name="""shortcut"""		)
											)
											a__					   =		ACTaFN[activation]







							def _a   (				self	,	a_	,	a_ = False		):
											a__					   =		hidden_state
											a__					   =		self.conva(a_	,	training=a_		)
											a__					   =		self.conva(a_	,	training=a_		)
											a__					   =		self.shortcut(a_	,	training=a_		)
											hidden_state += residual
											a__					   =		self.activation(a_		)
											return hidden_state




class 			__snake_case   ( tf.keras.layers.Layer):







							'''simple docstring'''






							def __init__(				self	,	a_	,	a_	,	a_ = 1	,	a_ = "relu"	,	a_ = 4	,	**a_	,	):
											super().__init__(**a_		)
											a__					   =		in_channels != out_channels or stride != 1
											a__					   =		out_channels // reduction
											a__					   =		TFResNetConvLayer(a_	,	kernel_size=1	,	name="""layer.0"""		)
											a__					   =		TFResNetConvLayer(a_	,	stride=a_	,	name="""layer.1"""		)
											a__					   =		TFResNetConvLayer(a_	,	kernel_size=1	,	activation=a_	,	name="""layer.2"""		)
											a__					   =		(
											    TFResNetShortCut(a_	,	stride=a_	,	name="""shortcut"""		)
											    if should_apply_shortcut
											    else tf.keras.layers.Activation("""linear"""	,	name="""shortcut"""		)
											)
											a__					   =		ACTaFN[activation]







							def _a   (				self	,	a_	,	a_ = False		):
											a__					   =		hidden_state
											a__					   =		self.conva(a_	,	training=a_		)
											a__					   =		self.conva(a_	,	training=a_		)
											a__					   =		self.conva(a_	,	training=a_		)
											a__					   =		self.shortcut(a_	,	training=a_		)
											hidden_state += residual
											a__					   =		self.activation(a_		)
											return hidden_state




class 			__snake_case   ( tf.keras.layers.Layer):







							'''simple docstring'''






							def __init__(				self	,	a_	,	a_	,	a_	,	a_ = 2	,	a_ = 2	,	**a_		):
											super().__init__(**a_		)

											a__					   =		TFResNetBottleNeckLayer if config.layer_type == """bottleneck""" else TFResNetBasicLayer

											a__					   =		[layer(a_	,	a_	,	stride=a_	,	activation=config.hidden_act	,	name="""layers.0"""		)]
											layers += [
											    layer(a_	,	a_	,	activation=config.hidden_act	,	name=F'''layers.{i + 1}'''		)
											    for i in range(depth - 1		)
											]
											a__					   =		layers







							def _a   (				self	,	a_	,	a_ = False		):
											for layer in self.stage_layers:
															a__					   =		layer(a_	,	training=a_		)
											return hidden_state




class 			__snake_case   ( tf.keras.layers.Layer):







							'''simple docstring'''






							def __init__(				self	,	a_	,	**a_		):
											super().__init__(**a_		)
											# based on `downsample_in_first_stage` the first layer of the first stage may or may not downsample the input
											a__					   =		[
											    TFResNetStage(
											        a_	,	config.embedding_size	,	config.hidden_sizes[0]	,	stride=2 if config.downsample_in_first_stage else 1	,	depth=config.depths[0]	,	name="""stages.0"""	,	)
											]
											for i, (in_channels, out_channels, depth) in enumerate(
											    zip(config.hidden_sizes	,	config.hidden_sizes[1:]	,	config.depths[1:]		)		):
															self.stages.append(TFResNetStage(a_	,	a_	,	a_	,	depth=a_	,	name=F'''stages.{i + 1}'''		)		)







							def _a   (				self	,	a_	,	a_ = False	,	a_ = True	,	a_ = False	,	):
											a__					   =		() if output_hidden_states else None

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

															a__					   =		stage_module(a_	,	training=a_		)

											if output_hidden_states:
															a__					   =		hidden_states + (hidden_state,)

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

											return TFBaseModelOutputWithNoAttention(last_hidden_state=a_	,	hidden_states=a_		)




class 			__snake_case   ( SCREAMING_SNAKE_CASE):







							'''simple docstring'''






							UpperCamelCase__					:   int       =       ResNetConfig
							UpperCamelCase__					:   Tuple       =       """resnet"""
							UpperCamelCase__					:   Tuple       =       """pixel_values"""


							@property
							def _a   (				self		):
											return {"pixel_values": tf.TensorSpec(shape=(None, self.config.num_channels, 224, 224)	,	dtype=tf.floataa		)}




UpperCAmelCase							=       R"""
    This model is a TensorFlow
    [tf.keras.layers.Layer](https://www.tensorflow.org/api_docs/python/tf/keras/layers/Layer) sub-class. Use it as a
    regular TensorFlow Module and refer to the TensorFlow 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 [`~TFPreTrainedModel.from_pretrained`] method to load the model weights.
"""


UpperCAmelCase							=       R"""
    Args:
        pixel_values (`tf.Tensor` 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.
"""

@keras_serializable
class 			__snake_case   ( tf.keras.layers.Layer):







							'''simple docstring'''






							UpperCamelCase__					:   Union[str, Any]       =       ResNetConfig


							def __init__(				self	,	a_	,	**a_		):
											super().__init__(**a_		)
											a__					   =		config
											a__					   =		TFResNetEmbeddings(a_	,	name="""embedder"""		)
											a__					   =		TFResNetEncoder(a_	,	name="""encoder"""		)
											a__					   =		tf.keras.layers.GlobalAveragePoolingaD(keepdims=a_		)







							@unpack_inputs
							def _a   (				self	,	a_	,	a_ = None	,	a_ = None	,	a_ = False	,	):
											a__					   =		(
											    output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
											)
											a__					   =		return_dict if return_dict is not None else self.config.use_return_dict

											# TF 2.0 image layers can't use NCHW format when running on CPU.
											# We transpose to NHWC format and then transpose back after the full forward pass.
											# (batch_size, num_channels, height, width) -> (batch_size, height, width, num_channels)
											a__					   =		tf.transpose(a_	,	perm=[0, 2, 3, 1]		)
											a__					   =		self.embedder(a_	,	training=a_		)

											a__					   =		self.encoder(
											    a_	,	output_hidden_states=a_	,	return_dict=a_	,	training=a_		)

											a__					   =		encoder_outputs[0]

											a__					   =		self.pooler(a_		)

											# Transpose all the outputs to the NCHW format
											# (batch_size, height, width, num_channels) -> (batch_size, num_channels, height, width)
											a__					   =		tf.transpose(a_	,	(0, 3, 1, 2)		)
											a__					   =		tf.transpose(a_	,	(0, 3, 1, 2)		)
											a__					   =		()
											for hidden_state in encoder_outputs[1:]:
															a__					   =		hidden_states + tuple(tf.transpose(a_	,	(0, 3, 1, 2)		) for h in hidden_state		)

											if not return_dict:
															return (last_hidden_state, pooled_output) + hidden_states

											a__					   =		hidden_states if output_hidden_states else None

											return TFBaseModelOutputWithPoolingAndNoAttention(
											    last_hidden_state=a_	,	pooler_output=a_	,	hidden_states=a_	,	)




@add_start_docstrings(
    """The bare ResNet model outputting raw features without any specific head on top."""      ,SCREAMING_SNAKE_CASE      ,)
class 			__snake_case   ( SCREAMING_SNAKE_CASE):







							'''simple docstring'''






							def __init__(				self	,	a_	,	**a_		):
											super().__init__(a_	,	**a_		)
											a__					   =		TFResNetMainLayer(config=a_	,	name="""resnet"""		)







							@add_start_docstrings_to_model_forward(a_		)
							@add_code_sample_docstrings(
							    checkpoint=_CHECKPOINT_FOR_DOC	,	output_type=a_	,	config_class=_CONFIG_FOR_DOC	,	modality="""vision"""	,	expected_output=_EXPECTED_OUTPUT_SHAPE	,	)
							@unpack_inputs
							def _a   (				self	,	a_	,	a_ = None	,	a_ = None	,	a_ = False	,	):
											a__					   =		(
											    output_hidden_states if output_hidden_states is not None else self.config.output_hidden_states
											)
											a__					   =		return_dict if return_dict is not None else self.config.use_return_dict

											a__					   =		self.resnet(
											    pixel_values=a_	,	output_hidden_states=a_	,	return_dict=a_	,	training=a_	,	)
											return resnet_outputs




@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.
    """      ,SCREAMING_SNAKE_CASE      ,)
class 			__snake_case   ( SCREAMING_SNAKE_CASE      ,SCREAMING_SNAKE_CASE):







							'''simple docstring'''






							def __init__(				self	,	a_	,	**a_		):
											super().__init__(a_	,	**a_		)
											a__					   =		config.num_labels
											a__					   =		TFResNetMainLayer(a_	,	name="""resnet"""		)
											# classification head
											a__					   =		(
											    tf.keras.layers.Dense(config.num_labels	,	name="""classifier.1"""		)
											    if config.num_labels > 0
											    else tf.keras.layers.Activation("""linear"""	,	name="""classifier.1"""		)
											)


							def _a   (				self	,	a_		):
											a__					   =		tf.keras.layers.Flatten()(a_		)
											a__					   =		self.classifier_layer(a_		)
											return logits







							@add_start_docstrings_to_model_forward(a_		)
							@add_code_sample_docstrings(
							    checkpoint=_IMAGE_CLASS_CHECKPOINT	,	output_type=a_	,	config_class=_CONFIG_FOR_DOC	,	expected_output=_IMAGE_CLASS_EXPECTED_OUTPUT	,	)
							@unpack_inputs
							def _a   (				self	,	a_ = None	,	a_ = None	,	a_ = None	,	a_ = None	,	a_ = False	,	):
											a__					   =		return_dict if return_dict is not None else self.config.use_return_dict

											a__					   =		self.resnet(
											    a_	,	output_hidden_states=a_	,	return_dict=a_	,	training=a_		)

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

											a__					   =		self.classifier(a_		)

											a__					   =		None if labels is None else self.hf_compute_loss(a_	,	a_		)

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

											return TFImageClassifierOutputWithNoAttention(loss=a_	,	logits=a_	,	hidden_states=outputs.hidden_states		)








from __future__ import annotations

import inspect
import unittest
from typing import List, Tuple

from transformers import ConvNextConfig
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 TFConvNextForImageClassification, TFConvNextModel


if is_vision_available():
						from PIL import Image

						from transformers import ConvNextImageProcessor

class SCREAMING_SNAKE_CASE_			:





					"""simple docstring"""


					def __init__(			self						,	_lowerCAmelCase						,	_lowerCAmelCase=13						,	_lowerCAmelCase=32						,	_lowerCAmelCase=3						,	_lowerCAmelCase=4						,	_lowerCAmelCase=[10, 20, 30, 40]						,	_lowerCAmelCase=[2, 2, 3, 2]						,	_lowerCAmelCase=True						,	_lowerCAmelCase=True						,	_lowerCAmelCase=37						,	_lowerCAmelCase="gelu"						,	_lowerCAmelCase=10						,	_lowerCAmelCase=0.02						,	_lowerCAmelCase=3						,	_lowerCAmelCase=None						,	):
										lowerCamelCase__      =							parent
										lowerCamelCase__      =							batch_size
										lowerCamelCase__      =							image_size
										lowerCamelCase__      =							num_channels
										lowerCamelCase__      =							num_stages
										lowerCamelCase__      =							hidden_sizes
										lowerCamelCase__      =							depths
										lowerCamelCase__      =							is_training
										lowerCamelCase__      =							use_labels
										lowerCamelCase__      =							intermediate_size
										lowerCamelCase__      =							hidden_act
										lowerCamelCase__      =							type_sequence_label_size
										lowerCamelCase__      =							initializer_range
										lowerCamelCase__      =							scope





					def        __magic_name__			(			self						):
										lowerCamelCase__      =							floats_tensor([self.batch_size, self.num_channels, self.image_size, self.image_size]						)

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

										lowerCamelCase__      =							self.get_config()

										return config, pixel_values, labels





					def        __magic_name__			(			self						):
										return ConvNextConfig(
										    num_channels=self.num_channels						,	hidden_sizes=self.hidden_sizes						,	depths=self.depths						,	num_stages=self.num_stages						,	hidden_act=self.hidden_act						,	is_decoder=_lowerCAmelCase						,	initializer_range=self.initializer_range						,	)





					def        __magic_name__			(			self						,	_lowerCAmelCase						,	_lowerCAmelCase						,	_lowerCAmelCase						):
										lowerCamelCase__      =							TFConvNextModel(config=_lowerCAmelCase						)
										lowerCamelCase__      =							model(_lowerCAmelCase						,	training=_lowerCAmelCase						)
										# expected last hidden states: B, C, H // 32, W // 32
										self.parent.assertEqual(
										    result.last_hidden_state.shape						,	(self.batch_size, self.hidden_sizes[-1], self.image_size // 32, self.image_size // 32)						,	)





					def        __magic_name__			(			self						,	_lowerCAmelCase						,	_lowerCAmelCase						,	_lowerCAmelCase						):
										lowerCamelCase__      =							self.type_sequence_label_size
										lowerCamelCase__      =							TFConvNextForImageClassification(_lowerCAmelCase						)
										lowerCamelCase__      =							model(_lowerCAmelCase						,	labels=_lowerCAmelCase						,	training=_lowerCAmelCase						)
										self.parent.assertEqual(result.logits.shape						,	(self.batch_size, self.type_sequence_label_size)						)






					def        __magic_name__			(			self						):
										lowerCamelCase__      =							self.prepare_config_and_inputs()
										lowerCamelCase__     ,		lowerCamelCase__     ,		lowerCamelCase__      =							config_and_inputs
										lowerCamelCase__      =							{"pixel_values": pixel_values}
										return config, inputs_dict

@require_tf
class SCREAMING_SNAKE_CASE_			(       lowercase_				,							lowercase_				,							unittest.TestCase ):





					"""simple docstring"""


					A__								=     (TFConvNextModel, TFConvNextForImageClassification) if is_tf_available() else ()
					A__								=     (
					    {"feature-extraction": TFConvNextModel, "image-classification": TFConvNextForImageClassification}
					    if is_tf_available()
					    else {}
					)

					A__								=     False
					A__								=     False
					A__								=     False
					A__								=     False
					A__								=     False





					def        __magic_name__			(			self						):
										lowerCamelCase__      =							TFConvNextModelTester(self						)
										lowerCamelCase__      =							ConfigTester(
										    self						,	config_class=_lowerCAmelCase						,	has_text_modality=_lowerCAmelCase						,	hidden_size=37						,	)





					@unittest.skip(reason="ConvNext does not use inputs_embeds"						)
					def        __magic_name__			(			self						):
										pass





					@unittest.skipIf(
					    not is_tf_available() or len(tf.config.list_physical_devices("GPU"						)						) == 0						,	reason="TF does not support backprop for grouped convolutions on CPU."						,	)
					@slow
					def        __magic_name__			(			self						):
										super().test_keras_fit()





					@unittest.skip(reason="ConvNext does not support input and output embeddings"						)
					def        __magic_name__			(			self						):
										pass





					def        __magic_name__			(			self						):
										lowerCamelCase__     ,		lowerCamelCase__      =							self.model_tester.prepare_config_and_inputs_for_common()

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

															lowerCamelCase__      =							["pixel_values"]
															self.assertListEqual(arg_names[:1]						,	_lowerCAmelCase						)





					def        __magic_name__			(			self						):
										lowerCamelCase__      =							self.model_tester.prepare_config_and_inputs()
										self.model_tester.create_and_check_model(*_lowerCAmelCase						)





					@unittest.skipIf(
					    not is_tf_available() or len(tf.config.list_physical_devices("GPU"						)						) == 0						,	reason="TF does not support backprop for grouped convolutions on CPU."						,	)
					def        __magic_name__			(			self						):
										super().test_dataset_conversion()





					def        __magic_name__			(			self						):
										def check_hidden_states_output(_lowerCAmelCase						,	_lowerCAmelCase						,	_lowerCAmelCase						):
															lowerCamelCase__      =							model_class(_lowerCAmelCase						)

															lowerCamelCase__      =							model(**self._prepare_for_class(_lowerCAmelCase						,	_lowerCAmelCase						)						)
															lowerCamelCase__      =							outputs.encoder_hidden_states if config.is_encoder_decoder else outputs.hidden_states

															lowerCamelCase__      =							self.model_tester.num_stages
															self.assertEqual(len(_lowerCAmelCase						)						,	expected_num_stages + 1						)

															# ConvNext's feature maps are of shape (batch_size, num_channels, height, width)
															self.assertListEqual(
															    list(hidden_states[0].shape[-2:]						)						,	[self.model_tester.image_size // 4, self.model_tester.image_size // 4]						,	)

										lowerCamelCase__     ,		lowerCamelCase__      =							self.model_tester.prepare_config_and_inputs_for_common()

										for model_class in self.all_model_classes:
															lowerCamelCase__      =							True
															check_hidden_states_output(_lowerCAmelCase						,	_lowerCAmelCase						,	_lowerCAmelCase						)

															# check that output_hidden_states also work using config
															del inputs_dict["output_hidden_states"]
															lowerCamelCase__      =							True

															check_hidden_states_output(_lowerCAmelCase						,	_lowerCAmelCase						,	_lowerCAmelCase						)





					def        __magic_name__			(			self						):
										lowerCamelCase__     ,		lowerCamelCase__      =							self.model_tester.prepare_config_and_inputs_for_common()

										def check_equivalence(_lowerCAmelCase						,	_lowerCAmelCase						,	_lowerCAmelCase						,	_lowerCAmelCase={}						):
															lowerCamelCase__      =							model(_lowerCAmelCase						,	return_dict=_lowerCAmelCase						,	**_lowerCAmelCase						)
															lowerCamelCase__      =							model(_lowerCAmelCase						,	return_dict=_lowerCAmelCase						,	**_lowerCAmelCase						).to_tuple()

															def recursive_check(_lowerCAmelCase						,	_lowerCAmelCase						):
																				if isinstance(_lowerCAmelCase						,	(List, Tuple)						):
																									for tuple_iterable_value, dict_iterable_value in zip(_lowerCAmelCase						,	_lowerCAmelCase						):
																														recursive_check(_lowerCAmelCase						,	_lowerCAmelCase						)
																				elif tuple_object is None:
																									return
																				else:
																									self.assertTrue(
																									    all(tf.equal(_lowerCAmelCase						,	_lowerCAmelCase						)						)						,	msg=(
																									        "Tuple and dict output are not equal. Difference:"
																									        F" {tf.math.reduce_max(tf.abs(tuple_object - dict_object						)						)}"
																									    )						,	)

																				recursive_check(_lowerCAmelCase						,	_lowerCAmelCase						)

										for model_class in self.all_model_classes:
															lowerCamelCase__      =							model_class(_lowerCAmelCase						)

															lowerCamelCase__      =							self._prepare_for_class(_lowerCAmelCase						,	_lowerCAmelCase						)
															lowerCamelCase__      =							self._prepare_for_class(_lowerCAmelCase						,	_lowerCAmelCase						)
															check_equivalence(_lowerCAmelCase						,	_lowerCAmelCase						,	_lowerCAmelCase						)

															lowerCamelCase__      =							self._prepare_for_class(_lowerCAmelCase						,	_lowerCAmelCase						,	return_labels=_lowerCAmelCase						)
															lowerCamelCase__      =							self._prepare_for_class(_lowerCAmelCase						,	_lowerCAmelCase						,	return_labels=_lowerCAmelCase						)
															check_equivalence(_lowerCAmelCase						,	_lowerCAmelCase						,	_lowerCAmelCase						)

															lowerCamelCase__      =							self._prepare_for_class(_lowerCAmelCase						,	_lowerCAmelCase						)
															lowerCamelCase__      =							self._prepare_for_class(_lowerCAmelCase						,	_lowerCAmelCase						)
															check_equivalence(_lowerCAmelCase						,	_lowerCAmelCase						,	_lowerCAmelCase						,	{"output_hidden_states": True}						)

															lowerCamelCase__      =							self._prepare_for_class(_lowerCAmelCase						,	_lowerCAmelCase						,	return_labels=_lowerCAmelCase						)
															lowerCamelCase__      =							self._prepare_for_class(_lowerCAmelCase						,	_lowerCAmelCase						,	return_labels=_lowerCAmelCase						)
															check_equivalence(_lowerCAmelCase						,	_lowerCAmelCase						,	_lowerCAmelCase						,	{"output_hidden_states": True}						)





					def        __magic_name__			(			self						):
										lowerCamelCase__      =							self.model_tester.prepare_config_and_inputs()
										self.model_tester.create_and_check_for_image_classification(*_lowerCAmelCase						)






					@slow
					def        __magic_name__			(			self						):
										lowerCamelCase__      =							TFConvNextModel.from_pretrained("facebook/convnext-tiny-224"						)
										self.assertIsNotNone(_lowerCAmelCase						)





def  __UpperCamelCase   (     )			->List[str]:
					lowerCamelCase__      =							Image.open("./tests/fixtures/tests_samples/COCO/000000039769.png")
					return image







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





					"""simple docstring"""


					@cached_property
					def        __magic_name__			(			self						):
										return ConvNextImageProcessor.from_pretrained("facebook/convnext-tiny-224"						) if is_vision_available() else None






					@slow
					def        __magic_name__			(			self						):
										lowerCamelCase__      =							TFConvNextForImageClassification.from_pretrained("facebook/convnext-tiny-224"						)

										lowerCamelCase__      =							self.default_image_processor
										lowerCamelCase__      =							prepare_img()
										lowerCamelCase__      =							image_processor(images=_lowerCAmelCase						,	return_tensors="tf"						)

										# forward pass
										lowerCamelCase__      =							model(**_lowerCAmelCase						)

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

										lowerCamelCase__      =							tf.constant([-0.0_260, -0.4_739, 0.1_911]						)

										tf.debugging.assert_near(outputs.logits[0, :3]						,	_lowerCAmelCase						,	atol=1E-4						)

