code: def test_config_object():
      config = {
          "input_features": [
              {
                  "name": "text_feature",
                  "type": "text",
                  "preprocessing": {
                      "missing_value_strategy": "drop_row",
                  },
                  "encoder": {
                      "type": "rnn",
                      "bidirectional": True,
                      "representation": "dense",
                      "num_layers": 2,
                  },
              },
              {
                  "name": "image_feature_1",
                  "type": "image",
                  "preprocessing": {
                      "height": 32,
                      "width": 32,
                      "num_channels": 4,
                  },
                  "encoder": {
                      "type": "stacked_cnn",
                      "num_channels": 4,
                      "dropout": 0.1,
                  },
              },
          ],
          "output_features": [
              {
                  "name": "category_feature",
                  "type": "category",
                  "top_k": 3,
                  "preprocessing": {
                      "missing_value_strategy": "bfill",
                  },
                  "decoder": {
                      "type": "classifier",
                      "num_classes": 10,
                      "use_bias": False,
                  },
              },
          ],
          "combiner": {
              "type": "concat",
              "output_size": 512,
              "weights_initializer": "xavier_uniform",
              "dropout": 0.2,
          },
          "trainer": {
              "epochs": 50,
              "batch_size": "auto",
              "optimizer": {
                  "type": "adam",
                  "betas": [0.8, 0.999],
                  "eps": 5e-09,
              },
          },
      }
  
      config_object = ModelConfig.from_dict(config)
      assert (
          config_object.input_features.text_feature.encoder.type
          == "rnn"
      )
      assert (
          config_object.input_features.text_feature.encoder.num_layers
          == 2
      )
      assert (
          config_object.input_features.text_feature.preprocessing.missing_value_strategy
          == "drop_row"
      )
  
      assert config_object.defaults.text.encoder.type != "rnn"
      assert (
          config_object.defaults.text.preprocessing.missing_value_strategy
          != "drop_row"
      )
  
      assert (
          config_object.output_features.category_feature.decoder.num_classes
          == 10
      )
      assert config_object.output_features.category_feature.top_k == 3
  
      assert config_object.combiner.output_size == 512
      assert (
          config_object.combiner.weights_initializer == "xavier_uniform"
      )
      assert config_object.combiner.fc_layers is None
  
      assert config_object.trainer.epochs == 50
      assert config_object.trainer.batch_size == "auto"
  
      assert config_object.trainer.optimizer.type == "adam"
      assert config_object.trainer.optimizer.betas[0] == 0.8
      assert config_object.trainer.optimizer.betas[1] == 0.999
      assert config_object.trainer.optimizer.eps == 5e-09
  
imports: import os
  from tempfile import TemporaryDirectory
  from typing import Any, Dict, Optional, Union
  import pytest
  import yaml
  from ludwig.constants import ACTIVE, BASE_MODEL, CLIP, COLUMN, COMBINER, DECODER, DEFAULT_VALIDATION_METRIC, DEFAULTS, DEPENDENCIES, ENCODER, HYPEROPT, INPUT_FEATURES, INPUT_SIZE, LOSS, MODEL_ECD, MODEL_GBM, MODEL_LLM, MODEL_TYPE, NAME, NUM_CLASSES, OPTIMIZER, OUTPUT_FEATURES, PREPROCESSING, PROC_COLUMN, REDUCE_DEPENDENCIES, REDUCE_INPUT, TIED, TRAINER, TYPE
  from ludwig.error import ConfigValidationError
  from ludwig.schema.decoders.base import ClassifierConfig
  from ludwig.schema.encoders.text_encoders import BERTConfig
  from ludwig.schema.features.augmentation.image import RandomBlurConfig, RandomRotateConfig
  from ludwig.schema.features.image_feature import AUGMENTATION_DEFAULT_OPERATIONS
  from ludwig.schema.features.number_feature import NumberOutputFeatureConfig
  from ludwig.schema.features.text_feature import TextOutputFeatureConfig
  from ludwig.schema.llms.quantization import QuantizationConfig
  from ludwig.schema.model_config import ModelConfig
  from ludwig.schema.utils import BaseMarshmallowConfig, convert_submodules
label_desc: Use image node_id 1 for calling a global function with example usage: test_config_object() without return types