#python
#питон
Вопрос:
Я делаю проект CNN, и сначала мне нужно предварительно обработать метку.
Файл изображения представляет собой спектрограмму, каждый файл имеет метку из 250 значений, хранящихся в массиве. Он сообщает последовательность значений высоты тона, присутствующих в конкретной спектрограмме. Например, один файл ярлыка выглядит следующим образом:
[ 0 0 0 0 0 0 0 0 0 0 0 57 57 57 57 57 57 57 57 58 58 57 57 57
0 0 0 0 0 56 57 57 56 56 56 56 56 56 56 56 56 57 57 58 59 61 62 62
63 64 64 63 64 64 64 64 0 0 0 0 64 64 64 64 63 63 63 63 63 64 63 64
64 64 65 66 66 66 66 66 65 65 66 66 66 66 65 0 0 0 0 65 65 65 66 66
66 66 66 65 65 65 0 0 0 0 64 64 64 64 64 64 64 64 64 64 64 64 64 64
63 0 0 0 0 0 0 0 0 0 0 0 0 0 60 60 60 60 61 61 62 62 62 62
62 62 62 61 0 0 0 62 62 62 62 62 62 62 62 62 62 62 62 60 0 62 61 60
61 61 61 61 61 61 61 61 61 60 0 0 0 0 0 61 60 60 60 61 61 61 61 61
61 0 0 0 0 0 0 59 59 59 59 58 58 59 59 59 59 0 0 0 0 0 0 0
59 59 58 58 59 59 59 59 59 59 0 0 0 0 58 57 57 57 57 57 57 57 57 57
57 57 58 57 0 0 0 0 0 0]
После того, как я суммирую все файлы меток, я обнаружил, что эти 51 уникальные значения присутствуют в этих метках. Я сохранил эти значения в массиве.
y_train = # y_test also contains these values
[ 0 30 31 32 33 34 35 36 37 38
39 40 41 42 43 44 45 46 47 48
49 50 51 52 53 54 55 56 57 58
59 60 61 62 63 64 65 66 67 68
69 70 71 72 73 74 76 77 81 83
85]
Мне нужно выполнить to_categorical
метод для определения номера класса (в моем случае 51), прежде чем я смогу выполнить вычисление CNN. Вы можете посмотреть to_categorical
документы здесь.
Я сделал это, но результат равен 86, а не 51. Я предполагаю, потому что моя метка уже в целочисленном формате, и метод считает, что у меня есть 86 уникальных значений в диапазоне от 0 до 85 в полном порядке, в то время как на самом деле у меня есть только 51 уникальное значение в диапазоне от 0 до 85, но не в полном порядке (см. y_train
).
# convert to array first. y_train and y_test are labels for an image X_train and X_test.
y_train = np.array(y_train) # labels for X_train images
y_test = np.array(y_test) # labels for X_test images
# do to_categorical
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
# shape result
y_train: (638, 250, 86) # 638 = total data, 250 = 1 data length, 86 = num_class
y_test: (161, 250, 86) # 161 = total data, 250 = 1 data length, 86 = num_class
Затем мне приходит в голову идея сопоставить все уникальные значения с новым целым числом, чтобы to_categorical
метод make думал, что у меня есть только 51 класс, пример:
0 -> 0
30 -> 1
31 -> 2
32 -> 3
...
85 -> 51
Есть ли в Python способ добиться такого сопоставления из y_train
массива? И если есть, могу ли я вернуть его обратно к исходному значению, когда вычисление будет завершено? Спасибо.
Ответ №1:
Да, вы можете создать словарь всех этих сопоставлений, как показано ниже
map_dict = {}
for i, value in enumerate(y_train):
map_dict[i] = value
Вашими новыми категориями будут ключи map_dict, которые вы можете получить, как показано ниже
list(map_dict.keys())
Позже, когда вам придется возвращаться к исходным значениям, вам просто нужно проверить map_dict, например
map_dict[k]
Для печати как ключей, так и значения в словаре, выполните следующие действия,
for key, value in map_dict.items():
print(key, ' --->', value)
Комментарии:
1. Спасибо! 1 вопрос, могу ли я также распечатать
dict
с его ключом и значением?2. @DionisiusPratama Да, конечно, я отредактирую свой ответ, чтобы показать вам, как печатать