我很享受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后端)
答案 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参数设置为此新函数。