我正在使用一些name:gender
数据来构建和训练可以预测性别的模型。当我阅读有关ML的文章时,我正在尝试一些基础知识,并且可能有很多错误。我尚未学习如何生成和提供我希望网络在其培训中使用的所有功能。此时,我正在尝试准备我的数据,并让keras接受它进行培训。
我正在尝试在名称中构建字典或字符,并将每个矢量化名称输入模型:
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个单独的熊猫列-我是否需要将数组转换为列或以某种方式解压缩数组?
答案 0 :(得分:1)
一个简单的例子:
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)