Я следую this tutorial (раздел 6: «Связывание всех вместе»), с моим собственным набором данных. Я могу привести пример в учебное пособие, без проблем, с предоставленным образцом данных.Keras: Binary_crossentropy имеет отрицательные значения
Я получаю двоякую ошибку кросс-энтропии, которая является отрицательной, и никаких улучшений по мере продвижения эпох. Я уверен, что бинарная кросс-энтропия всегда должна быть положительной, и я должен увидеть некоторое улучшение в потере. Я урезал вывод образца (и кодовый вызов) ниже до 5 эпох. Другие, похоже, сталкиваются с подобными проблемами иногда при обучении CNN, но я не видел четкого решения в моем случае. Кто-нибудь знает, почему это происходит?
Пример вывод:
Creating TensorFlow device (/gpu:2) -> (device: 2, name: GeForce GTX TITAN Black, pci bus id: 0000:84:00.0)
10240/10240 [==============================] - 2s - loss: -5.5378 - acc: 0.5000 - val_loss: -7.9712 - val_acc: 0.5000
Epoch 2/5
10240/10240 [==============================] - 0s - loss: -7.9712 - acc: 0.5000 - val_loss: -7.9712 - val_acc: 0.5000
Epoch 3/5
10240/10240 [==============================] - 0s - loss: -7.9712 - acc: 0.5000 - val_loss: -7.9712 - val_acc: 0.5000
Epoch 4/5
10240/10240 [==============================] - 0s - loss: -7.9712 - acc: 0.5000 - val_loss: -7.9712 - val_acc: 0.5000
Epoch 5/5
10240/10240 [==============================] - 0s - loss: -7.9712 - acc: 0.5000 - val_loss: -7.9712 - val_acc: 0.5000
Моего код:
import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Dense
from keras.callbacks import History
history = History()
seed = 7
np.random.seed(seed)
dataset = np.loadtxt('train_rows.csv', delimiter=",")
#print dataset.shape (10240, 64)
# split into input (X) and output (Y) variables
X = dataset[:, 0:(dataset.shape[1]-2)] #0:62 (63 of 64 columns)
Y = dataset[:, dataset.shape[1]-1] #column 64 counting from 0
#print X.shape (10240, 62)
#print Y.shape (10240,)
testset = np.loadtxt('test_rows.csv', delimiter=",")
#print testset.shape (2560, 64)
X_test = testset[:,0:(testset.shape[1]-2)]
Y_test = testset[:,testset.shape[1]-1]
#print X_test.shape (2560, 62)
#print Y_test.shape (2560,)
num_units_per_layer = [100, 50]
### create model
model = Sequential()
model.add(Dense(100, input_dim=(dataset.shape[1]-2), init='uniform', activation='relu'))
model.add(Dense(50, init='uniform', activation='relu'))
model.add(Dense(1, init='uniform', activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
## Fit the model
model.fit(X, Y, validation_data=(X_test, Y_test), nb_epoch=5, batch_size=128)
В моем случае у меня был автозапуск с этой проблемой. Оказалось, что 4 из моих столбцов в моей матрице имели значения больше 1, тогда как остальные 284 столбца находились в диапазоне [0,1]. Сброс столбцов со значениями, превышающими 1 (с использованием их максимальных значений), исправил мою проблему. – shadi
Я тоже хочу поделиться своим делом. Я использую CNN U-Net для обучения сегментации изображения с помощью кросс-двоичной энтропии. Мне удалось преобразовать свои маски из True/False в 255/0, и это путало классификатор и вызвало отрицательные потери. –