Я пытаюсь создать файл 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, как в первом фрагменте кода выше. Я уверен, что включил в этот пост все, что касается информации, но дайте мне знать, если я что-то пропустил, и я сразу добавлю это! Спасибо :)