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 load_matrix(matrix): r = matrix['rows'] c = matrix['columns'] values = matrix['values'] m = Matrix(r, c) m.values = values return m
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 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 __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 __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()