Ошибка tenorflow: InvalidArgumentError: Несоответствие формы в компоненте кортежа 1. Ожидается [1], получено [5] - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь создать пакет из пары (wav_file, label). Метки и пути к wav-файлам перечислены в dev.csv. код ниже не работает,

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import tensorflow as tf

FLAGS = tf.app.flags.FLAGS

threads = 1
batch_size = 5
global record_defaults
record_defaults = [['/Users/phoenix/workspace/dataset/data_thchs30/dev/A11_101.wav'], ['8.26'], ['七十 年代 末 我 外出 求学 母亲 叮咛 我 吃饭 要 细嚼慢咽 学习 要 深 钻 细 研']]

def read_record(filename_queue, num_records):
    reader = tf.TextLineReader()
    key, value = reader.read_up_to(filename_queue, num_records)
    wav_filename, duration, transcript = tf.decode_csv(value, record_defaults, field_delim=",")

    wav_reader = tf.WholeFileReader()
    wav_key, wav_value = wav_reader.read_up_to(tf.train.string_input_producer(wav_filename, shuffle=False, capacity=num_records), num_records)
    return [wav_key, transcript] # throw errors
    # return [wav_key, wav_value]  # works
    # return [wav_filename, duration, transcript]   # works

data_queue = tf.train.string_input_producer(tf.train.match_filenames_once('dev.csv'), shuffle=False)  
batch_data = [read_record(data_queue, batch_size) for _ in range(threads)]
capacity = threads * batch_size
batch_values = tf.train.batch_join(batch_data, batch_size=batch_size, capacity=capacity, enqueue_many=True)

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    sess.run(tf.initialize_local_variables())
    coord = tf.train.Coordinator()
    print(coord)
    threads = tf.train.start_queue_runners(coord=coord)
    print("threads num: " + str(threads))
    try:
        step = 0
        while not coord.should_stop():
            step += 1
            feat = sess.run([batch_values])
            print("line:", step, feat)

    except tf.errors.OutOfRangeError:
        print(' training for 1 epochs, %d steps', step)
    finally:
        coord.request_stop()
        coord.join(threads)

выкиньте ошибки ниже, как я могу это исправить?:

enter image description here

dev.csv содержимое, как показано ниже:

/ Пользователи / Феникс / Рабочая область / Набор данных / data_thchs30 / dev / A11_101.wav, 8.26, Ци Ши Нянь Дай Мо Во Вай Чу Цю Сюэ

/ Пользователи / Феникс / Рабочая область / Набор данных / data_thchs30 / dev / A11_119.wav, 6.9, Чэнь Юнь Тонг Ши Яо Цю Ган Бу Мен Рен Чжэнь Сюэ Си

1 Ответ

0 голосов
/ 03 июля 2018

Я пытался переписать ваш код следующим образом.

Это мое наблюдение.

  1. Ошибка больше не выдается. И значения возвращаются.
  2. Очевидное несоответствие заключается в том, что размер пакета для транскрипт вдвое больше указанного. Таким образом, это 4 вместо 2. Это удваивается по некоторым причинам. Нет такой проблемы для аудио двоичного файла.

  3. shapes=[tf.TensorShape(()),tf.TensorShape(batch_size,)] основана на обнаруженной мной ошибке, в которой упоминалось, что я должен указать это с помощью TensorShape. Я не нашел документации какой-либо помощи, но там упоминается.

shape: (Необязательно.) Список полностью определенных объектов TensorShape, длина которых равна dtypes, или None.

import tensorflow as tf

tf.logging.set_verbosity(tf.logging.DEBUG)

FLAGS = tf.app.flags.FLAGS

threads = 1
batch_size = 2
record_defaults = [['D:/male.wav'], ['8.26'], ['七十 年代 末 我 外出 求学 母亲 叮咛 我 吃饭 要 细嚼慢咽 学习 要 深 钻 细 研']]


def readbatch(data_queue) :

    reader = tf.TextLineReader()
    _, rows = reader.read_up_to(data_queue, batch_size)
    wav_filename, duration, transcript = tf.decode_csv(rows, record_defaults,field_delim=",")
    audioreader = tf.WholeFileReader()
    _, audio = audioreader.read( tf.train.string_input_producer(wav_filename) )
    return [audio,transcript]

data_queue = tf.train.string_input_producer(
                tf.train.match_filenames_once('D:/Book1.csv'), shuffle=False)

batch_data = [readbatch(data_queue) for _ in range(threads)]
capacity = threads * batch_size
batch_values = tf.train.batch_join(batch_data, shapes=[tf.TensorShape(()),tf.TensorShape(batch_size,)], capacity=capacity, batch_size=batch_size, enqueue_many=False )

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    sess.run(tf.initialize_local_variables())
    coord = tf.train.Coordinator()
    threads = tf.train.start_queue_runners(coord=coord)
    try:
        step = 0
        while not coord.should_stop():
            step += 1
            feat = sess.run([batch_values])
            audio = feat[0][0]
            print ('Size of audio is ' + str(audio.size))
            script = feat[0][1]
            print ('Size of script is ' + str(script.size))
    except tf.errors.OutOfRangeError:
        print(' training for 1 epochs, %d steps', step)
    finally:
        coord.request_stop()
        coord.join(threads)

Пример набора данных доказывает наличие дополнительной пары.

[[array([b'Text2', b'Text1'], dtype=object), array([[b'Translation-1', b'Translation-2'],
       [b'Translation-1', b'Translation-2']], dtype=object)]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...