Ошибка в подаче dict TensorFlow с поплавковым вводом

Согласно вашему коду:

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i<=name.length; i++) {
  System.out.print(name[i] +'\n');
}

Если вы проверите System.out.print (name.length),

, вы получите 3;

, что означает, что длина вашего имени равна 3

, ваш цикл работает от 0 до 3, который должен работать либо от «0 до 2», либо от «1 до 3»

Ответ

String[] name = {"tom", "dick", "harry"};
for(int i = 0; i<name.length; i++) {
  System.out.print(name[i] +'\n');
}
0
задан User 13 July 2018 в 14:19
поделиться

1 ответ

dict / array ошибка при бросании

Слишком много кода и зависимостей для воспроизведения вашей проблемы. Мне кажется, что ваша ошибка может исходить из вашей функции parser(record), которая возвращает ваши изображения, завернутые в dict (c.f. {'image': image}, в то время как это не относится к вашему label). Так как epoch_x будет содержать элементы dict, Tensorflow (и numpy) не сможет преобразовать их в ожидаемый тип данных (тензор tf.float32, определение cf place place x), связанная с ошибкой.

Короче говоря, попробуйте заменить return {'image': image}, label на return image, label в вашем парсере.


API-интерфейс Densetet Tensorflow vs feed_dict

Как-то эта проблема сначала ускользнула от меня. Учитывая ваш входной конвейер на основе Tensorflow-Dataset, вы не должны использовать placeholder / feed_dict. Последние предназначены для передачи ваших данных на CPU в Tensorflow (предположительно на GPU). Это дублирование / преобразование входных данных, выполненных с помощью feed_dict, является значительным издержками, следовательно, разработка API-интерфейса Densetet Tensorflow, который замыкает все это путем чтения и преобразования ваших данных параллельно фактическим графическим прогонам. Другими словами, ваш epoch_x, epoch_y не должен быть подан в Tensorflow; они уже являются частью своего графика.

В принципе, ваш конвейер должен выглядеть примерно так:

train_dataset = read_image_dataset_tfrecordfile(my_filenames)
train_dataset = train_dataset.repeat() # if you want to loop indefinitely
train_iterator = train_dataset.make_one_shot_iterator()

x, y = train_iterator.get_next()
# x, y will represent your data batches, fed with the next ones every time 
# they are called.
# So you just use them directly instead of placeholders:
prediction = cnn(x) 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(
    logits=prediction, labels=y))
optimizer = tf.train.AdadeltaOptimizer().minimize(cost)
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())

    for epoch in xrange(num_epochs):
        epoch_loss = 0
        for _ in xrange(int(1020/batch_size)):
            _, c = sess.run([optimizer, cost])
            # ...
1
ответ дан Aldream 17 August 2018 в 13:17
поделиться
  • 1
    Отличный выстрел! Это была проблема. Теперь мне нужно найти способ трансформировать этот тензор в другие вещи, потому что теперь он вызывает эту ошибку: TypeError: значение фида не может быть объектом tf.Tensor. Допустимые значения фида включают скаляры Python, строки, списки, ndarrays numpy или TensorHandles. Знаете ли вы способ кормить тензор, не используя feed dict? – User 13 July 2018 в 11:22
  • 2
    Я написал: epoch_x, epoch_y = sess.run (train_iterator.get_next ()) и, похоже, работает, за исключением ошибки OutOfRange, которая всегда дает мне, когда я пытаюсь выполнить пакетный набор данных. – User 13 July 2018 в 11:26
  • 3
    Правильно, я пропустил основную ошибку. Проверьте мой обновленный ответ. :) – Aldream 13 July 2018 в 12:23
  • 4
    Спасибо. Когда я начал следовать учебным пособиям по tf.data.Dataset, они всегда говорили, что мне больше не нужно использовать фид dict, но они не показывали, как это сделать. Но теперь проблема одна и та же (вы можете видеть в редакции 2 в главном посте). Вы знаете, в чем проблема? – User 13 July 2018 в 13:10
  • 5
    Это нормальное поведение. Вы просто перебирали все ваши входные данные, выходя за пределы последней партии (c.f. OutOfRangeError). См. Раздел документации о том, как с этим бороться. Если вы хотите выполнить цикл несколько раз по вашему набору данных, вы также можете использовать dataset.repeat() . – Aldream 13 July 2018 в 13:44
Другие вопросы по тегам:

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