Я строю нейронную сеть для распознавания рукописных символов.Я никогда не создавал его раньше, и когда я обучаю свою сеть, все прогнозы сходятся до 50%.
Когда я запускаю свой код, частота ошибок уменьшается, пока он не начинает сходиться около 0,5, тогда прогнозы для всех21 символ равен 0,5.
Моя нейронная сеть довольно проста:
- Она имеет 3 слоя (вход, 1 скрыт, вывод)
- Входной слойимеет 400 входов, по 1 на каждый пиксель (20х20 изображений)
- Скрытый слой содержит 21 нейрон
- Выходной слой содержит 21 нейрон (по 1 на каждый символ)
import numpy as np
import glob
import csv
np.random.seed(0)
# Pixel values for 'C', represents 20x20 image of a 'C'
input1 = np.array([[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,00,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,0,1,1,0,0,0,1,1,0,0,0,0,0,0,00,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,00,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]])
# 21 possible outputs, a 1 in labels[9] represents a 'C'
labels = np.array([[0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0]])
# 400 inputs, 1 for each pixel (20x20 images)
w1 = 2*np.random.random((400,21)) - 1
# 21 nodes in hidden layer
w2 = 2*np.random.random((21,21)) - 1
# 21 output nodes (I have to differentiate between 21 symbols)
w3 = 2*np.random.random((21,21)) - 1
learning_rate = 0.01
l1_bias = np.random.rand(1)
l2_bias = np.random.rand(1)
def sigmoid(x):
x = np.clip( x, -500, 500 )
return 1/(1+np.exp(-x))
def sigmoid_der(x):
return sigmoid(x)*(1-sigmoid(x))
# Learning part
for x in range(1000):
# Feed-forward part
input = input1
# Multiply input by weights
l1 = np.dot(input, w1)
# Add bias
l1 += l1_bias
# Squish with sigmoid
l1 = sigmoid(l1)
# Repeat for other layers
l2 = np.dot(l1, w2)
l2 += l2_bias
l2 = sigmoid(l2)
l3 = np.dot(l2, w3)
l3 = sigmoid(l3)
# l3 is output layer
# Backward propagation
# Calculate error
error = 1 / 2 * ((labels - l3.T) ** 2)
# Calculate adjustment for weights for each layer using error and sigmoid_der
w3_adjustment = np.dot(l2.T, (error * sigmoid_der(l3.T)).T)
w2_adjustment = np.dot(l1.T, (error * sigmoid_der(l2.T)).T)
w1_adjustment = np.dot(input.T, (error * sigmoid_der(l1.T)).T)
# Adjust weights
w3 = w3 - w3_adjustment * learning_rate
w2 = w2 - w2_adjustment * learning_rate
w1 = w1 - w1_adjustment * learning_rate
Кто-нибудь знает, допустил ли я какую-то ошибку новичка, из-за которой мои результаты могут сходиться?Спасибо!