Arhn - архитектура программирования

Выходы подхода нейронной сети с прямой связью 0

Я пытаюсь создать простую нейронную сеть с прямой связью в JavaScript, используя учебник, найденный здесь. Я считаю, что я правильно следовал руководству, так как когда я тренировал его с входной матрицей [[0,0,1],[0,1,1],[1,0,1],[1,1,1]] и матрицей решения [[0],[1],[1],[0]], сеть работала так, как ожидалось. Однако, когда я попытался обучить сеть, используя базу данных рукописных чисел MNIST и передав более крупные матриц все элементы в выходном массиве приближались к нулю. Я подозреваю, что это связано с точечным произведением входного массива и весами, возвращающими массив, заполненный большими числами, но мои попытки уменьшить эти числа привели к тому, что выходные данные приблизились к 1. Кто-нибудь сможет понять, что идет не так? Моя нейронная сеть имеет только один скрытый слой с 300 нейронами. Фрагмент кода ниже показывает методы для моей нейронной сети, потому что я считаю, что именно здесь я ошибаюсь, но если вы хотите увидеть всю мою беспорядочную, недокументированную программу, ее можно найти здесь. Я не знаком с математической библиотекой, которую использую, а это значит, что я создал некоторые из своих собственных методов, чтобы они соответствовали математическим методам.

  • multMatrices(a, b) возвращает произведение матриц a и b.
  • math.multiply(a, b) возвращает скалярное произведение двух матриц.
  • math.add(a, b) и math.subtract(a, b) выполняют сложение и вычитание матриц, и
  • transposeMatrix(a) возвращает транспонирование матрицы a.
  • setAll(a, b) выполняет операцию над каждым элементом матрицы a, будь то вставка элемента в сигмовидную функцию (1/(1 + a^-e)) в случае «сигмовидной» или сигмовидной производной функции ( a * (1-a)) в случае "sigmoidDerivitive" или приравняв его к случайному значению от 0 до 0,05 в случае "randomlow".

Я обнаружил, что установка весов со значением от 0 до 1 сохраняет потери на уровне 0,9, поэтому теперь я установил их, используя «randomlow».


function NeuralNetwork(x, y){
    //Initializing the neural network
    this.input = x;
    this.y = y;
    this.sizes = [this.input._size[1], 300, this.y._size[1]];
    this.layers = this.sizes.length - 1;
    this.lyrs = [this.input];
    this.weights = [];
    this.dweights = [];
    for(var i = 0; i < this.layers; i ++){
        this.weights.push(new math.matrix());
        this.weights[i].resize([this.sizes[i], this.sizes[i + 1]]);
        this.weights[i] = setAll(this.weights[i], "randomlow");
    }
    this.output = new math.matrix();
    this.output.resize(this.y._size);
};

NeuralNetwork.prototype.set = function(x, y){
    //I train the network by looping through values from the database and passing them into this function
    this.input = x;
    this.lyrs = [this.input];
    this.y = y;
};

NeuralNetwork.prototype.feedforward = function(){
    //Looping through the layers and multiplying them by their respective weights
    for(var i = 0; i < this.weights.length; i ++){
        this.lyrs[i + 1] = math.multiply(this.lyrs[i], this.weights[i]);
        this.lyrs[i + 1] = setAll(this.lyrs[i + 1], "sigmoid");
    }
    this.output = this.lyrs[this.lyrs.length - 1];
};

NeuralNetwork.prototype.backpropogate = function(){
//Backpropogating the network. I don't fully understand this part
this.antis = [
function(a, b, c){
    return(
    math.multiply(transposeMatrix(a[0]), multMatrices(math.multiply(multMatrices(math.multiply(math.subtract(b.y, b.output), 2), setAll(b.output, "sigmoidDerivitive")), transposeMatrix(c)), setAll(a[1], "sigmoidDerivitive")))
    );
},
function(a, b, c){
    return(
    math.multiply(transposeMatrix(a[0]), multMatrices(math.multiply(math.subtract(b.y, b.output), 2), setAll(b.output, "sigmoidDerivitive")))
    );
}];
this.input = [];
this.weightInput = 0;
for(var i = this.weights.length - 1; i >= 0; --i){
    this.input.unshift(this.lyrs[i]);
    this.weightInput = (i === this.weights.length - 1 ? 0 : this.weights[i + 1]);
    this.dweights[i] = this.antis[i](this.input, this, this.weightInput);
}
for(var i = 0; i < this.dweights.length; i ++){
this.weights[i] = math.add(this.weights[i], this.dweights[i]);
}
};

Как всегда, я ценю любое время, потраченное на решение моей проблемы. Если мой код непонятен, не беспокойтесь об этом. JavaScript, вероятно, не лучший язык для этой цели, но я не хотел следовать учебнику с тем же языком.

EDIT: Это потенциальный дубликат этот пост, на который был дан ответ. Если кто-то сталкивается с этой проблемой, они должны посмотреть, поможет ли ответ. На данный момент я не тестировал его с моей программой.


Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..