gpt4 book ai didi

machine-learning - 如何使用 TFRecord 数据集使 TensorFlow + Keras 快速运行?

转载 作者:行者123 更新时间:2023-11-30 08:21:32 24 4
gpt4 key购买 nike

如何将 TensorFlow TFRecord 与 Keras 模型和 tf.session.run() 结合使用,同时将数据集保留在带有队列运行器的张量中,有什么示例?

下面是一个有效的代码片段,但需要进行以下改进:

  • 使用Model API
  • 指定一个Input()
  • 从 TFRecord 加载数据集
  • 并行运行数据集(例如使用队列运行程序)

这是代码片段,有几行 TODO 行指示需要什么:

from keras.models import Model
import tensorflow as tf
from keras import backend as K
from keras.layers import Dense, Input
from keras.objectives import categorical_crossentropy
from tensorflow.examples.tutorials.mnist import input_data

sess = tf.Session()
K.set_session(sess)

# Can this be done more efficiently than placeholders w/ TFRecords?
img = tf.placeholder(tf.float32, shape=(None, 784))
labels = tf.placeholder(tf.float32, shape=(None, 10))

# TODO: Use Input()
x = Dense(128, activation='relu')(img)
x = Dense(128, activation='relu')(x)
preds = Dense(10, activation='softmax')(x)
# TODO: Construct model = Model(input=inputs, output=preds)

loss = tf.reduce_mean(categorical_crossentropy(labels, preds))

# TODO: handle TFRecord data, is it the same?
mnist_data = input_data.read_data_sets('MNIST_data', one_hot=True)

train_step = tf.train.GradientDescentOptimizer(0.5).minimize(loss)

sess.run(tf.global_variables_initializer())

# TODO remove default, add queuerunner
with sess.as_default():
for i in range(1000):
batch = mnist_data.train.next_batch(50)
train_step.run(feed_dict={img: batch[0],
labels: batch[1]})
print(loss.eval(feed_dict={img: mnist_data.test.images,
labels: mnist_data.test.labels}))

为什么这个问题相关?

以下是语义分割问题示例的一些入门信息:

最佳答案

我不使用 tfrecord 数据集格式,因此不会争论优缺点,但我有兴趣扩展 Keras 以支持相同的格式。

github.com/indraforyou/keras_tfrecord是存储库。将简要解释主要变化。

Dataset creation and loading

data_to_tfrecordread_and_decode here负责创建 tfrecord 数据集并加载它。必须特别小心地实现read_and_decode,否则您将在训练过程中遇到神秘的错误。

Initialization and Keras model

现在,tf.train.shuffle_batch 和 Keras Input 层都返回张量。但是 tf.train.shuffle_batch 返回的数据没有 Keras 内部所需的元数据。事实证明,通过使用 tensor 参数调用 Input 层,任何张量都可以轻松转换为具有 keras 元数据的张量。

所以这负责初始化:

x_train_, y_train_ = ktfr.read_and_decode('train.mnist.tfrecord', one_hot=True, n_class=nb_classes, is_train=True)

x_train_batch, y_train_batch = K.tf.train.shuffle_batch([x_train_, y_train_],
batch_size=batch_size,
capacity=2000,
min_after_dequeue=1000,
num_threads=32) # set the number of threads here

x_train_inp = Input(tensor=x_train_batch)

现在使用 x_train_inp 可以开发任何 keras 模型。

Training (simple)

假设 train_out 是 keras 模型的输出张量。您可以轻松地编写自定义训练循环:

loss = tf.reduce_mean(categorical_crossentropy(y_train_batch, train_out))
train_op = tf.train.GradientDescentOptimizer(0.01).minimize(loss)


# sess.run(tf.global_variables_initializer())
sess.run(tf.initialize_all_variables())

with sess.as_default():
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)

try:
step = 0
while not coord.should_stop():
start_time = time.time()

_, loss_value = sess.run([train_op, loss], feed_dict={K.learning_phase(): 0})

duration = time.time() - start_time

if step % 100 == 0:
print('Step %d: loss = %.2f (%.3f sec)' % (step, loss_value,
duration))
step += 1
except tf.errors.OutOfRangeError:
print('Done training for %d epochs, %d steps.' % (FLAGS.num_epochs, step))
finally:
coord.request_stop()

coord.join(threads)
sess.close()

Training (keras style)

keras 之所以如此有利可图的功能之一是其带有回调函数的通用训练机制。

但是为了支持 tfrecords 类型训练,需要对 fit 函数进行一些更改

  • 运行队列线程
  • 不通过feed_dict输入批量数据
  • 支持验证变得很棘手,因为验证数据也将通过另一个张量传入,需要使用共享的上层和其他 tfrecord 读取器输入的验证张量在内部创建不同的模型。

但是所有这些都可以通过另一个标志参数轻松支持。使事情变得困惑的是 keras 功能 sample_weightclass_weight 它们用于对每个样本进行权重并为每个类别进行权重。为此,在 compile() 中,keras 创建了占位符 ( here ),并且还为目标隐式创建了占位符 ( here ),这在我们的例子中是不需要的,标签已经由 tfrecord 提供读者。这些占位符需要在 session 运行期间输入,这在我们的 cae 中是不必要的。

因此,考虑到这些更改,compile_tfrecord( here ) 和 fit_tfrecord( here ) 是 compile 的扩展, fit 和共享占了 95% 的代码。

它们可以通过以下方式使用:

import keras_tfrecord as ktfr

train_model = Model(input=x_train_inp, output=train_out)
ktfr.compile_tfrecord(train_model, optimizer='rmsprop', loss='categorical_crossentropy', out_tensor_lst=[y_train_batch], metrics=['accuracy'])

train_model.summary()

ktfr.fit_tfrecord(train_model, X_train.shape[0], batch_size, nb_epoch=3)
train_model.save_weights('saved_wt.h5')

欢迎您改进代码和拉取请求。

关于machine-learning - 如何使用 TFRecord 数据集使 TensorFlow + Keras 快速运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42184863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com