Подача векторизованных данных в керас - PullRequest
0 голосов
/ 15 февраля 2019

Я работаю над использованием некоторых name:gender данных для построения и обучения модели, которая могла бы предсказать пол.Я пробую основы, когда читаю о ML, и, вероятно, ошибаюсь во многих вещах.Я еще не научился генерировать и использовать все функции, которые я хочу, чтобы сеть использовала при обучении.На этом этапе я пытаюсь подготовить свои данные и заставить керасы принять их для обучения.

Я пытаюсь создать словарь или символы в именах и подать каждое векторизованное имя в модель:

names_frame = pd.DataFrame(list(cm.Name.objects.all().values())).drop('id', axis=1)
names_frame['name'] = names_frame['name'].str.lower()
names_frame['gender'] = names_frame['gender'].replace('Male',0).replace('Female', 1)
names_list = names_frame['name'].values
names_dict = list(enumerate(set(list(reduce(lambda x, y: x + y, names_list)))))
names_frame['vectorized'] = names_frame['name'].apply(vectorize, args=(names_dict,))
names_frame.sample()

Я получаю следующее:

       gender   gender_count  name   vectorized
20129  1        276           meena  [1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, ...

Затем я строю модель и пытаюсь обучить ее:

X = names_frame['vectorized']
Y = names_frame['gender']
model = Sequential()
model.add(Dense(32, input_dim=1, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=150, batch_size=10)

И получаю следующее исключение:

ValueError: setting an array element with a sequence.

И names_frame['gender'].shape, и names_frame['vectorized'].shape являются (34325,)

По сути, я пытаюсь передать ему вектор и классификатор пола, но похоже, что-то не так с форматом ввода?X - это pandas.Series - я попытался преобразовать его в np.array, но это не помогло.

Параметр input_dim обозначает количество входных элементов, с которыми мне приходится работать в сети.У меня есть 1, так как я пытаюсь дать ему массив значений.Должен ли я дать его 26?Но когда я изменяю его на 26, это дает мне другое исключение:

ValueError: Error when checking input: expected dense_46_input to have shape (26,) but got array with shape (1,)

Это, вероятно, потому что я не даю ему 26 отдельных столбцов панд, я предполагаю - нужно ли мне преобразовывать мой массив вколонки или распаковать массив как нибудь?

1 Ответ

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

Простой пример:

from keras.models import Sequential
from keras.layers import Dense
import pandas as pd
import numpy as np

df = pd.DataFrame({"vectorized": [[1,0,0],[0,1,0],[0,0,1]],
                   "gender": [1,0,1]})

# convert the inner list to numpy array
# X = np.array([np.array(l) for l in df["vectorized"]])
# or use a simpler way:
X = np.vstack(df["vectorized"])
Y = df["gender"].values

model = Sequential()
# input_dim should be X.shape[1]
model.add(Dense(32, input_dim=3, activation='relu'))
model.add(Dense(8, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=150, batch_size=10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...