Как загрузить трехмерный массив со смешанными типами данных в Tensorflow для обучения? - PullRequest
0 голосов
/ 01 февраля 2019

Я работаю с набором данных, который выглядит примерно так:

PERSON1 = [["Person1Id", "Rome", "Frequent Flyer", "1/2/2018"],["Person1Id", "London", "Frequent Flyer", "3/4/2018"],["Person1Id", "Paris", "Frequent Flyer", "2/4/2018"], ...]
PERSON2 = [["Person2Id", "Shenzen", "Frequent Flyer", "1/2/2018"],["Person2Id", "London", "Frequent Flyer", "2/6/2018"],["Person2Id", "Hong Kong", "Not Frequent Flyer", "1/3/2017"], ...]
PERSON3 = [["Person3Id", "Moscow", "Frequent Flyer", "1/2/2018"],["Person3Id", "London", "Frequent Flyer", "3/4/2018"],["Person3Id", "Paris", "Frequent Flyer", "2/4/2018"], ...]
...

TRAIN_X = [ 
    PERSON1, PERSON2, PERSON3, ..., PERSONN
]

TRAIN_Y = [
    1, 0, 1, ..., 1
]

Идея состоит в том, что некоторые люди относятся к классу 1, а некоторые к классу 0, в зависимости от данных обучения.(Фактические используемые массивы данных длиннее, это упрощенная версия.)

Мой вопрос - учитывая эту структуру данных - как я могу правильно загрузить ее в Tensorflow для обучения нейронной сети?Я работал с более простыми наборами данных, такими как набор данных Iris, MNIST и т. Д. Я понятия не имею, как обращаться с более сложными, реальными данными, подобными этим, и я не могу найти какую-либо документацию / ресурсы / образец кода, которыйделает что-нибудь подобное.

Я предполагаю, что первым шагом здесь является то, что данные должны быть сведены, нормализованы и т. Д. - каким-то образом, однако я не уверен, как поступить.

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

Похоже, у вас есть категорические данные.И давайте предположим, что вы так хотите.

Вы можете предварительно обработать его на чистом Python, если это имеет смысл, учитывая ваш объем данных (например, запустите предварительную обработку один раз и сохраните предварительно обработанные данные вместо повторной обработки каждый раз).Это означало бы иметь что-то вроде:

import numpy as np

def one_hot(index, max_dim):
    return np.eye(max_dim)[index]

destinations = {
    "Moscow": 0,
    "London": 1,
    # etc.
}
one_hot_destinations = {
    k: one_hot(v, len(destinations)) 
    for k, v in destinations.items()
}
def process_loc(loc):
    return one_hot_destinations[loc]

# do some similar processing to other properties of a "PERSON"
# so that you represent them in a vector / scalar way then:

def process_person(person_item):
    pid, loc, status, date = person
    return np.concatenate(
        [
            process_pid(pid), 
            process_loc(loc), 
            process_status(status), 
            process_date(date)
        ],
        axis=0)

TRAIN_X = [[process_person(item) for item in p] for p in PERSONS]

Или вы можете обработать это в C ++ на лету с tenorflow. Итак, вы можете сделать table_lookup, который очень похож нав словарь:

dictionary = tf.contrib.lookup.index_table_from_file(dictionary, num_oov_buckets=0)

Вы должны понимать, что, учитывая количество предоставленного вами контекста и кода, трудно помочь вам дальше, чем мы с Матей Рачинским, и я пытался это сделать.Мы не имеем ни малейшего представления, например, о том, что вы делаете.

Если вы хотите заняться чем-то, связанным с НЛП, возможно, вы можете взглянуть на сообщение в блоге, которое я написал несколько месяцев назад: Классификация текстов по нескольким меткам с Tensorflow , которая включает в себя данныепредварительная обработка с table_lookup

0 голосов
/ 05 февраля 2019

Вам необходимо выполнить более сложную предварительную обработку этих данных.Нейронные сети не могут работать с текстовыми данными напрямую, поэтому вам необходимо выполнить встраивание.

В зависимости от типа вашего векторного признака вы, вероятно, захотите выполнить какой-либо тип кодирования данных в числа с помощью однокадрового кодирования или кодирования метки или преобразования в географические координаты, если это имеет смыслдля задачи.

Вероятно, вы будете использовать однократное кодирование для названий городов, поскольку они являются категориальными данными, но вы захотите преобразовать порядковые данные, например дату, в числа.И подумайте, какие данные полезны для этой задачи.Например, если проблема, которую вы хотите решить с помощью NN, использует идентификатор человека или нет.

Кроме того, у вас, вероятно, будут тензоры разных форм после обработки ввода, поэтому может быть лучше разделить ввод на несколько переменных (например, если у вас есть некоторые функции, закодированные как горячие, а некоторые нет).

Также помните, что вам нужно нормализовать входы для сети, поэтому выберите соответствующее представление.

Боюсь, для этого не существует решения plug'n'play.

...