Запись сложного вывода np.memmap в TFRecord - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь создать файл TFRecord, содержащий примеры с меткой имени (строка), SNR (с плавающей точкой) и списком комплексных чисел (16-битное действительное число, за которым следует 16-битное мнимое число

Код, который у меня есть, выглядит следующим образом:

sig_label = []
sig_snrdb = []
sig_data = []

for i in sigmf_data['annotations']:
    try:
        s_start = i["core:sample_start"]
        s_end = s_start + i["core:sample_count"] - 1
        samples = np.memmap("A-5581.sigmf-data", mode="r", dtype=np.int16)[s_start:s_end]       # Change datatype for other files
        print(samples)
        print("Label: {}\nSNRdB: {}\n\n".format(i["rfml:label"][-1], i["capture_details:SNRdB"]))
        
        sig_label.append(i["rfml:label"][-1].encode('utf-8'))
        sig_snrdb.append(i["capture_details:SNRdB"])
        sig_data.append(samples)
        
        pass
    except KeyError:
        continue

label_list = tf.train.BytesList(value=sig_label)
snrdb_list = tf.train.FloatList(value=sig_snrdb)
data_list = tf.train.FloatList(value=sig_data)

sigmf_meta_f.close()

И я получаю следующую ошибку:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-82cfd2e8872a> in <module>
     21 label_list = tf.train.BytesList(value=sig_label)
     22 snrdb_list = tf.train.FloatList(value=sig_snrdb)
---> 23 data_list = tf.train.FloatList(value=sig_data)
     24 
     25 sigmf_meta_f.close()

~\anaconda3\envs\tf\lib\site-packages\google\protobuf\internal\python_message.py in init(self, **kwargs)
    540             field_value = [_GetIntegerEnumValue(field.enum_type, val)
    541                            for val in field_value]
--> 542           copy.extend(field_value)
    543         self._fields[field] = copy
    544       elif field.cpp_type == _FieldDescriptor.CPPTYPE_MESSAGE:

~\anaconda3\envs\tf\lib\site-packages\google\protobuf\internal\containers.py in extend(self, elem_seq)
    280       raise
    281 
--> 282     new_values = [self._type_checker.CheckValue(elem) for elem in elem_seq_iter]
    283     if new_values:
    284       self._values.extend(new_values)

~\anaconda3\envs\tf\lib\site-packages\google\protobuf\internal\containers.py in <listcomp>(.0)
    280       raise
    281 
--> 282     new_values = [self._type_checker.CheckValue(elem) for elem in elem_seq_iter]
    283     if new_values:
    284       self._values.extend(new_values)

~\anaconda3\envs\tf\lib\site-packages\google\protobuf\internal\type_checkers.py in CheckValue(self, proposed_value)
    283       message = ('%.1024r has type %s, but expected one of: numbers.Real' %
    284                  (proposed_value, type(proposed_value)))
--> 285       raise TypeError(message)
    286     converted_value = float(proposed_value)
    287     # This inf rounding matches the C++ proto SafeDoubleToFloat logic.

TypeError: memmap([   0,    0,    0, ..., -121, -242, -121], dtype=int16) has type <class 'numpy.memmap'>, but expected one of: numbers.Real

После небольшого чтения Я понял, что сильно упрощаю процесс. По-видимому, мне нужно использовать tf.train.Feature () для создания списка для передачи в tf.train.Example (), или, по крайней мере, я так понимаю. Самое близкое, что я смог найти к ответу, пришло из этого потока, но он включает int64, а не комплексные числа или 16-битные целые числа со знаком: Как использовать Dataset API для чтения файла TFRecords со списками длины вариантов?

Данные в списке memmap настроены так, что действительная и мнимая части числа чередуются. Чтобы усугубить путаницу, каждое число подписано 16-битным. Например, первые два значения - 29fd (реальный) и b0f c (воображаемый), что соответствует -727, -848.

Итак, я пытаюсь выяснить, что у меня есть to do, чтобы записать список, содержащий эти значения, в пример TF, как в первом фрагменте кода выше. Я уверен, что включил в этот пост все, что касается информации, но дайте мне знать, если я что-то пропустил, и я сразу добавлю это! Спасибо :)

...