Хорошо бы проверить, что при тренировке ошибок не сделали (не перепутаны ли входные данные, нормализованы ли они и т.д.). Например, если данные не нормализованы, и какая-нибудь малозначительная переменная принимает большие значения, то получится, что нейросеть будет в основном эту переменную учитывать, и результат будет зависеть почти только от нее (а т.к. на самом деле результат от нее не зависит, то для уменьшения ошибки сеть может «скатиться» к 0.5 или какому-то другому значению).
Дальше, вы пишете, что «округляли значения до 0 или 1» — ваши «кластеры значений» — это < 0.5 и > 0.5? «Кучкуются около 2 уровней» — около 0 и 1, или около каких-то других? Какой смысл имеют выходные переменные, там точно уровень имеет значение? ну там x1=0.1, x2=0.3, x3=1 и можно ли сказать, что в каком-то смысле x3 > x2 > x1, и что «еще немного, и x2 стал бы x1»? Если на самом деле там не непрерывная входная переменная, то можно попробовать заменить ее на несколько логических («вероятности принадлежности к кластерам значений») — в тренировочных данных они 0 или 1 будут, т.к. эти для тестовых данных известно, принадлежит значение к кластеру или нет (это то же самое, что вы сделали, или нет?).
Параметры сети (количество нейронов, функции активации) можно подбирать так, чтоб уменьшалась ошибка кросс-валидации (проверив в конце на неиспользованном наборе данных, что оверфиттинга по параметрам сети не случилось), но это уже детали.