标签: tensorflow-datasets

将队列拆分为火车/测试集

我设置了一个以文件名队列开头的管道,如下面的伪代码:

filename_queue = tf.train.string_input_producer(["file0.pd", "file1.pd"])
Run Code Online (Sandbox Code Playgroud)

指向TFRecords包含多个序列化tf.train.Example图像.跟随张量流指导一个函数,它读取一个例子:

def read_my_file_format(filename_queue):
  reader = tf.SomeReader()
  key, record_string = reader.read(filename_queue)
  example, label = tf.some_decoder(record_string)
  processed_example = some_processing(example)
  return processed_example, label
Run Code Online (Sandbox Code Playgroud)

用于批处理队列:

def input_pipeline(filenames, batch_size):
  filename_queue = tf.train.string_input_producer(filenames)
  example, label = read_my_file_format(filename_queue)

  example_batch, label_batch = tf.train.shuffle_batch(
      [example, label], batch_size=batch_size, capacity=100,
      min_after_dequeue=10)
  return example_batch, label_batch
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种方法将数据随机分成训练和测试集.我不想将训练和测试集保存到不同的文件中,但是图像被随机分配给训练或测试集,而与他们从中读取的文件无关.理想情况下,我想将输入管道拆分为训练和测试队列.

当我必须拆分一个庞大的数据集时,这就是我通常在numpy中所做的事情

import numpy as np
from numpy.random import choice
from numpy.random import RandomState

queue = range(10)
weights = (.8,.2) # create 2 partitions with this weights

def …
Run Code Online (Sandbox Code Playgroud)

python dataset python-3.x tensorflow tensorflow-datasets

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

如何让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
查看次数

如何将py_func与返回dict的函数一起使用

我正在使用编写输入管道tf.data.Dataset。我想使用python代码加载和转换样本,该代码返回张量字典。不幸的是,我看不到如何将其定义为传递给的输出类型tf.py_func

我有一个解决方法,我的函数返回张量列表而不是字典,但是由于我在那个字典中有4个键,因此它使代码的可读性降低。

该代码看起来如下

file_list = ....

def load(file_name):
    return {"image": np.zeros(...,dtype=np.float32),
           "label": 1.0} # there is more labels, in the original code

ds = tf.data.Dataset.from_tensor_slices(file_list)
ds.shuffle(...)
out_type = [{'image':tf.float32, "label":tf.float32 }] # ???? 
ds.map(lambda x: tf.py_func(load, [x], out_type))

ds.batch(...)
ds.prefetch(1)
Run Code Online (Sandbox Code Playgroud)

python tensorflow tensorflow-datasets

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

如何使用tf.MonitoredTrainingSession在训练和验证数据集之间切换?

我想feedable在tensorflow Dataset API中使用迭代器设计,所以我可以在一些训练步骤之后切换到验证数据.但如果我切换到验证数据,它将结束整个会话.

以下代码演示了我想要做的事情:

import tensorflow as tf


graph = tf.Graph()
with graph.as_default():
    training_ds = tf.data.Dataset.range(32).batch(4)
    validation_ds = tf.data.Dataset.range(8).batch(4)

    handle = tf.placeholder(tf.string, shape=[])
    iterator = tf.data.Iterator.from_string_handle(
        handle, training_ds.output_types, training_ds.output_shapes)
    next_element = iterator.get_next()

    training_iterator = training_ds.make_initializable_iterator()
    validation_iterator = validation_ds.make_initializable_iterator()


with graph.as_default():

    with tf.train.MonitoredTrainingSession() as sess:
        training_handle = sess.run(training_iterator.string_handle())
        validation_handle = sess.run(validation_iterator.string_handle())
        sess.run(training_iterator.initializer)
        count_training = 0
        while not sess.should_stop():
            x = sess.run(next_element, feed_dict={handle: training_handle})
            count_training += 1
            print('{} [training] {}'.format(count_training, x.shape))
            # print(x)

            # we do periodic validation
            if count_training …
Run Code Online (Sandbox Code Playgroud)

dataset tensorflow tensorflow-datasets tensorflow-estimator

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

Tensorflow:如何查找tf.data.Dataset API对象的大小

我理解Dataset API是一种迭代器,它不会将整个数据集加载到内存中,因此无法找到数据集的大小.我正在谈论存储在文本文件或tfRecord文件中的大型数据语料库.通常使用tf.data.TextLineDataset或类似的东西来读取这些文件.找到使用的数据集加载大小是微不足道的tf.data.Dataset.from_tensor_slices.

我问数据集大小的原因如下:假设我的数据集大小为1000个元素.批量大小= 50个元素.然后训练步骤/批次(假设1个纪元)= 20.在这20个步骤中,我想将我的学习率从0.1到0.01指数衰减为

tf.train.exponential_decay(
    learning_rate = 0.1,
    global_step = global_step,
    decay_steps = 20,
    decay_rate = 0.1,
    staircase=False,
    name=None
)
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,我有"和"想要设置decay_steps = number of steps/batches per epoch = num_elements/batch_size.仅当预先知道数据集中的元素数量时,才能计算此值.

另一个原因预先知道尺寸是将数据拆分为使用训练集和测试集tf.data.Dataset.take(),tf.data.Dataset.skip()方法.

PS:我不是在寻找蛮力方法,例如迭代整个数据集并更新计数器来计算元素数量或放置非常大的批量大小,然后查找结果数据集的大小等.

python tensorflow tensorflow-datasets

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

将大数据加载到 TensorFlow 2.0 中,而不将其加载到 RAM 上

我已经处理并保存了一个大型视频和音频文件数据集(大约8到9GB的数据)数据被保存为2个numpy数组,每种模式一个文件的形状是(number_of_examples,maximum_time_length,feature_length)

我想使用这些数据来训练我的神经网络来执行分类任务 我正在使用 TensorFlow 2.0 Beta 版本 我在 Google Colab 上运行所有代码(安装 tf-2.0 beta 后) 每次我在 tf.data 中加载数据时使用虚拟机的整个 RAM,并且会话被迫重新启动。

以前的方法:

我尝试了两种方法

1)将两个变量全部加载到RAM中并将其转换为张量

2)将数据加载为内存映射数组(从磁盘)并将其加载到 tf.data

然而,这两种方法都会加载 RAM 并强制虚拟机重新启动

代码:

# Access the Audio memory from disk without loading
X_audio = np.memmap('gdrive/My Drive/Codes/audio_data.npy', dtype='float32', mode='r').reshape(2198,3860,74)

# Access the Video memory from disk without loading
X_video = np.memmap('gdrive/My Drive/Codes/video_data.npy', dtype='float32', mode='r').reshape(2198,1158,711)

# Load labels
with open('gdrive/My Drive/Codes/label_data_3','rb') as f:
    Y = pkl.load(f)

dataset = tf.data.Dataset.from_tensor_slices((X_audio, X_video, Y)).shuffle(2198).batch(32)
Run Code Online (Sandbox Code Playgroud)

错误:您的会话在使用所有可用 RAM 后崩溃

python numpy tensorflow tensorflow-datasets

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

有没有办法将tensorflow lite(.tflite)文件转换回keras文件(.h5)?

我由于一个粗心的错误而丢失了我的数据集。我手里只剩下 tflite 文件了。有没有办法反转h5文件。我对此进行了很好的研究,但没有找到解决方案。

tensorflow tensorflow-datasets tensorflow-lite tensorflow2.0

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

tf.data.Dataset.from_generator 调用的复杂对象的输出签名、输出类型和输出形状示例

我有一个生成器函数,可以生成以下元组:yield (transformed_input_array, set_y)

Transformed_input_array是具有以下形状的 ndarray 列表:(1024, 104), (1024, 142), (1024, 1), (1024, 1), (1024, 1), (1024, 1), (1024, 140) 和以下类型:tf.float64、tf.float64、tf.int8、tf.int16、tf.int8、tf.int8、tf.float64 set_y是形状为1024、类型为int64的ndarray

我用 tf.data.Dataset.from_generator 函数包装了生成器,代码如下:

dataset = tf.data.Dataset.from_generator(
    generator,
    # output_signature=(
    #     tf.TensorSpec(shape=(), dtype=(tf.float64, tf.float64, tf.int8, tf.int16, tf.int8, tf.int8, tf.float64)),
    #     tf.TensorSpec(shape=1024, dtype=tf.int64))
    output_types=(tf.float64, tf.float64, tf.int8, tf.int16, tf.int8, tf.int8, tf.float64, tf.int64),
    output_shapes=((1024, 104), (1024, 142), (1024, 1), (1024, 1), (1024, 1), (1024, 1), (1024, 140), 1024)
)
Run Code Online (Sandbox Code Playgroud)

但是当我运行训练时,出现以下错误:

ValueError: 数据的格式预计为x, (x,) …

tensorflow-datasets tensorflow2.0

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