标签: tensorflow-datasets

为什么在每个 epoch 开始时训练损失会增加?

我正在训练一个线性回归模型。我使用 tf.contrib.data 准备数据集,对其进行洗牌并分批提供:

  dataset = tf.contrib.data.TFRecordDataset(filename)
  dataset = dataset.map(
      _parse_function, num_threads=16, output_buffer_size=100 * batch_size)
  dataset = dataset.repeat(5)
  dataset = dataset.shuffle(buffer_size=100000)
  dataset = dataset.padded_batch(batch_size, padded_shapes=([None], [None]))
  iterator = dataset.make_initializable_iterator()
  x_inputs, y_ = iterator.get_next()
Run Code Online (Sandbox Code Playgroud)

以下是我们的训练损失: 训练损失

很奇怪,在每个 epoch 开始时(迭代=100k),我们在训练损失中有一个脉冲。如果训练过程继续,我们会在接下来的 epoch 开始时看到相同的模式。

machine-learning tensorflow tensorflow-datasets

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

如何让tf.data.Dataset返回一个调用中的所有元素?

是否有一种简单的方法可以获得整个元素集tf.data.Dataset?即我想将数据集的批量大小设置为我的数据集的大小,而不是特别传递元素的数量.这对于验证数据集很有用,我想一次性测量整个数据集的准确性.我很惊讶没有办法获得一个大小tf.data.Dataset

tensorflow tensorflow-datasets

8
推荐指数
2
解决办法
4536
查看次数

如何使用tf.data.Dataset.apply()重塑数据集

我正在使用tensorflow中的时间序列模型.我的数据集包含物理信号.我需要将这些信号分成窗口,因为这个切片的窗口是我模型的输入.

这是我如何读取数据并切片:

import tensorflow as tf
import numpy as np
def _ds_slicer(data):
    win_len = 768
    return {"mix":(tf.stack(tf.split(data["mix"],win_len))),
            "pure":(tf.stack(tf.split(data["pure"],win_len)))}
dataset = tf.data.Dataset.from_tensor_slices({
    "mix" : np.random.uniform(0,1,[1000,24576]),
    "pure" : np.random.uniform(0,1,[1000,24576])
})
dataset = dataset.map(_ds_slicer)
print dataset.output_shapes
# {'mix': TensorShape([Dimension(768), Dimension(32)]), 'pure': TensorShape([Dimension(768), Dimension(32)])}
Run Code Online (Sandbox Code Playgroud)

我想重塑这个数据集 # {'mix': TensorShape([Dimension(32)]), 'pure': TensorShape([Dimension(32))}

numpy中的等效转换将如下所示:

signal  = np.random.uniform(0,1,[1000,24576])
sliced_sig = np.stack(np.split(signal,768,axis=1),axis=1)
print sliced_sig.shape #(1000, 768, 32)
sliced_sig=sliced_sig.reshape(-1, sliced_sig.shape[-1])
print sliced_sig.shape #(768000, 32)
Run Code Online (Sandbox Code Playgroud)

我想过使用tf.contrib.data.group_by_window作为dataset.apply()的输入但是无法弄清楚如何使用它.有没有办法可以使用任何自定义转换来重塑数据集?

python tensorflow tensorflow-datasets

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

解析csv时升级到tf.dataset无法正常工作

我有一个GCMLE实验,我正在尝试升级我input_fn以使用新tf.data功能.我已根据此示例创建了以下input_fn

def input_fn(...):
    dataset = tf.data.Dataset.list_files(filenames).shuffle(num_shards) # shuffle up the list of input files
    dataset = dataset.interleave(lambda filename: # mix together records from cycle_length number of shards
                tf.data.TextLineDataset(filename).skip(1).map(lambda row: parse_csv(row, hparams)), cycle_length=5) 
    if shuffle:
      dataset = dataset.shuffle(buffer_size = 10000)
    dataset = dataset.repeat(num_epochs)
    dataset = dataset.batch(batch_size)
    iterator = dataset.make_one_shot_iterator()
    features = iterator.get_next()

    labels = features.pop(LABEL_COLUMN)

    return features, labels
Run Code Online (Sandbox Code Playgroud)

parse_csv和我之前使用的相同,但目前还没有.我可以解决一些问题,但我不完全理解为什么我遇到这些问题.这是我的parse_csv()函数的开始

def parse_csv(..):
    columns = tf.decode_csv(rows, record_defaults=CSV_COLUMN_DEFAULTS)
    raw_features = dict(zip(FIELDNAMES, columns))

    words = …
Run Code Online (Sandbox Code Playgroud)

tensorflow google-cloud-ml tensorflow-datasets

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

Tensorflow 1.10 TFRecordDataset - 恢复TFRecords

笔记:

  1. 这个问题延伸到之前的一个问题.在那个问题中,我询问存储一些虚拟数据的最佳方法,ExampleSequenceExample试图了解哪种数据更类似于提供的虚拟数据.我提供了明确的构造ExampleSequenceExample构造,以及在答案中,这是一种编程方式.

  2. 因为这仍然是很多代码,我提供了一个Colab(由谷歌托管的交互式jupyter笔记本)文件,您可以自己尝试代码来协助.所有必要的代码都在那里,并慷慨地评论.

我正在尝试学习如何将我的数据转换为TF记录,因为声称的好处对于我的数据是值得的.然而,文档还有很多不足之处,而且我试图深入的教程/博客(我已经看过),实际上只是触及表面或重新存在的稀疏文档.

对于我在上一个问题中考虑的演示数据- 以及此处 - 我写了一个体面的课程:

  • 具有n个通道的序列(在此示例中,它是基于整数的,具有固定长度并具有n个通道)
  • 软标记的类概率(在这个例子中有n个类和基于浮点数)
  • 一些元数据(在这个例子中是一个字符串和两个浮点数)

并且可以用以下6种形式之一编码数据:

  1. 例如,序列通道/类以数字类型(int64在本例中)分开,并附加元数据
  2. 例如,将序列通道/类分隔为字节串(via numpy.ndarray.tostring()),并附加元数据
  3. 示例,将序列/类转储为字节字符串,并附加元数据

  4. SequenceExample,序列通道/类以数字类型分隔,元数据作为上下文分隔

  5. SequenceExample,序列通道作为字节串分开,元数据作为上下文
  6. SequenceExample,将序列和类转储为字节字符串,将元数据转储为上下文

这很好用.

Colab中,我展示了如何在同一个文件中以及在单独的文件中写入虚拟数据.

我的问题是如何恢复这些数据?

我试图在链接文件中尝试4次尝试.

为什么TFReader与TFWriter在不同的子包下?

python tensorflow python-3.6 tensorflow-datasets tensorflow-estimator

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

带有 tf 数据集输入的 Tensorflow keras

我是 tensorflow keras 和数据集的新手。谁能帮我理解为什么下面的代码不起作用?

import tensorflow as tf
import tensorflow.keras as keras
import numpy as np
from tensorflow.python.data.ops import dataset_ops
from tensorflow.python.data.ops import iterator_ops
from tensorflow.python.keras.utils import multi_gpu_model
from tensorflow.python.keras import backend as K


data = np.random.random((1000,32))
labels = np.random.random((1000,10))
dataset = tf.data.Dataset.from_tensor_slices((data,labels))
print( dataset)
print( dataset.output_types)
print( dataset.output_shapes)
dataset.batch(10)
dataset.repeat(100)

inputs = keras.Input(shape=(32,))  # Returns a placeholder tensor

# A layer instance is callable on a tensor, and returns a tensor.
x = keras.layers.Dense(64, activation='relu')(inputs)
x = keras.layers.Dense(64, activation='relu')(x) …
Run Code Online (Sandbox Code Playgroud)

python keras tensorflow tensorflow-datasets

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

Tensorflow 2.0 中 tf.function 如何优化 tf.data.Dataset 的使用?

Tensorflow 2.0的官方文档建议tf.data.Datasettf.function.

这种用途有两个例子:

  • 使用Dataset作为的参数tf.function,如描述在这里
@tf.function
def train(model, dataset, optimizer):
  for x, y in dataset:
      ....
Run Code Online (Sandbox Code Playgroud)
  • 创建本地Datasettf.function身体,描述在这里
@tf.function
def train(model, optimizer):
  train_ds = mnist_dataset()
  ...
Run Code Online (Sandbox Code Playgroud)

最后,签名文档指出对 a 的迭代Dataset是由 优化的tf.function这个 SO 答案确实表明使用 aDataset作为tf.function提高性能的参数。

那么,如何tf.data.Dataset从中受益tf.function,以及它如何解释这个 SO 答案的加速:

  • “for循环优化”如何自己创造加速?
  • 跟踪器如何Dataset处理对象tf.function。就像在参数中或作为局部变量的例子一样,我们如何Dataset在 a …

python tensorflow tensorflow-datasets tensorflow2.0

8
推荐指数
0
解决办法
464
查看次数

tf.data:并行化加载步骤

我有一个数据输入管道,它具有:

  • 不能强制转换为 a tf.Tensor(dicts 和诸如此类)的类型的输入数据点
  • 无法理解 tensorflow 类型并需要处理这些数据点的预处理函数;其中一些进行动态数据增强

我一直在尝试将其放入tf.data管道中,并且一直坚持并行运行多个数据点的预处理。到目前为止,我已经尝试过这个:

  • Dataset.from_generator(gen)在生成器中使用并进行预处理;这是有效的,但它会按顺序处理每个数据点,无论我修补它的prefetchmap调用的排列如何。并行预取是不可能的吗?
  • 将预处理封装在 a 中,tf.py_function以便我可以map在我的数据集上并行处理,但是
    1. 这需要一些非常丑陋的(反)序列化才能将奇异类型放入字符串张量中,
    2. 显然, 的执行py_function将移交给(单进程)python 解释器,所以我会坚持使用 python GIL,这对我没有多大帮助
  • 我看到你可以做一些技巧,interleave但没有发现任何没有前两个想法的问题。

我在这里错过了什么吗?我是否被迫修改我的预处理以便它可以在图形中运行,或者有没有办法对其进行多处理?

我们以前这样做的方法是使用 keras.Sequence ,它运行良好,但推动tf.dataAPI升级的人太多了。(地狱,甚至尝试 keras.Sequence with tf 2.2 yields WARNING:tensorflow:multiprocessing can interact badly with TensorFlow, causing nondeterministic deadlocks. For high performance data pipelines tf.data is recommended.

注意:我使用的是 tf 2.2rc3

python tensorflow tensorflow-datasets tensorflow2.0

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

将数据从 `tf.data.Dataset` 分发给多个工作人员(例如 Horovod)

使用 Horovod,您基本上运行 N 个独立实例(因此它是图间复制的一种形式),并且它们通过特殊的 Horovod 操作(基本上是广播 + 减少)进行通信。

现在让我们说实例 0 或其他一些外部实例加载您的数据(通过tf.data.Dataset)。你将如何分发iterator.get_next()到每个实例?使用 Horovod 广播效率低下,因为您会将所有数据复制到所有实例。

在每个实例中都有数据集,并在那里完成所有加载,然后shard在数据集上使用也将是低效的,因为您会在任何地方加载数据,然后丢弃 (N-1)/N 个数据。所以这就是为什么也不想要分片,而是只在单个(生产者/数据集工作人员)实例中加载数据集,然后将批次分发给所有火车工作人员。

我猜 TFMultiDeviceIterator提供了一些类似的功能(或基本上完全相同),但我不确定它是否与 Horovod 一起使用,以及您将如何设置它?

或者,也许您可​​以通过 TF 工作人员以某种方式进行分发(指南?(也许这也是您的配置MultiDeviceIterator方式?)

如果可能的话,这应该通过 TensorFlow 操作/函数(有许多相关的函数可能已经给了我这个,但我可能不知道它们,或者误解了它是如何工作的)。或者也许答案是 TensorFlow 还没有提供任何这样的功能?(知道这仍然很有用。然后我会用 C++ 实现我自己的解决方案,包装为 TensorFlow。但在此之前,最好知道这是否真的有必要。)

(相关的还有这个 Horovod 问题。)

(这个问题实际上比 Horovod 更通用一些,尽管 Horovod 可能是一个很好的例子。对于分布式 TensorFlow,您可能总是遇到这个问题?)

(我收集了所有的概述分布式TensorFlow术语和方面在这里,多为澄清。)

(相关的是(也许?)还有这个这个这个这个这个问题。)

python tensorflow tensorflow-datasets horovod

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

tf.data.Dataset 迭代器返回 Tensor("IteratorGetNext:1", shape=(None, 16), dtype=int32) 但无法获取张量的值

我正在尝试编写一个自定义模型,其中我正在编写一个自定义train_step函数

我正在从自定义数据生成器创建一个“tf.data.Dataset”,例如

tds = tf.data.Dataset.from_generator(tdg.__iter__,args=None,output_types = (tf.float32,tf.int32),output_shapes = (tf.TensorShape([16,64,64,3]),tf.TensorShape([16])))
tds = tds.batch(1)
Run Code Online (Sandbox Code Playgroud)

在自定义 DataGenerator 中,该__iter__方法定义为

def __iter__(self):
    for item in (self[i] for i in range(len(self))):
        yield item
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试检索train_step函数内的数据时,x,y = data我得到

Tensor("IteratorGetNext:0", shape=(None, 16, 64, 64, 3), dtype=float32)

Tensor("IteratorGetNext:1", shape=(None, 16), dtype=int32) 作为输出

如果我跑print(x[0])那么我得到

Tensor("strided_slice:0", shape=(16,), dtype=int32)

我没有得到具有numpy()属性的张量

这是哪里出错了??

keras tensorflow tensorflow-datasets tf.keras tensorflow2.0

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