Значения нейронной сети Python сходятся до 50% - PullRequest
0 голосов
/ 02 января 2019

Я строю нейронную сеть для распознавания рукописных символов.Я никогда не создавал его раньше, и когда я обучаю свою сеть, все прогнозы сходятся до 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

Кто-нибудь знает, допустил ли я какую-то ошибку новичка, из-за которой мои результаты могут сходиться?Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...