Вход в DecodeRaw не кратен 8, размер двойной - PullRequest
0 голосов
/ 23 апреля 2019

Я хочу построить набор данных тензорного потока из tfrecords.это мой код:

def make_dataset():
   filenames = [train_tfrecords_dir + name for name in os.listdir(train_tfrecords_dir)] 
   dataset = tf.data.TFRecordDataset(filenames)

    def parser(record):
         keys_to_features = {
        "mhot_label_raw": tf.FixedLenFeature((), tf.string, default_value=""),
        "mel_spec_raw": tf.FixedLenFeature((), tf.string, default_value=""),
    }
        parsed = tf.parse_single_example(record, keys_to_features)

        mel_spec1d = tf.decode_raw(parsed['mel_spec_raw'], tf.float64)
        mhot_label = tf.decode_raw(parsed['mhot_label_raw'], tf.float64)
        mel_spec = tf.reshape(mel_spec1d, [30, 65,85])
        return {"mel_data": mel_spec}, mhot_label

   dataset = dataset.map(parser)
   dataset = dataset.repeat(num_epochs)
   dataset = dataset.batch(batch_size)
   iterator = dataset.make_one_shot_iterator()
   return iterator

но это вызывает эту ошибку:

 InvalidArgumentError: Input to DecodeRaw has length 165750 that is not a multiple of 8, the size of double
     [[Node: DecodeRaw = DecodeRaw[little_endian=true, out_type=DT_DOUBLE](ParseSingleExample/Squeeze_mel_spec_raw)]]
     [[Node: IteratorGetNext = IteratorGetNext[output_shapes=[[?,30,65,85], [?,?]], output_types=[DT_DOUBLE, DT_DOUBLE], _device="/job:localhost/replica:0/task:0/device:CPU:0"](OneShotIterator)]]

Как я могу это исправить?Я удалил tf.decode_raw , но он не работал

1 Ответ

0 голосов
/ 17 мая 2019

Поскольку вы используете tf.decode_raw для преобразования вашего изображения в тип double (tf.float64), размер которого составляет 8 байт.таким образом, проанализированный ['mel_spec_raw'] должен быть кратным 8. Вы можете напечатать тип parsed ['mel_spec_raw'] , это должно быть tf.string , что объясняет, почемуразмер проанализированного ['mel_spec_raw'] составляет 165750. Вы можете изменить свой код на:

# mel_spec1d = tf.decode_raw(parsed['mel_spec_raw'], tf.float64)
mel_spec1d = tf.decode_raw(parsed['mel_spec_raw'], tf.uint8)

, он может работать, поскольку размер tf.uint8 равен только 1. Если вы хотите преобразоватьтип в tf.float64, вы можете преобразовать тип в tf.float, используя tf.cast

mel_spec1d = tf.cast(mel_spec1d, tf.float64)

Надеюсь, это поможет вам.

...