Почему моя модель Keras только дает такой же прогноз? - PullRequest
0 голосов
/ 30 июня 2019

У меня возникли проблемы с пониманием, почему у моей модели Keras возникают проблемы с получением правильных результатов (теперь она всегда возвращает 0). Мне удалось найти некоторых других с этой проблемой ( ref 1 , ref 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_crossentropy или SGD.

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 голосов
/ 30 июня 2019

12 сигмоидальных слоев ФК никогда ничего не изучат. Читай теорию. Может быть, вы должны попробовать только 3 слоя с tanh, а не af если tanh на входе. -1 для ложного, 1 для истинного. Также примените tanh для ввода данных, так как они не нормированы. Также перекрестная энтропия не имеет смысла, если у вас есть только один выход.

плюс расширение 5 входных данных до 120 объектов, а затем 12 слоев - ужасное наложение. Здесь у вас должно быть 3 слоя, например, ~ 20, 16,10 предметов, тан, потеря mse, скорость обучения 1e-3 1e-4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...