diff --git a/Layer.cpp b/Layer.cpp index ae60067..da1b4ca 100644 --- a/Layer.cpp +++ b/Layer.cpp @@ -24,7 +24,7 @@ void Layer::setOutputValues(const std::vector & outputValues) void Layer::feedForward(const Layer &inputLayer) { - for (int neuronNumber = 0; neuronNumber < sizeWithoutBiasNeuron(); ++neuronNumber) + for (size_t neuronNumber = 0; neuronNumber < sizeWithoutBiasNeuron(); ++neuronNumber) { at(neuronNumber).feedForward(inputLayer.getWeightedSum(neuronNumber)); } diff --git a/gui/NeuroUI/NeuroUI.pro b/gui/NeuroUI/NeuroUI.pro index 2d4de34..5a88fef 100644 --- a/gui/NeuroUI/NeuroUI.pro +++ b/gui/NeuroUI/NeuroUI.pro @@ -13,8 +13,19 @@ TEMPLATE = app SOURCES += main.cpp\ - neuroui.cpp + neuroui.cpp \ + ../../Layer.cpp \ + ../../Net.cpp \ + ../../Neuron.cpp \ + netlearner.cpp -HEADERS += neuroui.h +HEADERS += neuroui.h \ + ../../Layer.h \ + ../../Net.h \ + ../../Neuron.h \ + netlearner.h FORMS += neuroui.ui + +RESOURCES += \ + icons.qrc diff --git a/gui/NeuroUI/icons.qrc b/gui/NeuroUI/icons.qrc new file mode 100644 index 0000000..807350d --- /dev/null +++ b/gui/NeuroUI/icons.qrc @@ -0,0 +1,2 @@ + + diff --git a/gui/NeuroUI/netlearner.cpp b/gui/NeuroUI/netlearner.cpp new file mode 100644 index 0000000..1dd73c8 --- /dev/null +++ b/gui/NeuroUI/netlearner.cpp @@ -0,0 +1,65 @@ +#include "netlearner.h" +#include "../../Net.h" + +void NetLearner::run() +{ + try + { + Net myNet({2, 3, 1}); + + size_t batchSize = 5000; + size_t batchIndex = 0; + double batchMaxError = 0.0; + double batchMeanError = 0.0; + + size_t numIterations = 1000000; + for (size_t iteration = 0; iteration < numIterations; ++iteration) + { + std::vector inputValues = + { + std::rand() / (double)RAND_MAX, + std::rand() / (double)RAND_MAX + }; + + std::vector targetValues = + { + (inputValues[0] + inputValues[1]) / 2.0 + }; + + myNet.feedForward(inputValues); + + std::vector outputValues = myNet.getOutput(); + + double error = outputValues[0] - targetValues[0]; + + batchMeanError += error; + batchMaxError = std::max(batchMaxError, error); + + if (batchIndex++ == batchSize) + { + QString logString; + + logString.append("Batch error ("); + logString.append(QString::number(batchSize)); + logString.append(" iterations, max/mean): "); + logString.append(QString::number(std::abs(batchMaxError))); + logString.append(" / "); + logString.append(QString::number(std::abs(batchMeanError / batchSize))); + + emit logMessage(logString); + + batchIndex = 0; + batchMaxError = 0.0; + batchMeanError = 0.0; + } + + myNet.backProp(targetValues); + } + } + catch (std::exception &ex) + { + QString logString("Error: "); + logString.append(ex.what()); + emit logMessage(logString); + } +} diff --git a/gui/NeuroUI/netlearner.h b/gui/NeuroUI/netlearner.h new file mode 100644 index 0000000..78e0131 --- /dev/null +++ b/gui/NeuroUI/netlearner.h @@ -0,0 +1,17 @@ +#ifndef NETLEARNER_H +#define NETLEARNER_H + +#include + +class NetLearner : public QThread +{ + Q_OBJECT + +private: + void run() Q_DECL_OVERRIDE; + +signals: + void logMessage(const QString &logMessage); +}; + +#endif // NETLEARNER_H diff --git a/gui/NeuroUI/neuroui.cpp b/gui/NeuroUI/neuroui.cpp index b2ebfab..800baf9 100644 --- a/gui/NeuroUI/neuroui.cpp +++ b/gui/NeuroUI/neuroui.cpp @@ -12,3 +12,36 @@ NeuroUI::~NeuroUI() { delete ui; } + +void NeuroUI::on_runButton_clicked() +{ + ui->logView->clear(); + + if (m_netLearner == nullptr) + { + m_netLearner.reset(new NetLearner); + } + + connect(m_netLearner.get(), &NetLearner::logMessage, this, &NeuroUI::logMessage); + + connect(m_netLearner.get(), &NetLearner::started, this, &NeuroUI::netLearnerStarted); + connect(m_netLearner.get(), &NetLearner::finished, this, &NeuroUI::netLearnerFinished); + + m_netLearner->start(); +} + +void NeuroUI::logMessage(const QString &logMessage) +{ + ui->logView->addItem(logMessage); + ui->logView->scrollToBottom(); +} + +void NeuroUI::netLearnerStarted() +{ + ui->runButton->setEnabled(false); +} + +void NeuroUI::netLearnerFinished() +{ + ui->runButton->setEnabled(true); +} diff --git a/gui/NeuroUI/neuroui.h b/gui/NeuroUI/neuroui.h index 65d4cd8..af2481f 100644 --- a/gui/NeuroUI/neuroui.h +++ b/gui/NeuroUI/neuroui.h @@ -3,18 +3,31 @@ #include +#include + +#include "netlearner.h" + namespace Ui { -class NeuroUI; + class NeuroUI; } class NeuroUI : public QMainWindow { Q_OBJECT +private: + std::unique_ptr m_netLearner; + public: explicit NeuroUI(QWidget *parent = 0); ~NeuroUI(); +private slots: + void on_runButton_clicked(); + void logMessage(const QString &logMessage); + void netLearnerStarted(); + void netLearnerFinished(); + private: Ui::NeuroUI *ui; }; diff --git a/gui/NeuroUI/neuroui.ui b/gui/NeuroUI/neuroui.ui index 4f32e25..325da06 100644 --- a/gui/NeuroUI/neuroui.ui +++ b/gui/NeuroUI/neuroui.ui @@ -6,8 +6,8 @@ 0 0 - 400 - 300 + 597 + 389 @@ -16,22 +16,19 @@ - + - - - Qt::Horizontal + + + 0 - - - 40 - 20 - + + false - +