Один горячий список кодирования строк - PullRequest
1 голос
/ 28 апреля 2020

У меня есть список строк, которые служат метками для моей проблемы классификации (распознавание изображений с помощью сверточной нейронной сети). Эти метки состоят из 5-8 символов (цифры от 0 до 9 и буквы от A до Z). Чтобы обучить свою нейронную сеть, я бы хотел одно горячее кодирование меток. Я написал код для кодирования одной метки, но все еще испытываю трудности при попытке применить код к списку.

Вот мой код для одной метки, которая отлично работает:

from numpy import argmax
# define input string
data = '7C24698'
print(data)
# define universe of possible input values
characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ '
# define a mapping of chars to integers
char_to_int = dict((c, i) for i, c in enumerate(characters))
int_to_char = dict((i, c) for i, c in enumerate(characters))
# integer encode input data
integer_encoded = [char_to_int[char] for char in data]
print(integer_encoded)
# one hot encode
onehot_encoded = list()
for value in integer_encoded:
    character = [0 for _ in range(len(characters))]
    character[value] = 1
    onehot_encoded.append(character)
print(onehot_encoded)
# invert encoding
inverted = int_to_char[argmax(onehot_encoded[0])]
print(inverted)

Теперь я хочу получить тот же вывод для списка меток и сохранить вывод в новом списке:

list_of_labels = ['7C24698', 'NDK745']
encoded_labels = []

Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Вы можете использовать LabelBinarizer из scikit-learn :

from sklearn.preprocessing import LabelBinarizer

>>> labels = ["first", "second", "third"]
>>> lb = LabelBinarizer()
>>> lb.fit(labels)
>>> lb.transform(labels)
array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 1]])

И для преобразования обратно закодированных ярлыков обратно в значения string:

>>> encoded_labels = [
  [1, 0, 0],
  [0, 1, 0],
  [0, 0, 1]
]
>>> lb.inverse_transform(encoded_labels)
array(['first', 'second', 'third'])
1 голос
/ 28 апреля 2020

вы можете создать функцию с вашим рабочим кодом, а затем использовать встроенную функцию map, чтобы подать заявку на каждый элемент из вашей lists_of_labels вашей функции кодирования одним нажатием:

from numpy import argmax
# define input string

def my_onehot_encoded(data):
    # define universe of possible input values
    characters = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ '
    # define a mapping of chars to integers
    char_to_int = dict((c, i) for i, c in enumerate(characters))
    int_to_char = dict((i, c) for i, c in enumerate(characters))
    # integer encode input data
    integer_encoded = [char_to_int[char] for char in data]
    # one hot encode
    onehot_encoded = list()
    for value in integer_encoded:
        character = [0 for _ in range(len(characters))]
        character[value] = 1
        onehot_encoded.append(character)

    return onehot_encoded


list_of_labels = ['7C24698', 'NDK745']
encoded_labels = list(map(my_onehot_encoded, list_of_labels))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...