Этот код реализует простую нейронную сеть, которая учится складывать два числа.
Структура сети:
Входной слой: 2 нейрона (для двух входных чисел)
Скрытый слой: 4 нейрона
Выходной слой: 1 нейрон (для суммы)
Основные части кода:
a) Определение классов и структур:
"信号の量子" (Нейрон): представляет отдельный нейрон с весами и смещением
"信号伝搬層" (Слой): представляет слой нейронов
b) Функции:
"最上層" (Прямое распространение): вычисляет выход сети
"信号伝播" (Обратное распространение): обучает сеть, корректируя веса
c) Функция main():
Создает и инициализирует сеть
Обучает сеть на 50000 случайных примерах
Позволяет пользователю вводить числа для проверки работы сети
Процесс работы:
Сеть обучается на случайных примерах сложения
После обучения пользователь может вводить два числа
Сеть пытается предсказать их сумму
Программа выводит предсказание сети и реальную сумму для сравнения
Особенности:
Использует случайные числа для инициализации и обучения
Применяет простую функцию активации (ReLU) в скрытом слое
Использует линейную функцию в выходном слое
Чтобы убрать #define, нужно заменить все определенные имена на их значения по всему коду. Например, заменить "入力サイズ" на 2, "中間信号サイズ" на 4, и так далее. Также нужно убрать нестандартные названия для стандартных типов и функций, например, заменить "分数" на "double", "拡張可能なアレイ" на "vector" и т.д.
#include <iostream>
#include <vector>
#include <random>
using namespace std;
random_device rd;
mt19937 gen(rd());
uniform_real_distribution<> dist(0.0, 1.0);
double activation(double x) {
return x > 0 ? x : 0;
}
double activationDerivative(double x) {
return x > 0 ? 1 : 0;
}
double linear(double x) {
return x;
}
class Neuron {
public:
vector<double> weights;
double bias;
Neuron() {}
Neuron(int inputSize) {
weights.resize(inputSize);
for (int i = 0; i < inputSize; i++) {
weights[i] = dist(gen);
}
bias = dist(gen);
}
};
class Layer {
public:
vector<Neuron> neurons;
int size;
Layer(int size, int inputSize) : size(size) {
neurons.resize(size);
for (int i = 0; i < size; i++) {
neurons[i] = Neuron(inputSize);
}
}
};
vector<double> forwardPropagation(const Layer& hiddenLayer, const Layer& outputLayer, const vector<double>& input) {
vector<double> hiddenOutput(4);
for (int i = 0; i < 4; i++) {
double sum = hiddenLayer.neurons[i].bias;
for (int j = 0; j < 2; j++) {
sum += hiddenLayer.neurons[i].weights[j] * input[j];
}
hiddenOutput[i] = activation(sum);
}
vector<double> output(1);
for (int i = 0; i < 1; i++) {
double sum = outputLayer.neurons[i].bias;
for (int j = 0; j < 4; j++) {
sum += outputLayer.neurons[i].weights[j] * hiddenOutput[j];
}
output[i] = linear(sum);
}
return output;
}
void backPropagation(Layer& hiddenLayer, Layer& outputLayer, const vector<double>& input, const vector<double>& target, const vector<double>& hiddenOutput, const vector<double>& output) {
vector<double> outputError(1);
for (int i = 0; i < 1; i++) {
outputError[i] = (target[i] - output[i]) * 1;
}
vector<double> hiddenError(4);
for (int i = 0; i < 4; i++) {
double sum = 0;
for (int j = 0; j < 1; j++) {
sum += outputError[j] * outputLayer.neurons[j].weights[i];
}
hiddenError[i] = sum * activationDerivative(hiddenOutput[i]);
}
for (int i = 0; i < 1; i++) {
for (int j = 0; j < 4; j++) {
outputLayer.neurons[i].weights[j] += 0.01 * outputError[i] * hiddenOutput[j];
}
outputLayer.neurons[i].bias += 0.01 * outputError[i];
}
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 2; j++) {
hiddenLayer.neurons[i].weights[j] += 0.01 * hiddenError[i] * hiddenLayer.neurons[i].weights[j];
}
hiddenLayer.neurons[i].bias += 0.01 * hiddenError[i];
}
}
int main() {
Layer hiddenLayer(4, 2);
Layer outputLayer(1, 4);
for (int i = 0; i < 50000; i++) {
vector<double> input(2);
for (int j = 0; j < 2; j++) {
input[j] = dist(gen);
}
vector<double> target(1);
target[0] = input[0] + input[1];
vector<double> output = forwardPropagation(hiddenLayer, outputLayer, input);
vector<double> hiddenOutput = forwardPropagation(hiddenLayer, outputLayer, input);
backPropagation(hiddenLayer, outputLayer, input, target, hiddenOutput, output);
if (i == 0) {
cout << "Program started successfully." << endl;
}
else if (i % 1000 == 0 && i != 0) {
cout << "Current iteration: " << i << endl;
}
}
cout << "Training cycle completed. Total iterations: " << 50000 << endl;
double number1, number2;
for (;;) {
cout << endl << "Enter the first number: ";
cin >> number1;
while (number1 < 0) {
cout << "This program cannot work with negative numbers";
cin >> number1;
}
cout << "Enter the second number: ";
cin >> number2;
while (number2 < 0) {
cout << "This program cannot work with negative numbers";
cin >> number2;
}
vector<double> input(2);
input[0] = number1;
input[1] = number2;
vector<double> output = forwardPropagation(hiddenLayer, outputLayer, input);
cout << endl << "Approximate sum: " << output[0] << endl;
cout << "Rounded sum: " << round(output[0]) << endl;
cout << "Actual sum: " << number1 + number2 << endl << endl;
}
}