Как прикреплять метки к входному конвейеру [дубликат]

Рекомендуется в качестве ответа:

Вот решение, использующее генераторы 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

50
задан JohnAllen 29 April 2016 в 05:56
поделиться

3 ответа

Использование 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 для полного ввода-конвейера.

46
ответ дан MarvMind 19 August 2018 в 14:47
поделиться
  • 1
    Кажется, вы передаете num_labels в read_images_from_disk, что не является параметром этой функции. Где я должен передавать эту информацию? – ldavid 22 May 2016 в 04:34
  • 2
    Sry, это ошибка, которую я сделал, создавая минимальный пример из большего кода. Теперь я удалил num_labels. Вам не нужно num_labels при чтении из файла. Если вы знаете num_labels, вы можете использовать его для проверок (assert) и произвести one hot labels. Последнее не требуется больше во многих случаях, поскольку tf.nn.sparse_softmax_cross_entropy_with_logits позволяет использовать целые метки напрямую. – MarvMind 22 May 2016 в 17:23
  • 3
    Мой вопрос в том, какова разница между этими подходами (WholeFileReader vs tf.read_file) насколько их производительность и очереди, созданные для буферизации загрузки? – Alex Rothberg 30 August 2016 в 13:29
  • 4
    @AlexRothberg вы нашли ответ на свой вопрос? – seleucia 5 September 2016 в 02:43
  • 5
    Я работал, установив форму изображений в функции read_images_from_disk: example.set_shape ([IMAGE_HEIGHT, IMAGE_WIDTH, NUM_CHANNELS]) – Mohanad Kaleia 20 April 2017 в 20:20

Для решения этой проблемы есть три основных шага:

  1. Заполните tf.train.string_input_producer() списком строк, содержащих исходную строку с разделителем пробела, содержащую имя файла и метку.
  2. Используйте 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
    
  3. Вызовите новую версию read_my_file_format, передав один из выделенных элементов из input_queue:
    image, label = read_my_file_format(input_queue.dequeue())         
    

Затем вы можете использовать тензоры image и label в остальной части вашей модели.

21
ответ дан mrry 19 August 2018 в 14:47
поделиться
  • 1
    Привет, если файлы являются .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 будет именем файла (ключом) и содержимым этот файл (значение)

Затем проанализируйте свое имя файла, извлеките ярлык и преобразуйте его в int. Это потребует немного предварительной обработки данных.

Используйте TFRecords , которые позволят вам хранить данные и метки в одном файле.

1
ответ дан Salvador Dali 19 August 2018 в 14:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: