Рекомендуется в качестве ответа:
Вот решение, использующее генераторы es2015 :
function* subsetSum(numbers, target, partial = [], partialSum = 0) {
if(partialSum === target) yield partial
if(partialSum >= target) return
for(let i = 0; i < numbers.length; i++){
const remaining = numbers.slice(i + 1)
, n = numbers[i]
yield* subsetSum(remaining, target, [...partial, n], partialSum + n)
}
}
Использование генераторов действительно может быть очень полезным, поскольку оно позволяет вам чтобы приостановить выполнение скрипта сразу после нахождения действительного подмножества. Это контрастирует с решениями без генераторов (т. Е. С отсутствием состояния), которым приходится проходить через каждое подмножество numbers
Использование slice_input_producer
обеспечивает решение, которое намного чище. Slice Input Producer позволяет создавать входную очередь, содержащую произвольно многие разделимые значения. Этот фрагмент вопроса будет выглядеть следующим образом:
def read_labeled_image_list(image_list_file):
"""Reads a .txt file containing pathes and labeles
Args:
image_list_file: a .txt file with one /path/to/image per line
label: optionally, if set label will be pasted after each line
Returns:
List with all filenames in file image_list_file
"""
f = open(image_list_file, 'r')
filenames = []
labels = []
for line in f:
filename, label = line[:-1].split(' ')
filenames.append(filename)
labels.append(int(label))
return filenames, labels
def read_images_from_disk(input_queue):
"""Consumes a single filename and label as a ' '-delimited string.
Args:
filename_and_label_tensor: A scalar string tensor.
Returns:
Two tensors: the decoded image, and the string label.
"""
label = input_queue[1]
file_contents = tf.read_file(input_queue[0])
example = tf.image.decode_png(file_contents, channels=3)
return example, label
# Reads pfathes of images together with their labels
image_list, label_list = read_labeled_image_list(filename)
images = ops.convert_to_tensor(image_list, dtype=dtypes.string)
labels = ops.convert_to_tensor(label_list, dtype=dtypes.int32)
# Makes an input queue
input_queue = tf.train.slice_input_producer([images, labels],
num_epochs=num_epochs,
shuffle=True)
image, label = read_images_from_disk(input_queue)
# Optional Preprocessing or Data Augmentation
# tf.image implements most of the standard image augmentation
image = preprocess_image(image)
label = preprocess_label(label)
# Optional Image and Label Batching
image_batch, label_batch = tf.train.batch([image, label],
batch_size=batch_size)
См. Также generic_input_producer из примеров TensorVision для полного ввода-конвейера.
Для решения этой проблемы есть три основных шага:
tf.train.string_input_producer()
списком строк, содержащих исходную строку с разделителем пробела, содержащую имя файла и метку. tf.read_file(filename)
, а не tf.WholeFileReader()
, чтобы читать ваши файлы изображений. tf.read_file()
является оператором без учета состояния, который использует одно имя файла и создает одну строку, содержащую содержимое файла. Преимущество состоит в том, что это чистая функция, поэтому легко связывать данные со входом и выходом. Например, ваша функция read_my_file_format
станет следующей: def read_my_file_format(filename_and_label_tensor):
"""Consumes a single filename and label as a ' '-delimited string.
Args:
filename_and_label_tensor: A scalar string tensor.
Returns:
Two tensors: the decoded image, and the string label.
"""
filename, label = tf.decode_csv(filename_and_label_tensor, [[""], [""]], " ")
file_contents = tf.read_file(filename)
example = tf.image.decode_png(file_contents)
return example, label
read_my_file_format
, передав один из выделенных элементов из input_queue
: image, label = read_my_file_format(input_queue.dequeue())
Затем вы можете использовать тензоры image
и label
в остальной части вашей модели.
.mat
форматом, который должен сначала загрузиться с использованием h5py
, а затем с помощью convert_to_tensor
, как разобрать filename_and_label_tensor
в строку numpy для использования h5py.Open()
? В настоящее время тензорный поток не поддерживает decode_mat
. Не уверен, почему для shadoworflow необходимо взять строку как Tensor
.
– mining
21 July 2017 в 18:18
В дополнение к предоставленным ответам есть несколько других вещей, которые вы можете сделать:
Кодируйте свою метку в имени файла. Если у вас есть N разных категорий, вы можете переименовать свои файлы примерно так: 0_file001, 5_file002, N_file003
. Впоследствии, когда вы читаете данные из reader key, value = reader.read(filename_queue)
, ваш ключ / значение:
. Вывод Read будет именем файла (ключом) и содержимым этот файл (значение)
blockquote>Затем проанализируйте свое имя файла, извлеките ярлык и преобразуйте его в int. Это потребует немного предварительной обработки данных.
Используйте TFRecords , которые позволят вам хранить данные и метки в одном файле.
num_labels
вread_images_from_disk
, что не является параметром этой функции. Где я должен передавать эту информацию? – ldavid 22 May 2016 в 04:34num_labels
. Вам не нужноnum_labels
при чтении из файла. Если вы знаетеnum_labels
, вы можете использовать его для проверок (assert) и произвестиone hot labels
. Последнее не требуется больше во многих случаях, посколькуtf.nn.sparse_softmax_cross_entropy_with_logits
позволяет использовать целые метки напрямую. – MarvMind 22 May 2016 в 17:23WholeFileReader
vstf.read_file
) насколько их производительность и очереди, созданные для буферизации загрузки? – Alex Rothberg 30 August 2016 в 13:29