具有多个输出的Keras模型不会聚

时间:2018-01-18 15:51:44

标签: machine-learning neural-network keras

我很享受Keras提供的简单性,但是我没有成功配置具有多个输出的Keras回归模型。

更具体地说,我有一个Keras模型,它使用308列的X值和28个目标Y值。 (我认为)该模型非常简单,我认为它会很快收敛,但事实上并非如此。

我在这里猜测,但我认为我已经错误地设置了模型,并且正在寻找有关如何配置Keras模型以使其正常工作的帮助。

数据信息:

Number of rows: 46038
My input shape:  X_train: (46038, 308)
My target shape: Y_train: (46038, 28)

输入(X)是一系列浮点数,表示影响资源分配的值。目标是一系列浮点数(总和/总和为1.0,表示对特定资源的实际百分比分配)。我的目标是根据提供的输入(X)预测资源pct分配(Y)。因此,我认为这是一个回归问题,而不是分类问题(如果我错了,请纠正我)

示例数据:

X:  [100, 200, 400, 600, 32, 1, 0.1, 0.5, 2500...]  (308 columns, with 40000+ rows)
Y:  [0.333, 0.667, 0.0, 0.0, 0.0, ...]

在上述Y的情况下,这意味着0.333(33%)的资源被分配给第一个资源,0.667(67%)被分配给第二个资源而0.0被分配给所有其他资源)

型号:

model = Sequential()
model.add(Dense(256, input_shape=(308,) ))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(256, input_shape=(256,)))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(28))
model.compile(loss='mean_squared_error', optimizer='adam')

以下是一些具体问题:

1.  Is my model configured properly to achieve my goals?
2.  Should I have different activation functions?
3.  Are my input shapes (308,) setup properly? Are my output shapes (28) correct?
4.  Should I have an activation on my output layer (for example: model.add(Activation('softmax'))?  if yes, what type would be ideal?

(我认为它不是特别相关,但我使用的是Tensorflow后端)

1 个答案:

答案 0 :(得分:0)

model = Sequential()
model.add(Dense(256, input_shape=(308,) ))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(256, input_shape=(256,)))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(28, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam')

应该解决问题。虽然它看起来像一个回归问题,但是分配是相互竞争的,这使得它像分类一样,需要softmax非线性和分类 - 交叉丢失。

<强>更新

为了提前停止,您需要一个验证集和以下代码:

earlyStopping=keras.callbacks.EarlyStopping(monitor='val_loss', patience=0, verbose=0, mode='auto')
model.fit(X, y, batch_size=100, nb_epoch=100, verbose=1, callbacks=[earlyStopping], validation_split=0.0, validation_data=None, shuffle=True, show_accuracy=False, class_weight=None, sample_weight=None)

此外,您还需要定义一个new custom metric function,而不是精确度返回交叉熵损失。您可以将model.compile中的metric参数设置为此新函数。​​