【问题标题】:How do I make keras predict something other than a one-hot matrix?我如何让 keras 预测除 one-hot 矩阵以外的东西?
【发布时间】:2017-07-16 13:51:51
【问题描述】:

我有一个包含 122 个唯一值的字典。我正在为程序提供超过 45,000 条记录和 33 个数据点,以便在预测输出应该是什么时参考。我注意到它只是预测[[1.]...]。我需要它来预测 1's 2's 3's ... 直到 122。所有都是浮点数,所以我不知道这是否重要。

这是我的代码-

Y = faults['FAILMODE']
del faults['FAILMODE']
X = faults

len(Y.FAILMODE.unique())
122

这就是我打算将输出与实际字符串值(如“Exhaust”)相关联的方式

classes = {}
n = 1.
for u in Y:
    if u not in classes:
        classes[n] = u
        n += 1.
    else:
        n += 1.

我使用它来将所有数据转换为 DataFrame 中的唯一浮点数。

for col in X:
    values = pd.Series(X[col])
    X[col] = (values.factorize()[0]+1).astype('float')

Y = (Y.factorize()[0]+1).astype('float')

Y = pd.DataFrame(Y, columns = ['FAILMODE'])

X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.33)

X_train = X_train.as_matrix()
X_test = X_test.as_matrix()
Y_train = Y_train.as_matrix()
Y_test = Y_test.as_matrix()

model = Sequential()
model.add(Dense(12, input_dim=7, init='uniform', activation='relu'))
model.add(Dense(7, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(X_train, Y_train, nb_epoch=150, batch_size=10)

predictions = model.predict(X_test)
print predictions[:20
[[ 1.]
 [ 1.]
 [ 1.]
 [ 1.]
 [ 1.]
 [ 1.]
 [ 1.]
 [ 1.]
 [ 1.]
 [ 1.]
 [ 1.]
 [ 1.]]

感谢您的帮助!

【问题讨论】:

  • 这是分类吗?
  • 是的。我还做了所有事情来更改训练和测试数据to_categorical,但我现在遇到了数据形状的问题。

标签: python pandas numpy keras


【解决方案1】:

这种情况你的模型不对,改成:

model = Sequential()
model.add(Dense(12, input_dim=7, init='uniform', activation='relu'))
model.add(Dense(7, init='uniform', activation='relu'))
model.add(Dense(122, init='uniform', activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

并确保使用函数 keras.utils.np_utils.to_categorical 对输入数据进行 one-hot 编码。然后模型应该训练。

然后为了恢复整数类索引,当你用模型预测时,你取输出概率分布的 argmax,这样你就得到了概率最大的数组索引。

x = some test point.
y = model.predict(x)[0]

class = np.argmax(y)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-21
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 2018-03-30
    • 2020-08-16
    • 2021-12-05
    相关资源
    最近更新 更多