为什么我的Keras模型只能产生相同的预测?

时间:2019-06-30 18:06:15

标签: python keras

我很难理解为什么我的Keras模型在生成适当结果时会遇到问题(现在总是返回0)。我已经找到了其他一些与此问题有关的问题(ref 1ref 2),但我无法理解根本原因。

问题:为什么我的模型只给出一个恒定的预测?

培训数据示例

最后一列是预测,0或1。

32856500,1,1,200,6842314460,0
32800000,-1,0,0,0,0
32800000,-1,1,0,6845343222,0
32800000,-1,2,0,13692319489,0
32800000,-1,3,0,20539336035,0
32769900,-1,4,-30100,27389628085,0
32769900,-1,5,-30100,34239941481,0
32750000,-1,6,-50000,41091099905,0
32750000,-1,7,-50000,47945852379,1

Keras培训准则

我正在使用sigmoid激活二进制结果。但是我不确定问题出在这里还是在binary_crossentropySGD优化器中。

def trainKerasModel(X, Y, path, dimensions):

    # Create model
    model = Sequential()
    model.add(Dense(120, input_dim=dimensions, activation='sigmoid'))
    model.add(Dense(100, activation='sigmoid'))
    model.add(Dense(80, activation='sigmoid'))
    model.add(Dense(60, activation='sigmoid'))
    model.add(Dense(40, activation='sigmoid'))
    model.add(Dense(20, activation='sigmoid'))
    model.add(Dense(12, activation='sigmoid'))
    model.add(Dense(10, activation='sigmoid'))
    model.add(Dense(8, activation='sigmoid'))
    model.add(Dense(6, activation='sigmoid'))
    model.add(Dense(4, activation='sigmoid'))
    model.add(Dense(2, activation='sigmoid'))
    model.add(Dense(1, activation='sigmoid'))

    # Compile model
    model.compile(loss='binary_crossentropy', optimizer=SGD(lr=0.01), metrics=['accuracy'])

    # Fit the model
    model.fit(X, Y, epochs=EPOCHS, batch_size=BATCHSIZE)

    # Evaluate
    scores = model.evaluate(X, Y)
    Helpers().Log(model.metrics_names[1], scores[1]*100)

    # Save model
    with open(path+".json", "w") as json_file:
        json_file.write(model.to_json())

    # serialize weights to HDF5
    model.save_weights(path+".h5")

    Helpers().Log("Saved model to disk")

someFilePath = "file.csv"
dataset = numpy.loadtxt(someFilePath, delimiter=",")
dimensions = len(dataset[0]) - 1
trainKerasModel(dataset[:,0:dimensions], dataset[:,dimensions], someFilePath, dimensions)

Keras预测代码

model = model_from_json(loaded_model_json)
model.load_weights(someWeightsFile)
Xnew = preprocess_input(numpy.array([[32856500,1,1,200,6842314460,0], [32800000,-1,3,0,20539336035,0], [32750000,-1,7,-50000,47945852379,1]]))
Ynew = model.predict_classes(Xnew)
print(Ynew)

1 个答案:

答案 0 :(得分:0)

12个sigmoid fc层将永远不会学任何东西。 阅读理论。  也许您可以尝试使用tanh尝试仅3层,如果在输入时使用tanh则不尝试。 -1代表假,1代表真。 也将tanh应用于输入数据,sincethey未标准化。如果只有一个输出,则交叉熵也没有意义。

再加上将5个输入扩展到120个要素,然后扩展到12层,这是可怕的过拟合。您应该在这里设置3层,例如〜20、16,10个项目,tanh,mse损失,ca 1e-3 1e-4学习率