def load_matrix(matrix): r = matrix['rows'] c = matrix['columns'] values = matrix['values'] m = Matrix(r, c) m.values = values return m
def feedforward(self, input): output = input for i in range(len(self.weights)): # işlemleri gerçekleştirmeden önce girdiyi kaydediyoruz # output demesine bakma bir önceki katmanın çıtkısı bi sonrakinin girdisidir # eğitim sırasında girdinin transpoz edilmiş hali lazım olacak (backpropagation fonksiyonuna bakabilirsin) self.inputsForTrain[i] = output.transpose() # girdi i olmak üzere(burda output olarak isimlendirdim) f((i * w) + b) işlemi # gerçekleştirilir output = Matrix.matrix_product(self.weights[i], output) output.add(self.biases[i]) # çıtkıları aktive ediyoruz ki çıtkı değerleri 0-1 arasında olsun for y in range(output.rowCount): for x in range(output.columnCount): output.values[y][x] = NeuralNetwork.activation( output.values[y][x]) # yeni katmana geçmeden önce çıtkıyı kaydediyoruz self.outputsForTrain[i] = output.copy() # sinir ağından çıkan son veriyi dönderiyoruz return output
def think(self, boundaries): input = Matrix(9, 1) lidarData = self.get_lidar_data(boundaries) # input = # [ lidar 1 ] # [ lidar 2 ] # [ lidar 3 ] # ... # [ lidar 8 ] # [ self.velocity / max velocity ] for i in range(len(lidarData)): input.values[i][0] = lidarData[i] input.values[8][0] = self.velocity / Car.maxSpeed output = self.brain.feedforward(input) return output
def backpropagation(self, lr, friction, error): # sondan başa gittiğimiz için en son ağırlıklardan ve önyargılardan başlayacağiız i = len(self.weights) - 1 while i > -1: o = self.outputsForTrain[i] i_t = self.inputsForTrain[i] # sapmanın gradyanı = gradyan = compute_gradient() # ağırlığın gradyanı = gradyan x i_t gradient = NeuralNetwork.compute_gradient(lr, error.copy(), o) # ağırlıklar ve sapmalar gradyan(sistem ivmesi) bazında hesaplanır NeuralNetwork.momentum_update(self.Vbias[i], self.biases[i], gradient, friction) gradient = Matrix.matrix_product(gradient, i_t) NeuralNetwork.momentum_update(self.Vweight[i], self.weights[i], gradient, friction) # bir sonraki katman için hataları hazırlıyoruz w_t = self.weights[i].transpose() error = Matrix.matrix_product(w_t, error) i -= 1
def get_input_for_bird(bird): input = Matrix(5, 1) # input = # [ closestColumn.upRect.x / screenW ] # [ closestColumn.lowerLimitOfUpRect / screenH ] # [ closestColumn.downRect.y / screenH ] # [ bird.rect.y / screenH ] # [ bird.velocity.y ] input.values[0][0] = closestColumn.upRect.x / screenW input.values[1][0] = closestColumn.lowerLimitOfUpRect / screenH input.values[2][0] = closestColumn.downRect.x / screenH input.values[3][0] = bird.rect.y / screenH input.values[4][0] = bird.velocityY / bird.maxSpeed return input
def __init__(self, inputNeuronC, outputNeuronC, hiddenNeuronPerLayerC, hiddenLayerC): self.weights = [] self.biases = [] # sgd + momentum optimizasyonu için # ağırlık ve sapmaların değişim hızlarını kayıt ediyoruz # burdaki matrislerin boyutları karşılık gelen ağırlık-sapmalarıyla aynı olacak self.Vweight = [] self.Vbias = [] # gradient decent metotdu ile eğitirken her katmanın girdi(input) # ve çıktıları(output) lazım olacak bu yüzden bunları kayıt altına # alıp güncellemek için özel listeler hazırlıyoruz self.inputsForTrain = [] self.outputsForTrain = [] # ağırlık ve sapmalar verilen kurala görre ayarlanır: # weight = Matrix(next_layer_neuronC, previus_layer_neuronC) # bias = Matrix(next_layer_neuronC, 1) # input - hidden self.weights.append(Matrix(hiddenNeuronPerLayerC, inputNeuronC)) self.biases.append(Matrix(hiddenNeuronPerLayerC, 1)) self.Vweight.append(Matrix(hiddenNeuronPerLayerC, inputNeuronC)) self.Vbias.append(Matrix(hiddenNeuronPerLayerC, 1)) # hidden - hidden for i in range(hiddenLayerC - 1): # kaç saklı katman varsa onun 1 eksiği kadar aralarında ağırlık ve sapma vardır self.weights.append( Matrix(hiddenNeuronPerLayerC, hiddenNeuronPerLayerC)) self.biases.append(Matrix(hiddenNeuronPerLayerC, 1)) self.Vweight.append( Matrix(hiddenNeuronPerLayerC, hiddenNeuronPerLayerC)) self.Vbias.append(Matrix(hiddenNeuronPerLayerC, 1)) # hidden - output self.weights.append(Matrix(outputNeuronC, hiddenNeuronPerLayerC)) self.biases.append(Matrix(outputNeuronC, 1)) self.Vweight.append(Matrix(outputNeuronC, hiddenNeuronPerLayerC)) self.Vbias.append(Matrix(outputNeuronC, 1)) for i in range(hiddenLayerC + 1): # nöron ağdaki bütün katman sayısı kadar "inputsForTrain" ve "outputsForTrain" # değişkenlerine null mabında 0 değerini veriyoruz # not: # zaten feedforward sürecinde bu değişkenler değişeceği için 0 olması hataya sebep olmayacak # lakin indislerle işlem yapabilmek adına listede hazırda eleman olması gerekir self.inputsForTrain.append(0) self.outputsForTrain.append(0) self.randomize_weight_and_biases()
def rotate_geometry(self, angle): # rotation_matrix = Matrix(2, 2) a = math.radians(angle) rotation_matrix = Matrix(2, 2) # rotasyon matrisi hazırlanır rotation_matrix.values[0][0] = math.cos(a) rotation_matrix.values[0][1] = -math.sin(a) rotation_matrix.values[1][0] = math.sin(a) rotation_matrix.values[1][1] = math.cos(a) for i in range(len(self.geometry)): # ağırlık merkezi cx = self.loc[0] cy = self.loc[1] input = Matrix(2, 1) x = self.geometry[i][0] - cx y = self.geometry[i][1] - cy input.values[0][0] = x input.values[1][0] = y output = Matrix.matrix_product(rotation_matrix, input) newX = output.values[0][0] + cx newY = output.values[1][0] + cy self.geometry[i] = newX, newY
def __init__(self, inputNeuronC=1, outputNeuronC=1, hiddenNeuronPerLayerC=0, hiddenLayerC=0): # BU ALAN DENEYSELDİR DEĞİŞEBİLİR # hiç parametre verilmemiş ise hiç birşey yapmiyacak # amacı ise json verisinden yüklenmek istenirse boşuna başlangıç # verileri oluşturulmasın if inputNeuronC + outputNeuronC + hiddenNeuronPerLayerC + hiddenLayerC == 2: self.inputsForTrain = [] self.outputsForTrain = [] return # parametre oygunluğu kontrol edilir if inputNeuronC < 1 or outputNeuronC < 1 or hiddenNeuronPerLayerC < 0 or hiddenLayerC < 0: raise Exception('çıktı ve girdi nöronları 1, diğeri 0 dan küçük olamaz') # BU ALAN DENEYSELDİR DEĞİŞEBİLİR # kontrol sonrası oluşturma işlemleri başlatılır self.weights = [] self.biases = [] # sgd + momentum optimizasyonu için # ağırlık ve sapmaların değişim hızlarını kayıt ediyoruz # burdaki matrislerin boyutları karşılık gelen ağırlık-sapmalarıyla aynı olacak self.Vweight = [] self.Vbias = [] # gradient decent metotdu ile eğitirken her katmanın girdi(input) # ve çıktıları(output) lazım olacak bu yüzden bunları kayıt altına # alıp güncellemek için özel listeler hazırlıyoruz self.inputsForTrain = [] self.outputsForTrain = [] # ağırlık ve sapmalar verilen kurala görre ayarlanır: # weight = Matrix(next_layer_neuronC, previus_layer_neuronC) # bias = Matrix(next_layer_neuronC, 1) # input - hidden self.weights.append(Matrix(hiddenNeuronPerLayerC, inputNeuronC)) self.biases.append(Matrix(hiddenNeuronPerLayerC, 1)) self.Vweight.append(Matrix(hiddenNeuronPerLayerC, inputNeuronC)) self.Vbias.append(Matrix(hiddenNeuronPerLayerC, 1)) # hidden - hidden for i in range(hiddenLayerC - 1): # kaç saklı katman varsa onun 1 eksiği kadar aralarında ağırlık ve sapma vardır self.weights.append(Matrix(hiddenNeuronPerLayerC, hiddenNeuronPerLayerC)) self.biases.append(Matrix(hiddenNeuronPerLayerC, 1)) self.Vweight.append(Matrix(hiddenNeuronPerLayerC, hiddenNeuronPerLayerC)) self.Vbias.append(Matrix(hiddenNeuronPerLayerC, 1)) # hidden - output self.weights.append(Matrix(outputNeuronC, hiddenNeuronPerLayerC)) self.biases.append(Matrix(outputNeuronC, 1)) self.Vweight.append(Matrix(outputNeuronC, hiddenNeuronPerLayerC)) self.Vbias.append(Matrix(outputNeuronC, 1)) for i in range(hiddenLayerC + 1): # nöron ağdaki bütün katman sayısı kadar "inputsForTrain" ve "outputsForTrain" # değişkenlerine null mabında 0 değerini veriyoruz # not: # zaten feedforward sürecinde bu değişkenler değişeceği için 0 olması hataya sebep olmayacak # lakin indislerle işlem yapabilmek adına listede hazırda eleman olması gerekir self.inputsForTrain.append(0) self.outputsForTrain.append(0) self.randomize_weight_and_biases()