Учусь создавать свои нейросети. Написал простенький очень нативный алгоритм по работе с нейросетью. Это консольная программа, суть которой в том, что при вводе значений активаций нейронов 1-ого слоя нейросети она выдает выходной результат - активации нейронов последнего слоя. Веса нейросети представлены json файлом, в нем есть 1 объект, в котором хранится многомерный массив с весами. При вводе чисел в консоль в формате 1, 0, 1 (у нейросети 3 входа (и 2 выхода)) сигналы перемножаются через веса, проходят через функцию активации и проходят через следующий слой весов и так до конца - собственно, обычный перцептрон.
Проблема: нейросеть при использовании на всех нейронах функции активации всегда выдает практически идентичный результат на выходном слое, а если не использовать функции активации - результат разный. Почему так и как сделать так, чтобы результат выполнения нейросети был, как и должно быть, разный при использовании функций активации?
Если что-то не понятно - просто запустите у себя код, и поймете, как все работает
Главный файл:
import numpy as np
import json
def sygm(x): #функция сигмоиды
return 1/(1 + np.exp(-x))
def calc(arr, wheights): #функция, возвращяющая массив чисел - результат перемножения входного вектора нейронов на матрицу весов
arr_1 = np.array(arr)
wheights_1 = np.array(wheights)
new_arr = wheights_1.dot(arr_1)
for i in range(len(new_arr)):
new_arr[i] = sygm(new_arr[i])
new_arr[i] = round(new_arr[i], 2)
return new_arr
def get_wheights(n): #функция, возвращяющая массив нейронов определенного слооя
with open("wheights.json", "r") as file:
res_text = file.read()
res_json = json.loads(res_text)
return res_json[str(n)]
def go_trought_the_network(inputs):
print("Значение входного слоя и его выходные веса", inputs, get_wheights(1))
layer_2 = calc(inputs, get_wheights(1))
print("Значение 2 слоя и его выходные веса", layer_2, get_wheights(2))
layer_3 = calc(layer_2, get_wheights(2))
print("Значение 3 слоя и его выходные веса", layer_3, get_wheights(3))
layer_4 = calc(layer_3, get_wheights(3))
print("Значение 4 слоя и его выходные веса", layer_4, get_wheights(4))
outputs = calc(layer_4, get_wheights(4))
print("Значение выходного слоя", outputs)
while 1: #главный цикл программы, постоянное считывание того, что приходит в консоль
inp = input()
print("Введенные данные", inp.split(', '))
arr = []
for i in range(len(inp.split(', '))): #перобразование массива входных строковых чисел в массив "численных" чисел
arr.append(float(inp.split(', ')[i]))
go_trought_the_network(arr)
Json файл с весами (они случайные) (сделан для удобства):
{
"1": [
[
-1.0,
0.1,
0.5
],
[
-0.7,
-0.6,
0.6
],
[
-0.7,
0.8,
-0.9
],
[
0.4,
-0.4,
-0.8
],
[
0.7,
0.1,
-1.0
]
],
"2": [
[
0.6,
-0.0,
0.5,
0.4,
-0.1
],
[
-0.8,
-0.2,
-0.8,
0.5,
-0.2
],
[
-0.2,
0.0,
0.5,
-0.5,
-0.3
]
],
"3": [
[
0.7,
-0.3,
-0.1
],
[
0.1,
0.6,
-0.2
],
[
0.4,
-0.5,
0.0
],
[
-0.3,
0.1,
-0.9
],
[
0.4,
0.9,
-0.1
]
],
"4": [
[
0.3,
-1.0,
-0.9,
-0.8,
0.5
],
[
-0.8,
-0.6,
0.0,
-0.2,
0.2
]
]
}