Ошибка Tensorflow "имеет список типов, но ожидается одно из: int, long, float" - PullRequest
0 голосов
/ 30 января 2019

Я собирался что-то сделать с tenorflow и librosa , но когда я использовал TFRecore, произошла ошибка.Я не нашел ответа после Google, поэтому хочу проконсультироваться с вами здесь.

def create_record():
writer = tf.python_io.TFRecordWriter("./music_data/train.tfrecords")
for index, class_name in enumerate(classes):
    class_path = "f:/Classical music/"+class_name+"/dataset/"
    for a in os.listdir(class_path):
        wav_path = class_path + a
        print(wav_path)
        wav,sr = librosa.load(wav_path,sr=None)
        mfcc = librosa.feature.mfcc(wav,sr,n_mfcc=128)  # is a numpy.ndarray ,with shape (128,1293)
        print(index,mfcc.shape,type(mfcc))
       # mfcc_list=[]
       # for i in range(mfcc.shape[0]):
       #    mfcc_list.append([float(x) for x in mfcc[i]])
        example = tf.train.Example(
                    feartures = tf.train.Features(feature={
                        "label":tf.train.Feature(int64_list=tf.train.Int64List(value=[index])),
                        "mfcc":tf.train.Feature(float_list=tf.train.FloatList(value=mfcc.tolist()))
                    }))
        writer.write(example.SerializeToString())
writer.close()

TypeError                                 Traceback (most recent call last)
<ipython-input-137-9bb818ee02d5> in <module>()
----> 1 create_record()

<ipython-input-136-9a256cba70a6> in create_record()
     15                         feartures = tf.train.Features(feature={
     16                             "label":tf.train.Feature(int64_list=tf.train.Int64List(value=[index])),
---> 17                             "mfcc":tf.train.Feature(float_list=tf.train.FloatList(value=mfcc.tolist()))
     18                         }))
     19             writer.write(example.SerializeToString())

TypeError: [-389.381029172618, -393.08814551655723, -404.7248725876356, -407.1006984237564, -409.22695909850626 has type list, but expected one of: int, long, float

Я пробую решение, подобное https://github.com/tensorflow/tensorflow/issues/9554,but, оно не работаетмне .

Спасибо!

1 Ответ

0 голосов
/ 30 января 2019

MFCC дает вам 2d массив, который будет соответственно преобразован в список списков.Однако TFRrecords принимает только «плоские» списки в качестве значений объектов.

Вы можете обойти это, добавив value=mfcc.flatten() в float_list.Позже, когда вы анализируете TFRecord в качестве входных данных для вашей модели, вам нужно будет снова преобразовать его в 2D.Если формы всегда одинаковы (128, 1293), это легко.Если фигуры являются переменными, вы можете поместить mfcc.shape в запись в качестве другой функции, чтобы вы «запомнили» исходную форму каждого примера.Например:

example = tf.train.Example(
                features = tf.train.Features(feature={           
    "label": tf.train.Feature(int64_list=tf.train.Int64List(value=[index])),
    "mfcc": tf.train.Feature(float_list=tf.train.FloatList(value=mfcc.flatten())),
    "shape": tf.train.Feature(int64_list=tf.train.Int64List(value=mfcc.shape))
                }))
...