-
Scout Monitoring
Free Django app performance insights with Scout Monitoring. Get Scout setup in minutes, and let us sweat the small stuff. A couple lines in settings.py is all you need to start monitoring your apps. Sign up for our free tier today.
def batcher_from_directory(batch_size:int, dataset_path:str, shuffle=False,seed=None) -> tf.data.Dataset: """ Return a tensorflow Dataset object that returns images and spectrograms as required. Partly inspired by https://github.com/keras-team/keras/blob/v3.3.3/keras/src/utils/image_dataset_utils.py Args: batch_size: The batch size. dataset_path: The path to the dataset folder which must contain the image folder and audio folder. shuffle: Whether to shuffle the dataset. Default to False. seed: The seed for the shuffle. Default to None. """ image_dataset_path = os.path.join(dataset_path, "image") # create the foundation datasets og_dataset = tf.data.Dataset.from_generator(lambda: original_image_path_gen(image_dataset_path), output_signature=tf.TensorSpec(shape=(), dtype=tf.string)) og_dataset = og_dataset.repeat(None) # repeat indefinitely ref_dataset = tf.data.Dataset.from_generator(lambda: ref_image_path_gen(image_dataset_path), output_signature=(tf.TensorSpec(shape=(), dtype=tf.string), tf.TensorSpec(shape=(), dtype=tf.bool))) ref_dataset = ref_dataset.repeat(None) # repeat indefinitely # create the input datasets og_image_dataset = og_dataset.map(lambda x: tf.py_function(load_image, [x, tf.convert_to_tensor(False, dtype=tf.bool)], tf.float32), num_parallel_calls=tf.data.AUTOTUNE) masked_image_dataset = og_image_dataset.map(lambda x: tf.py_function(load_masked_image, [x], tf.float32), num_parallel_calls=tf.data.AUTOTUNE) ref_image_dataset = ref_dataset.map(lambda x, y: tf.py_function(load_image, [x, y], tf.float32), num_parallel_calls=tf.data.AUTOTUNE) audio_spec_dataset = og_dataset.map(lambda x: tf.py_function(load_audio_data, [x, dataset_path], tf.float64), num_parallel_calls=tf.data.AUTOTUNE) unsync_spec_dataset = ref_dataset.map(lambda x, _: tf.py_function(load_audio_data, [x, dataset_path], tf.float64), num_parallel_calls=tf.data.AUTOTUNE) # ensure shape as tensorflow does not accept unknown shapes og_image_dataset = og_image_dataset.map(lambda x: tf.ensure_shape(x, IMAGE_SHAPE)) masked_image_dataset = masked_image_dataset.map(lambda x: tf.ensure_shape(x, MASKED_IMAGE_SHAPE)) ref_image_dataset = ref_image_dataset.map(lambda x: tf.ensure_shape(x, IMAGE_SHAPE)) audio_spec_dataset = audio_spec_dataset.map(lambda x: tf.ensure_shape(x, AUDIO_SPECTROGRAM_SHAPE)) unsync_spec_dataset = unsync_spec_dataset.map(lambda x: tf.ensure_shape(x, AUDIO_SPECTROGRAM_SHAPE)) # multi input using https://discuss.tensorflow.org/t/train-a-model-on-multiple-input-dataset/17829/4 full_dataset = tf.data.Dataset.zip((masked_image_dataset, ref_image_dataset, audio_spec_dataset, unsync_spec_dataset), og_image_dataset) # if shuffle: # full_dataset = full_dataset.shuffle(buffer_size=batch_size * 8, seed=seed) # not sure why buffer size is such # batch full_dataset = full_dataset.batch(batch_size=batch_size) return full_dataset
I used this once in my image compression project, and I can't really go back. It makes the piece of code responsible for training the model super compact as I will show you in the next episode when I work on the models themselves. It really tickles my brain when the code is clean. You will see much more of this obsessive-compulsive side of me when I eventually do a Side Quest for bitburner.