我正在尝试预取训练数据以隐藏I /
O延迟。我想编写自定义Python代码,该代码从磁盘加载数据并对数据进行预处理(例如,通过添加上下文窗口)。换句话说,一个线程进行数据预处理,另一个线程进行训练。TensorFlow有可能吗?
更新:我有一个基于@mrry的示例的工作示例。
import numpy as np
import tensorflow as tf
import threading
BATCH_SIZE = 5
TRAINING_ITERS = 4100
feature_input = tf.placeholder(tf.float32, shape=[128])
label_input = tf.placeholder(tf.float32, shape=[128])
q = tf.FIFOQueue(200, [tf.float32, tf.float32], shapes=[[128], [128]])
enqueue_op = q.enqueue([label_input, feature_input])
label_batch, feature_batch = q.dequeue_many(BATCH_SIZE)
c = tf.reshape(feature_batch, [BATCH_SIZE, 128]) + tf.reshape(label_batch, [BATCH_SIZE, 128])
sess = tf.Session()
def load_and_enqueue(sess, enqueue_op, coord):
with open('dummy_data/features.bin') as feature_file, open('dummy_data/labels.bin') as label_file:
while not coord.should_stop():
feature_array = np.fromfile(feature_file, np.float32, 128)
if feature_array.shape[0] == 0:
print('reach end of file, reset using seek(0,0)')
feature_file.seek(0,0)
label_file.seek(0,0)
continue
label_value = np.fromfile(label_file, np.float32, 128)
sess.run(enqueue_op, feed_dict={feature_input: feature_array,
label_input: label_value})
coord = tf.train.Coordinator()
t = threading.Thread(target=load_and_enqueue, args=(sess,enqueue_op, coord))
t.start()
for i in range(TRAINING_ITERS):
sum = sess.run(c)
print('train_iter='+str(i))
print(sum)
coord.request_stop()
coord.join([t])
这是一个常见的用例,大多数实现都使用TensorFlow的 队列
将预处理代码与训练代码分离。有一个有关如何使用队列的教程,但是主要步骤如下:
定义一个队列,q
它将缓冲预处理的数据。TensorFlow支持以tf.FIFOQueue
排队顺序生成元素的简单方法,以及tf.RandomShuffleQueue
以随机顺序生成元素的高级方法。队列元素是一个或多个张量(可以具有不同的类型和形状)的元组。所有队列都支持单元素(enqueue
,dequeue
)和批处理(enqueue_many
,dequeue_many
)操作,但是要使用批处理操作,必须在构造队列时在队列元素中指定每个张量的形状。
构建一个子图,将预处理的元素排入队列。一种方法是tf.placeholder()
为张量定义一些与单个输入示例对应的操作,然后将它们传递给q.enqueue()
。(如果预处理一次生成一批,则应q.enqueue_many()
改用。)您也可以在此子图中包括TensorFlow op。
建立执行训练的子图。这看起来像一个普通的TensorFlow图,但是会通过调用来获取其输入q.dequeue_many(BATCH_SIZE)
。
开始会话。
创建一个或多个执行预处理逻辑的线程,然后执行入队操作,并输入预处理后的数据。您可能会发现tf.train.Coordinator
和tf.train.QueueRunner
实用程序类对此有用。
正常运行训练图(优化器等)。
编辑: 这是一个简单的load_and_enqueue()
功能和代码片段,可以帮助您入门:
# Features are length-100 vectors of floats
feature_input = tf.placeholder(tf.float32, shape=[100])
# Labels are scalar integers.
label_input = tf.placeholder(tf.int32, shape=[])
# Alternatively, could do:
# feature_batch_input = tf.placeholder(tf.float32, shape=[None, 100])
# label_batch_input = tf.placeholder(tf.int32, shape=[None])
q = tf.FIFOQueue(100, [tf.float32, tf.int32], shapes=[[100], []])
enqueue_op = q.enqueue([feature_input, label_input])
# For batch input, do:
# enqueue_op = q.enqueue_many([feature_batch_input, label_batch_input])
feature_batch, label_batch = q.dequeue_many(BATCH_SIZE)
# Build rest of model taking label_batch, feature_batch as input.
# [...]
train_op = ...
sess = tf.Session()
def load_and_enqueue():
with open(...) as feature_file, open(...) as label_file:
while True:
feature_array = numpy.fromfile(feature_file, numpy.float32, 100)
if not feature_array:
return
label_value = numpy.fromfile(feature_file, numpy.int32, 1)[0]
sess.run(enqueue_op, feed_dict={feature_input: feature_array,
label_input: label_value})
# Start a thread to enqueue data asynchronously, and hide I/O latency.
t = threading.Thread(target=load_and_enqueue)
t.start()
for _ in range(TRAINING_EPOCHS):
sess.run(train_op)
我是Spring Jpa和Hibernate的新手。我试图使用一个定制函数从Oracle数据库中获取数据。我可以定义一个实体及其相关的服务、实现和存储库。此外,我通过使用< code>registerFunction创建了一个新的定制Oracle方言,如下所示。 所以我有两个问题: 1)在我的Oracle数据库中,函数位于不同的模式下。我需要指定它的模式吗?如果是的话怎么做?还是hibernate
问题内容: 如果我要在数据库中定义某些功能(也许是Postgres或任何其他数据库): 我会从SQL中将其称为: 如何从Hibernate调用诸如此类的自定义函数? 问题答案: 如果要在HQL中使用自定义函数,则需要在相应的方言中定义它 看一下PostgreSQLDialect(或其他任何来源)的源代码,您会看到一堆registerFunction()调用。您需要再添加一个:-)-用于您自己的自定
问题内容: 有没有一种方法可以将一个函数定义为在一个类中是全局的(或者,实际上是在另一个函数中)?类似于定义全局变量。 问题答案: 将函数添加到当前名称空间,就像将添加任何其他名称一样。这意味着您可以在函数或方法中使用关键字: 同样适用于类主体或方法: 区别将在导入时执行顶级类主体时立即定义。 像您的所有用途一样,您可能想重新思考问题并找到另一种解决方法。例如,您可以 返回 如此创建的函数。 演示
本文向大家介绍TensorFlow自定义损失函数来预测商品销售量,包括了TensorFlow自定义损失函数来预测商品销售量的使用技巧和注意事项,需要的朋友参考一下 在预测商品销量时,如果预测多了(预测值比真实销量大),商家损失的是生产商品的成本;而如果预测少了(预测值比真实销量小),损失的则是商品的利润。因为一般商品的成本和商品的利润不会严格相等,比如如果一个商品的成本是1元,但是利润是10元,那
主要内容:操作整个数据表,操作行或列,操作单一元素如果想要应用自定义的函数,或者把其他库中的函数应用到 Pandas 对象中,有以下三种方法: 1) 操作整个 DataFrame 的函数:pipe() 2) 操作行或者列的函数:apply() 3) 操作单一元素的函数:applymap() 如何从上述函数中选择适合的函数,这取决于函数的操作对象。下面介绍了三种方法的使用。 操作整个数据表 通过给 pipe() 函数传递一个自定义函数和适当数量的参
问题内容: 我想使用该函数在滚动窗口的基础上应用自己的自定义函数。 但是我的函数需要两个参数,并且还具有两个输出。这可能吗? 下面是一个最小的可复制示例… 导致错误…因为gm需要两个参数… 任何帮助将不胜感激… 编辑 按照Jeff的评论,我已经取得了进步,但仍在为两个或多个列输出而苦苦挣扎,因此,如果我改为创建一个新函数(如下),该函数仅返回两个随机数(与上一个计算无关),而不是v的最后一行,出现