Похоже, вы читаете свой CSV в DataFrame? Конечно, вы можете реализовать пакетный процесс вручную, но в TF есть эффективный встроенный способ создания очередей и пакетов. Это немного запутанно, но хорошо работает для обслуживания строк как последовательно, так и случайным образом, что довольно удобно. Просто убедитесь, что все ваши строки имеют одинаковую длину, и таким образом вы можете легко указать, какие продажи представляют X, а какие Y.
Для этого вам понадобятся две функции: tf.decode_csv
и tf.train.shuffle_batch
(или tf.train.batch
, если вам не нужна случайная перетасовка).
Мы подробно обсудили это в этом посте, который включает в себя полный пример рабочего кода: data/42373487?noredirect=1#comment71990719_42373487">Пример пакетной обработки TF CSV
Похоже, что все ваши данные являются числовыми, а Y в формате one-hot, поэтому пример MNIST должен подойти для реализации вашей функции оценки.
*** ОБНОВЛЕНИЕ. Вот примерный порядок операций: 1. определить две функции, как показано в связанном примере — одну для чтения CSV-файла построчно, а другую — для упаковки каждой из этих строк в пакеты N (случайно или последовательно) 2. запустить цикл чтения с помощью while not coord.should_stop():
этот цикл будет работать до тех пор, пока он не исчерпает содержимое всех ваших CSV-файлов, которые вы загружаете в очереди 3. В каждой итерации цикла, выполняя sess.run
в этих переменных дает вам ваши пакеты X и Y, а также любое дополнительное содержимое метатипа, которое вы можете захотеть от каждой строки вашего файла CSV, например, метку даты в этом примере (в вашем случае это может быть имя студента или что-то еще :
dateLbl_batch, feature_batch, label_batch = sess.run([dateLbl, features, labels])
Когда TF достигает конца вашего файла (файлов), он выдает исключение, поэтому весь приведенный выше код находится в блоке try/catch — поймав это исключение, вы знаете, что все готово.
Вышеупомянутая функциональность дает вам очень детальный доступ к вашим CSV-файлам на уровне ячеек и позволяет вам группировать их в пакеты по N, в нужное вам количество эпох и т. д.
***** ОБНОВЛЕНИЕ 2**
Вот полный код, который должен считывать ваш CSV-файл партиями в том формате, который у вас есть. Он просто печатает содержимое каждой партии. Отсюда вы можете легко связать этот код с вашим кодом, который фактически выполняет обучение и т. д.
import tensorflow as tf
fileName = 'data/study.csv'
try_epochs = 1
batch_size = 3
S = 1 # this is your Student label
F = 2 # this is the list of your features
L = 3 # this is one-hot vector of 3 representing the label
# set defaults to something (TF requires defaults for the number of cells you are going to read)
rDefaults = [['a'] for row in range((S+F+L))]
# function that reads the input file, line-by-line
def read_from_csv(filename_queue):
reader = tf.TextLineReader(skip_header_lines=True) # skipt the header line
_, csv_row = reader.read(filename_queue) # read one line
data = tf.decode_csv(csv_row, record_defaults=rDefaults) # use defaults for this line (in case of missing data)
studentLbl = tf.slice(data, [0], [S]) # first cell is my 'date-label' for internal pruposes
features = tf.string_to_number(tf.slice(data, [S], [F]), tf.float32) # cells 2-480 is the list of features
label = tf.string_to_number(tf.slice(data, [S+F], [L]), tf.float32) # the remainin 3 cells is the list for one-hot label
return studentLbl, features, label
# function that packs each read line into batches of specified size
def input_pipeline(fName, batch_size, num_epochs=None):
filename_queue = tf.train.string_input_producer(
[fName],
num_epochs=num_epochs,
shuffle=True) # this refers to multiple files, not line items within files
dateLbl, features, label = read_from_csv(filename_queue)
min_after_dequeue = 10000 # min of where to start loading into memory
capacity = min_after_dequeue + 3 * batch_size # max of how much to load into memory
# this packs the above lines into a batch of size you specify:
dateLbl_batch, feature_batch, label_batch = tf.train.shuffle_batch(
[dateLbl, features, label],
batch_size=batch_size,
capacity=capacity,
min_after_dequeue=min_after_dequeue)
return dateLbl_batch, feature_batch, label_batch
# these are the student label, features, and label:
studentLbl, features, labels = input_pipeline(fileName, batch_size, try_epochs)
with tf.Session() as sess:
gInit = tf.global_variables_initializer().run()
lInit = tf.local_variables_initializer().run()
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(coord=coord)
try:
while not coord.should_stop():
# load student-label, features, and label as a batch:
studentLbl_batch, feature_batch, label_batch = sess.run([studentLbl, features, labels])
print(studentLbl_batch);
print(feature_batch);
print(label_batch);
print('----------');
except tf.errors.OutOfRangeError:
print("Done looping through the file")
finally:
coord.request_stop()
coord.join(threads)
Предположим, что ваш CSV-файл выглядит примерно так:
name studytime attendance A B C
S1 2 1 0 1 0
S2 3 2 1 0 0
S3 4 3 0 0 1
S4 3 5 0 0 1
S5 4 4 0 1 0
S6 2 1 1 0 0
Приведенный выше код должен вывести следующий вывод:
[[b'S5']
[b'S6']
[b'S3']]
[[ 4. 4.]
[ 2. 1.]
[ 4. 3.]]
[[ 0. 1. 0.]
[ 1. 0. 0.]
[ 0. 0. 1.]]
----------
[[b'S2']
[b'S1']
[b'S4']]
[[ 3. 2.]
[ 2. 1.]
[ 3. 5.]]
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
----------
Done looping through the file
Таким образом, вместо того, чтобы печатать содержимое пакетов, просто используйте их как X и Y для обучения в feed_dict
person
VS_FF
schedule
13.05.2017