【问题标题】:Feeding vectorized data to keras将矢量化数据提供给 keras
【发布时间】:2019-02-15 06:15:41
【问题描述】:

我正在使用一些 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'].shapenames_frame['vectorized'].shape 都是 (34325,)

基本上,我正在尝试为其提供向量和性别分类器,但看起来输入格式有问题? Xpandas.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 个单独的 pandas 列 - 我是否需要将我的数组转换为列或以某种方式解压数组?

【问题讨论】:

  • 你能打印 names_frame['vectorized'].shape
  • names_frame['gender'].shapenames_frame['vectorized'].shape 都是 (34325,)

标签: python arrays pandas keras


【解决方案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)

【讨论】:

  • 您可以使用 \np.vstack(df['vectorized']) ,转换为数组:)
  • @NagaKiran 谢谢!我试图找到一个做同样事情的函数但失败了。
猜你喜欢
  • 1970-01-01
  • 2020-06-25
  • 2018-01-15
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 2013-03-30
相关资源
最近更新 更多