← Back to list

[SOLVED] Creating a tensorflow dataset that outputs a dict

Ted James · 2024-10-11 10:17 · 0 claps · 1.3 min read
#python #dictionary #tensorflow #tensorflow-dataset
Open on Medium ↗
Wiki topics: ML · Machine Learning

Creating a tensorflow dataset that outputs a dict

I have a dict with “metadata” for my dataset, of sort {'m1': array_1, 'm2': array_2, ...}. Each of the arrays has shape (N, ...), where N is the number of samples.

The question: Is it possible to create a tf.data.Dataset that outputs a dictionary {'meta_1': sub_array_1, 'meta_2': sub_array_2, ...} for each iteration of the datasets iterator.get_next()? Here, sub_array_i should contain the ith metadata for one batch, so should have shape (batch_sz, ...).

What I tried so far is using tf.data.Dataset.from_generator(), like this:

N = 100
# dictionary of arrays:
metadata = {'m1': np.zeros(shape=(N,2)), 'm2': np.ones(shape=(N,3,5))} 
num_samples = N

def meta_dict_gen():
    for i in range(num_samples):
        ls = {}
        for key, val in metadata.items():
            ls[key] = val[i]
        yield ls

dataset = tf.data.Dataset.from_generator(meta_dict_gen, output_types=(dict))

The problem with this seems to be in output_types=(dict). The code above throws at me a

TypeError: Expected DataType for argument ‘Tout’ not < class ‘dict’>.

I’m using tensorflow 1.8 and python 3.6.

Solution

EDIT: Even though the original question was for TensorFlow 1.8, I updated the answer to TensorFlow 2 (tested on TensorFlow 2.17), which is likely more useful to future readers.

So actually it is possible to do what you intend, you just have to be specific about the contents of the dict:

import tensorflow as tf
import numpy as np

N = 100
# dictionary of arrays:
metadata = {'m1': np.zeros(shape=(N,2)), 'm2': np.ones(shape=(N,3,5))}
num_samples = N

def meta_dict_gen():
    for i in range(num_samples):
        ls = {}
        for key, val in metadata.items():
            ls[key] = val[i]
        yield ls

dataset = tf.data.Dataset.from_generator(
    meta_dict_gen,
    output_signature={
        k: tf.TensorSpec(shape=v.shape[1:], dtype=tf.as_dtype(v.dtype))
        for k, v in metadata.items()})
print(next(iter(dataset)))

Output:

{'m1': <tf.Tensor: shape=(2,), dtype=float64, numpy=array([0., 0.])>, 'm2': <tf.Tensor: shape=(3, 5), dtype=float64, numpy=
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])>}

Answered By — javidcf

Answer Checked By — David Goodson (FixIt Volunteer)

This Answer collected from stackoverflow, is licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0


메타데이터
post_id
e026b9053d73
slug
solved-creating-a-tensorflow-dataset-that-outputs-a-dict-e026b9053d73
url
https://medium.com/@fixitblog/solved-creating-a-tensorflow-dataset-that-outputs-a-dict-e026b9053d73
canonical_url
https://medium.com/@fixitblog/solved-creating-a-tensorflow-dataset-that-outputs-a-dict-e026b9053d73
author_url
https://medium.com/@fixitblog
status
ok
fetched_at
2026-07-08 00:36:00