code: def train_data_gray_scale():
      with tempfile.TemporaryDirectory() as tmp_dir:
          # setup basic data description for training
          output_features = [
              {
                  "name": "binary_output_feature",
                  "type": "binary",
              },
          ]
          input_features = [
              {
                  "name": "my_image",
                  "type": "image",
              },
          ]
  
          # add parameters to generate images
          input_features[0].update(
              {
                  "destination_folder": os.path.join(tmp_dir, "images"),
                  "preprocessing": {
                      "height": 350,
                      "width": 350,
                      "num_channels": 1,
                  },
              }
          )
          feature_list = input_features + output_features
  
          # create synthetic data
          data_dir = os.path.join(tmp_dir, "data")
          os.makedirs(data_dir, exist_ok=True)
          train_fp = os.path.join(tmp_dir, "train.csv")
  
          cli_synthesize_dataset(16, feature_list, train_fp)
  
          # remove unneeded data generation parameters
          input_features[0].pop("destination_folder")
  
          # return training data for testing
          yield train_fp, input_features, output_features
  
imports: import copy
  import logging
  import os
  import tempfile
  from typing import Dict, List
  import pytest
  import torch
  from ludwig.api import LudwigModel
  from ludwig.constants import IMAGENET1K
  from ludwig.data.dataset_synthesizer import cli_synthesize_dataset
  from ludwig.error import ConfigValidationError
  from ludwig.features.image_feature import ImageAugmentation
  from ludwig.schema.features.image_feature import ImageInputFeatureConfig
label_desc: Use image node_id 3 for calling a global function with example usage: train_data_gray_scale() without return types