Tensorflow 以 tfrecord 格式计算大量数据的聚合函数
Tensorflow computing an aggregate function over lots of data in tfrecord format
我有一个非常大的数据集,以 5000 个块的形式存储在多个 tfrecord 文件中。所有这些记录加起来比我的 RAM 大得多。我想做的是从数据集中的 N = 0.05 * TOTAL_SIZE 随机索引中抽取样本,并计算均值和标准偏差以标准化我的数据。
如果不是因为数据集的大小,这会很容易,但是即使我尝试计算我感兴趣的所有张量的总和,我 运行 内存不足。
# NOTE: count is computed ahead of time by looping over all the tfrecord entries
with tf.device('/cpu:0'):
sample_size = int(count * 0.05)
random_indexes = set(np.random.randint(low=0, high=count, size=sample_size))
stat_graph = tf.Graph()
with tf.Session(graph=stat_graph) as sess:
val_sum = np.zeros(shape=(180, 2050))
for file in files:
print("Reading from file: %s" % file)
for record in tf.python_io.tf_record_iterator(file):
features = tf.parse_single_example(
record,
features={
"val": tf.FixedLenFeature((180, 2050), tf.float32),
})
if index in random_indexes:
val_sum += features["val"].eval(session=sess)
index += 1
val_mean = val_sum / sample_size
在 tfrecord 数据集上计算某些聚合函数(即均值 and/or 标准差)的正确方法是什么?
我认为 tf.parse_single_example 每次调用时都会向图中添加一个新的张量。而不是上面的,你应该用占位符输入字符串:
...
record_placeholder = tf.placeholder(tf.string)
features = tf.parse_single_example(
record_placeholder,
features={
"val": tf.FixedLenFeature((180, 2050), tf.float32),
})
for record in tf.python_io.tf_record_iterator(file):
...
val_sum += features["val"].eval(feed_dict={record_placeholder: record}, session=sess)
让我知道这是否有效,因为我无法对其进行测试。
我有一个非常大的数据集,以 5000 个块的形式存储在多个 tfrecord 文件中。所有这些记录加起来比我的 RAM 大得多。我想做的是从数据集中的 N = 0.05 * TOTAL_SIZE 随机索引中抽取样本,并计算均值和标准偏差以标准化我的数据。
如果不是因为数据集的大小,这会很容易,但是即使我尝试计算我感兴趣的所有张量的总和,我 运行 内存不足。
# NOTE: count is computed ahead of time by looping over all the tfrecord entries
with tf.device('/cpu:0'):
sample_size = int(count * 0.05)
random_indexes = set(np.random.randint(low=0, high=count, size=sample_size))
stat_graph = tf.Graph()
with tf.Session(graph=stat_graph) as sess:
val_sum = np.zeros(shape=(180, 2050))
for file in files:
print("Reading from file: %s" % file)
for record in tf.python_io.tf_record_iterator(file):
features = tf.parse_single_example(
record,
features={
"val": tf.FixedLenFeature((180, 2050), tf.float32),
})
if index in random_indexes:
val_sum += features["val"].eval(session=sess)
index += 1
val_mean = val_sum / sample_size
在 tfrecord 数据集上计算某些聚合函数(即均值 and/or 标准差)的正确方法是什么?
我认为 tf.parse_single_example 每次调用时都会向图中添加一个新的张量。而不是上面的,你应该用占位符输入字符串:
...
record_placeholder = tf.placeholder(tf.string)
features = tf.parse_single_example(
record_placeholder,
features={
"val": tf.FixedLenFeature((180, 2050), tf.float32),
})
for record in tf.python_io.tf_record_iterator(file):
...
val_sum += features["val"].eval(feed_dict={record_placeholder: record}, session=sess)
让我知道这是否有效,因为我无法对其进行测试。