batch_size = 2
x_dim = 2
m = 5
m_dev = 4
epochs = 2
# Toy data
X_train = np.random.randn(m, x_dim)
Y_train = np.random.randint(0, 5, size=m).reshape(-1, 1)
X_dev = np.random.randn(m_dev, x_dim)
Y_dev = np.random.randint(0, 5, size=m_dev).reshape(-1, 1)
X = tf.placeholder(X_train.dtype, shape=[None, x_dim], name='X')
Y = tf.placeholder(Y_train.dtype, shape=[None, 1], name='Y')
# Create two separate datasets
train_dataset = tf.data.Dataset.from_tensor_slices((X, Y)).batch(batch_size)
dev_dataset = tf.data.Dataset.from_tensor_slices((X, Y)).batch(X_dev.shape[0])
# Create a generic Iterator
iterator = tf.data.Iterator.from_structure(train_dataset.output_types,
train_dataset.output_shapes)
# Create two init ops
train_init_op = iterator.make_initializer(train_dataset)
dev_init_op = iterator.make_initializer(dev_dataset)
next_data = iterator.get_next()
with tf.Session() as sess:
for epoch in range(epochs):
# Training data
sess.run(train_init_op, feed_dict={X: X_train, Y: Y_train})
while True:
try:
X_batch, Y_batch = sess.run(next_data)
# process training data
except tf.errors.OutOfRangeError:
break
# Epoch done: process the dev data
sess.run(dev_init_op, feed_dict={X: X_dev, Y: Y_dev})
X_dev_all, Y_dev_all = sess.run(next_data)
Я использую tf.data
с переинициализируемым итератором для обработки данных обучения и набора данных.Для каждой эпохи я инициализирую набор данных тренировки. Официальная документация имеет аналогичную структуру.Я думаю, что это неэффективно, особенно если тренировочный набор большой.
Некоторые из ресурсов, которые я нашел в сети, имеют sess.run(train_init_op, feed_dict={X: X_train, Y: Y_train})
перед циклом for, чтобы избежать этой проблемы.Но тогда мы не можем обработать набор разработчика после каждой эпохи;мы можем обработать его только после того, как закончим epochs
эпох.
Есть ли способ эффективно обработать набор dev после каждой эпохи?