标签: tf.data.dataset

具有多个输入和目标的 Tensorflow 数据集

我正在尝试使用 ArcFace 层实现模型: https://github.com/4uiiurz1/keras-arcface

为此,我创建了一个 tf.data.dataset,如下所示:

images= tf.data.Dataset.from_tensor_slices(train.A_image.to_numpy())
target = tf.keras.utils.to_categorical(
    train.Label.to_numpy(), num_classes=n_class, dtype='float32'
)
target = tf.data.Dataset.from_tensor_slices(target)

images= images.map(transform_img)

dataset = tf.data.Dataset.zip((images, target, target))
Run Code Online (Sandbox Code Playgroud)

当我打电话时model.fit(dataset)

我收到以下错误:

ValueError: Layer model expects 2 input(s), but it received 1 input tensors. Inputs received: [<tf.Tensor 'IteratorGetNext:0' shape=<unknown> dtype=float32>]
Run Code Online (Sandbox Code Playgroud)

但这应该按照以下方式工作:

Keras 中具有多个输入/输出的 tf.data

有人能指出我的愚蠢吗?

谢谢!

编辑:这解决了一些问题:

#reads in filepaths to images from dataframe train
images = tf.data.Dataset.from_tensor_slices(train.image.to_numpy())
#converts labels to one hot encoding vector
target = tf.keras.utils.to_categorical(train.Label.to_numpy(), num_classes=n_class, dtype='float32')
#reads in the image …
Run Code Online (Sandbox Code Playgroud)

python tensorflow tensorflow-datasets tf.data.dataset

6
推荐指数
1
解决办法
6880
查看次数

tf.data.Dataset.interleave() 与 map() 和 flat_map() 究竟有何不同?

我目前的理解是:

不同map_func:两个 interleaveflat_map期望“的函数映射数据集元素的数据集”。相反,map期望“将数据集元素映射到另一个数据集元素的函数”。

参数:两个interleavemap报价参数num_parallel_calls,而flat_map不会。此外,interleave 提供了这些神奇的参数 block_length 和 cycle_length。对于 cycle_length=1,文档说明 interleave 和 flat_map 的输出是相等的。

最后,我已经看到了数据加载管道没有交错以及与交错的人。任何建议何时使用interleavevs.mapflat_map将不胜感激


//编辑:如果我们从不同的数据集开始,我确实看到了 interleave 的值,例如在下面的代码中

  files = tf.data.Dataset.list_files("/path/to/dataset/train-*.tfrecord")
  dataset = files.interleave(tf.data.TFRecordDataset)
Run Code Online (Sandbox Code Playgroud)

但是,在如下场景中使用interleaveover有什么好处map吗?

files = tf.data.Dataset.list_files("/path/to/dataset/train-*.png")
dataset = files.map(load_img, num_parallel_calls=tf.data.AUTOTUNE)
Run Code Online (Sandbox Code Playgroud)

tensorflow tf.data.dataset

5
推荐指数
1
解决办法
1023
查看次数

Tensorflow 2 - AttributeError:“_NestedVariant”对象没有属性“batch”

在《Hands on machine Learning with scikit-learn and tensorflow 2.0》一书的第 17 章中,他们使用 tf.data.Dataset 和 window() 方法将顺序数据集拆分为多个窗口:

n_steps = 100
window_length = n_steps + 1 # target = input shifted 1 character ahead
dataset = dataset.window(window_length, shift=1, drop_remainder=True)
Run Code Online (Sandbox Code Playgroud)

为了将顺序数据集分割成多个窗口,他们使用了以下方法:

dataset = dataset.flat_map(lambda window: window.batch(window_length))
Run Code Online (Sandbox Code Playgroud)

但是当我执行上面的那一行时,出现以下错误:

AttributeError                            Traceback (most recent call last)

<ipython-input-18-5b215fb4cb71> in <module>()
----> 1 dataset = dataset.flat_map(lambda window: window.batch(window_length))

10 frames

/usr/local/lib/python3.6/dist-packages/tensorflow/python/data/ops/dataset_ops.py in flat_map(self, map_func)
   1650       Dataset: A `Dataset`.
   1651     """
-> 1652     return FlatMapDataset(self, map_func)
   1653 
   1654   def interleave(self, …
Run Code Online (Sandbox Code Playgroud)

attributeerror tensorflow2.0 tf.data.dataset

5
推荐指数
0
解决办法
746
查看次数

如何在 keras 自定义回调中访问 tf.data.Dataset?

我编写了一个自定义 keras 回调来检查来自生成器的增强数据。(有关完整代码,请参阅此答案tf.data.Dataset。)但是,当我尝试对 a 使用相同的回调时,它给了我一个错误:

  File "/path/to/tensorflow_image_callback.py", line 16, in on_batch_end
imgs = self.train[batch][images_or_labels]
TypeError: 'PrefetchDataset' object is not subscriptable
Run Code Online (Sandbox Code Playgroud)

keras 回调通常只适用于生成器,还是与我编写回调的方式有关?有没有办法修改我的回调或数据集以使其工作?

我认为这个难题由三部分组成。我对其中任何一个和所有的改变持开放态度。首先是自定义回调类中的init函数:

class TensorBoardImage(tf.keras.callbacks.Callback):
    def __init__(self, logdir, train, validation=None):
        super(TensorBoardImage, self).__init__()
        self.logdir = logdir
        self.file_writer = tf.summary.create_file_writer(logdir)
        self.train = train
        self.validation = validation
Run Code Online (Sandbox Code Playgroud)

其次,on_batch_end同一个类中的函数

def on_batch_end(self, batch, logs):
    images_or_labels = 0 #0=images, 1=labels
    imgs = self.train[batch][images_or_labels]
Run Code Online (Sandbox Code Playgroud)

三、实例化回调

import tensorflow_image_callback
tensorboard_image_callback = tensorflow_image_callback.TensorBoardImage(logdir=tensorboard_log_dir, train=train_dataset, validation=valid_dataset)
model.fit(train_dataset,
          epochs=n_epochs,
          validation_data=valid_dataset, 
          callbacks=[
                    tensorboard_callback,
                    tensorboard_image_callback
                    ])
Run Code Online (Sandbox Code Playgroud)

一些尚未让我找到答案的相关主题:

在自定义回调中访问验证数据

创建 …

python callback keras tensorflow tf.data.dataset

5
推荐指数
1
解决办法
1446
查看次数

如何在tensorflow中使用tf.data读取.csv文件?

我有三个不同的 .csv 数据集,我通常使用 pandas 读取它们并训练深度学习模型。每个数据都是一个 m 矩阵,其中 n 是样本数,m 是特征数。读取数据后,我进行一些重塑,然后使用以下方法将它们输入到我的深度学习模型中feed_dict

data1 = pd.DataFrame(np.random.uniform(low=0, high=1, size=(10,3)), columns=['A', 'B', 'C'])
data2 = pd.DataFrame(np.random.uniform(low=0, high=1, size=(10,3)), columns=['A', 'B', 'C'])
data3 = pd.DataFrame(np.random.uniform(low=0, high=1, size=(10,3)), columns=['A', 'B', 'C'])

data = pd.concat([data1, data2, data2], axis=1)

# Some deep learning model that work with data
# An optimizer

with tf.compat.v1.Session() as sess:
     sess.run(init)
     sess.run(optimizer, feed_dict={SOME VARIABLE: data})  
Run Code Online (Sandbox Code Playgroud)

然而,我的数据太大,现在无法放入内存,我想知道如何使用 tf.data 来读取数据,而不是使用 pandas。抱歉,如果我提供的脚本是伪代码而不是我的实际代码。

python deep-learning tensorflow tensorflow2.0 tf.data.dataset

5
推荐指数
1
解决办法
7417
查看次数

如何使用 tf.data.Dataset 对象的 map 方法删除或省略数据?

我正在使用张量流 2.3.0

我有一个 python 数据生成器-

import tensorflow as tf
import numpy as np

vocab = [1,2,3,4,5]

def create_generator():
    'generates a random number from 0 to len(vocab)-1'
    count = 0
    while count < 4:
        x = np.random.randint(0, len(vocab))
        yield x
        count +=1
Run Code Online (Sandbox Code Playgroud)

我把它变成了一个 tf.data.Dataset 对象

gen = tf.data.Dataset.from_generator(create_generator, 
                                     args=[], 
                                     output_types=tf.int32, 
                                     output_shapes = (), )
Run Code Online (Sandbox Code Playgroud)

现在我想使用map方法对项目进行子采样,这样 tf 生成器永远不会输出任何偶数。

def subsample(x):
    'remove item if it is present in an even number [2,4]'
    
    '''
    #TODO
    '''
    return x
    
gen = gen.map(subsample)   

Run Code Online (Sandbox Code Playgroud)

如何使用 …

python-3.x tensorflow tensorflow-datasets tensorflow2.0 tf.data.dataset

2
推荐指数
1
解决办法
534
查看次数

如何在 tf.data.Dataset 对象上使用序列/生成器将部分数据放入内存?

我正在 Google Colab 上使用 Keras 进行图像分类。我使用 tf.keras.preprocessing.image_dataset_from_directory() 函数(https://www.tensorflow.org/api_docs/python/tf/keras/preprocessing/image_dataset_from_directory)加载图像,该函数返回 tf.data.Dataset 对象:

train_ds = tf.keras.preprocessing.image_dataset_from_directory(
  data_dir,
  validation_split=0.2,
  subset="training",
  seed=1234,
  image_size=(img_height, img_width),
  batch_size=batch_size,
  label_mode="categorical")
Run Code Online (Sandbox Code Playgroud)

我发现当数据包含数千张图像时,model.fit() 将在训练多个批次后使用所有内存(我正在使用 Google Colab,并且可以看到 RAM 使用量在第一个 epoch 期间增长)。然后我尝试使用 Keras Sequence,这是将部分数据加载到 RAM 中的建议解决方案(https://www.tensorflow.org/api_docs/python/tf/keras/utils/Sequence):

  class DatasetGenerator(tf.keras.utils.Sequence):
      def __init__(self, dataset):
          self.dataset = dataset

      def __len__(self):
          return tf.data.experimental.cardinality(self.dataset).numpy()

      def __getitem__(self, idx):
          return list(self.dataset.as_numpy_iterator())[idx]
Run Code Online (Sandbox Code Playgroud)

我用以下方法训练模型:

history = model.fit(DatasetGenerator(train_ds), ...)

问题是getitem ()必须返回一批带索引的数据。然而,我使用的 list() 函数必须将整个数据集放入 RAM 中,因此当 DatasetGenerator 对象实例化时会达到内存限制(tf.data.Dataset 对象不支持使用 [] 进行索引)。

我的问题:

  1. 有没有办法实现getitem ()(从数据集对象中获取特定批次)而不将整个对象放入内存?
  2. 如果第1条不可行,有什么解决办法吗?

提前致谢!

generator out-of-memory keras tensorflow tf.data.dataset

1
推荐指数
1
解决办法
2399
查看次数