Я пытаюсь решить проблему XOR: < /p>
Код: Выделить всё
| i0 | i1 | desired output |
----------------------------
| 0 | 0 | 0 |
| 1 | 0 | 1 |
| 0 | 1 | 1 |
| 1 | 1 | 0 |
< /code>
С моим текущим кодом я запускаю все 4 записи выше в одну эпоху. Затем я повторяю эпоху 20 000 раз. Я рассчитываю ошибку после каждой записи, а не каждую эпоху, и я возвращаю ошибку в это же время. < /P>
Я использую только сигмоид в выходном слое Поймите, я хочу результат между 0
Моя сеть, большую часть времени сходится. В других случаях это не так. >
Я пытался случайным образом генерировать веса между 0 и 1 , а также между -1 и 1 с использованием равномерного распределения. Я пытался использовать инициализацию Ксавье как равномерное и нормальное распределение. Ничто из этого, кажется, не предотвращает сходимость сети. Я пробовал различные комбинации функции активации и генерации веса. < /P>
Вот мой полный код: < /p>
#include
#include
#include
#include
#include
#include
#include
#include
typedef float DataType;
typedef DataType (*ActivationFuncPtr)(const DataType&);
const DataType learningRate = std::sqrt(2.f);
const DataType momentum = 0.25f;
const std::size_t numberEpochs = 20000;
DataType sigmoid(const DataType& x)
{
return DataType(1) / (DataType(1) + std::exp(-x));
}
DataType sigmoid_derivative(const DataType& x)
{
return x * (DataType(1) - x);
}
DataType relu(const DataType& x)
{
return x
Подробнее здесь: https://stackoverflow.com/questions/583 ... al-network