Контекст
У нас есть данные, хранящиеся в .tfrecord
файлах, X
- это наши данные обучения> 40x40
серой шкалы и Y
: метки.Эти изображения упорядочены в последовательности (порядок важен).Мы хотели бы ввести эти изображения с помощью Tensorflows Estimator API для обучения модели нейронной сети (например, LSTM) с различными размерами временного окна и смещениями с использованием GoogleML.
Вопрос
Как преобразовать входную строку объектов в последовательности определенной длины, например, поместить 1000
изображения в одну последовательность, а затем выполнить оконную обработку для этих последовательностей, например, получить окна 50
изображения, со смещением окна 25
?
Текущее состояние
Нам удалось этого добиться (разреженный пример ниже) без первого преобразования в 1000 наборов длины, но затем в результате получаются окна, которые охватывают элемент 975 одногоустановить элемент 25 следующего, который нам не нужен . Нам нужны перекрывающиеся окна, которые охватывают от начала до конца каждого набора 1000
изображений, но не должны пересекать их границы.
import tensorflow as tf
# .tfrecord file consisting of data 'X' and labels 'Y'
dataset = tf.data.TFRecordDataset('.tfrecord file')
# define parse function for dataset.map function
def _parse_function(proto):
# define constants for parsing
image_size = 40
num_channels = 1
num_classes = 3
# define your tfrecord feature keys and
# reshape 1D arrays into 2D arrays (images)
keys_to_features = {'X': tf.FixedLenFeature([image_size, image_size, num_channels], tf.float32), # image height, image width, num_channels
'Y': tf.FixedLenFeature([], tf.int64)}
# Load one example
parsed_features = tf.parse_single_example(proto, keys_to_features)
# extract image and labels
image = parsed_features['X']
labels = tf.cast( parsed_features['Y'], tf.int32 )
labels = tf.one_hot( labels, depth=num_classes ) # one hot encoding
return image, labels
# reshape the data into parse format
dataset = dataset.map(_parse_function)
# define dataset parameters
window_size = 50
batch_size = 500
window_shift = int( window_size / 2 ) # 25
# implement sliding window
dataset = dataset.window(size=window_size, shift=window_shift, drop_remainder=True ).flat_map( lambda x: x.batch(window_size) )
# batch the data
dataset = dataset.batch(batch_size)
# create an iterator
# iterator = dataset.make_one_shot_iterator().get_next()
Выше iterator
вернется для X
данные тензор формы (batch_size, window_size, image_height, image_width, количество каналов), в нашем случае (500, 50, 40, 40, 1)
и Y
в виде (500, 3)
массива.