Нейронная сеть застряла на 0,75 или 0,25 потери - PullRequest
0 голосов
/ 04 марта 2019

Я работаю над школьным проектом и столкнулся со следующей проблемой.Я запрограммировал нейронную сеть на Python, которая может (должна) обнаруживать заболевания глаз (CNV, DME, Drusen и нормальный глаз).Для этого на моем компьютере есть папка с изображениями (20 000 на класс) пораженных и незатронутых глаз.Когда я начну тренировать сеть, потеря будет зависеть от 0,75 или 0,25.Не могли бы вы помочь мне?

У меня есть следующий код:

    import numpy as np     # library om gemakkelijker matrixberekeningen te noteren
    import cv2             # library die de afbeeldingen verwerkt
    #import os              # library die de gebruiker in staat stelt om een afbeelding of tekst in te vullen
    import random          # library die gebruikt wordt om het netwerk in de beginfase op te bouwen
    import os.path
    training_map_path = "C:\\Users\\debruss\\Pictures\\trainingmap3\\"

class Neural_Network(object):
  #initialiseert de afmetingen van het netwerk
  def __init__(self):
    #parameters van netwerk
    self.inputSize = 40000        #90000
    self.hiddenSize1 = 3000       #1500  2160
    self.hiddenSize2 = 1500        #175
    self.outputSize = 4

    #gewichten van de connecties
    #aan het begin worden deze gewichten random gegenereerd
    self.W1 = np.random.randn(self.inputSize, self.hiddenSize1)
    self.W2 = np.random.randn(self.hiddenSize1, self.hiddenSize2)
    self.W3 = np.random.randn(self.hiddenSize2, self.outputSize)

  #Netwerkberekening naar rechts: er wordt dus een afbeelding geïndexeerd
  def forward (self, X):
    self.z = np.dot(X, self.W1)        #Matrixvermenigvuldiging 
    self.z2 = self.sigmoid(self.z)
    self.z3 = np.dot(self.z2, self.W2)    #Matrixvermenigvuldiging 
    self.z4 = self.sigmoid(self.z3)
    self.z5 = np.dot(self.z4, self.W3)    #Matrixvermenigvuldiging 
    O = self.sigmoid(self.z5)
    #print("Output van forward(X):")
    #print(O)
    return O

  #Netwerkberekening naar links: er wordt teruggerekend om het netwerk te verbeteren
  def backward(self, X, y, O):
    self.o_error = y - O
    #print("Error van het netwerk vergeleken met het goede antwoord:")
    #print(self.o_error)
    self.o_delta = self.o_error * self.sigmoidPrime(O)

    #print("o_delta:")
    #print(self.o_delta)

    self.z4_error = self.o_delta.dot(self.W3.T)
    self.z4_delta = self.z4_error * self.sigmoidPrime(self.z4)

    #print("z4_error:")
    #print(self.z4_delta)

    self.z2_error = self.z4_delta.dot(self.W2.T)
    self.z2_delta = self.z2_error * self.sigmoidPrime(self.z2)

    #print("z2_error:")
    #print(self.z2_delta)

    X = X.reshape(1, 40000)
    self.z2_delta = self.z2_delta.reshape(1, 3000)

    self.z2 = self.z2.reshape(1, 3000)
    self.z4_delta = self.z4_delta.reshape(1, 1500)

    self.z4 = self.z4.reshape(1, 1500)
    self.o_delta = self.o_delta.reshape(1, 4)

    self.W1 += X.T.dot(self.z2_delta)
    self.W2 += self.z2.T.dot(self.z4_delta)
    self.W3 += self.z4.T.dot(self.o_delta)

  #Training initieren
  def train(self, X, y):
    O = self.forward(X)
    #O = np.ravel(O)
    #O = O.reshape(-1)
    #print(O)
    self.backward(X, y, O)

  #sigmoid functie
  def sigmoid(self, s):
    return 1/(1+np.exp(-s))

  #afgeleide van de sigmoid functie: hiermee wordt bepaald of een neuron zijn informatie doorgeeft
  def sigmoidPrime(self, s):
    return s.transpose() * (1 - s)

def imgProcessor(pad):
  img = cv2.imread(pad, cv2.IMREAD_GRAYSCALE)
  img = np.matrix(cv2.resize(img, (200,200))) + 1

  def rowtorow(toProcess):
    return toProcess

  j = np.apply_along_axis(rowtorow, axis = 1, arr=img)
  j = np.ravel(j)
  j = j.reshape(1, 40000)       # j = j.reshape(1, 90000).ravel()
  j = np.ravel(j)
  #print("De afbeelding:")    
  print(j)
  return j

def imgPicker():
  loc = ''
  fi = random.randint(1,5)

  if (fi == 0):
    while 'CNV' not in loc:
      loc = random.choice(os.listdir(training_map_path))

  if (fi == 1):
    while 'DME' not in loc:
      loc = random.choice(os.listdir(training_map_path))

  if (fi == 2):
    while 'DRUSEN' not in loc:
      loc = random.choice(os.listdir(training_map_path))

  if (fi == 3):
    while 'NORMAL' not in loc:
      loc = random.choice(os.listdir(training_map_path))

  while os.path.isfile(loc) == False:
    loc = random.choice(os.listdir(training_map_path))
    #print(loc)
    #print(training_map_path + loc)
    if os.path.isfile(training_map_path + loc):
      break

  print(training_map_path + loc)
  return training_map_path + loc
  #print(y)# pad naar de te verwerken afbeelding

def correctAnswer(Za):
  if 'CNV' in Za:                                                        # er wordt bepaald bij welke categorie de afbeelding hoort
                                                                            # dit om het netwerk later te controleren (y is het antwoord).
    y = np.array(([1, 0, 0, 0]), dtype=int)
  if 'DME' in Za:
    y = np.array(([0, 1, 0, 0]), dtype=int)
  if 'DRUSEN' in Za:
    y = np.array(([0, 0, 1, 0]), dtype=int)
  if 'NORMAL' in Za:
    y = np.array(([0, 0, 0, 1]), dtype=int)
  #print("Het goede antwoord is:")
  #print(y)
  return y

NN = Neural_Network()

# LET OP! NIET ZOMAAR OP DE RUN-KNOP DRUKKEN!!! DIT KAN HET NETWERK DOEN VASTLOPEN
q = 100                         # KIES HOE VAAK HET NETWERK MOET REKENEN
for i in range(q):
  Z = imgPicker()
  X = imgProcessor(Z) * 255
  y = correctAnswer(Z)

  NN.train(X, y)
  if (i % 10 == 0):
    print("Loss at " + str(i) + ": " + str(np.mean(np.square(y - NN.forward(X).transpose()))))  #np.mean(np.square())

print("W1: ")
print(np.squeeze(np.asarray(NN.W1)))
print("W2: ")
print(np.squeeze(np.asarray(NN.W2)))
print("W3: ")
print(np.squeeze(np.asarray(NN.W3)))

Заранее спасибо!

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