Вы используете неправильную потерю, среднеквадратическая ошибка - это потеря для регрессии, и у вас есть проблема классификации (дискретные выходы, а не непрерывные).
Таким образом, для этой модели ваша модель должна иметь выходной слой softmax :
model.add(Dense(N, activation="softmax"))
И вы должны использовать классификационные потери:
model.compile(optimizer=SGD(0.001), loss='sparse_categorical_crossentropy')
Предполагая, что ваши метки являются целыми числами в диапазоне [0, N-1]
(отключено на единицу), это должно работать. Чтобы сделать прогноз, вы должны сделать:
output = np.argmax(model.predict(some_data), axis=1) + 1
* +1
, потому что целочисленные метки go от 0
до N-1