Numpy Matrixen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Hallo,
mein Ziel ist es in dieser Zeile
hidden = matrix.Matrix.statscale(self.weights_ih, inputs)
eine neue Matrix zu erzeugen in dem ich 2 andere Multipliziere. Allerdings bekomme ich dabei diesen Fehler hier:
AttributeError: 'Matrix' object has no attribute 'shape'
Weiß hier jemand was ich falsch mache?

main:

Code: Alles auswählen

import nn
import matrix

def main():
    neuralnetwork = nn.Nn(2, 2, 1)

    inputs = [2, 2]
    
    output = neuralnetwork.feedforward(inputs);
    print(output)
    
main()
matrix:

Code: Alles auswählen

import numpy as np


class Matrix:

    def __init__(self, values):
        self.matrix = np.zeros(shape=(values))
        self.values = values

    def __repr__(self):
        return f'{self.__class__.__name__}({self.matrix!r})'

    def get_values(values):
        m = np.array(values)
        m.transpose()
        return m
    
    @property
    def rows(self):
        return self.values.shape[0]
    
    @property
    def cols(self):
        return self.values.shape[1]
                   
    def randomize(self):
        self.matrix = np.random.uniform(-1, 1, self.matrix.shape)
        return self.matrix
    
    def add(self, other):
        self.matrix += other
        return self.matrix

    def scale(self, factor):
        if isinstance(factor, (Matrix, np.ndarray)):
            if (self.matrix.shape[1] == factor.shape[0]):
                self.matrix = self.matrix.dot(factor)
            elif (self.matrix.shape[1] == factor.shape[1] and self.matrix.shape[0] == factor.shape[0]):
                self.matrix *= factor
            else:
                print('Warning: Columms of A must match rows of B') 
        else:
            self.matrix *= factor
        return self.matrix

    def statscale(m, factor):
        if isinstance(factor, np.ndarray):
            if (m.shape[1] == factor.shape[0]):
                m = self.matrix.dot(factor)
            elif (m.shape[1] == factor.shape[1] and m.shape[0] == factor.shape[0]):
                m *= factor
            else:
                print('Warning: Columms of A must match rows of B') 
        else:
            m *= factor
        return m

    def transpose(self) :
        self.matrix = np.transpose(self.matrix)
        return self.matrix
        
    @classmethod
    def from_shape(cls, rows, cols):
        return cls(np.zeros((rows, cols), int))
nn:

Code: Alles auswählen

import matrix
import math
import numpy as np

def sigmoid(x):
    return 1 / (1 + math.exp(-x))

class Nn:

    def __init__(self, input_nodes, hidden_nodes, output_nodes):
        self.input_nodes = input_nodes
        self.hidden_nodes = hidden_nodes
        self.output_nodes = output_nodes

        self.weights_ih = matrix.Matrix([self.hidden_nodes, self.input_nodes])
        self.weights_ho = matrix.Matrix([self.output_nodes, self.hidden_nodes])
        self.weights_ih.randomize()
        self.weights_ho.randomize()
        
        bias_h_val = []
        for x in range(self.hidden_nodes):
            bias_h_val.append(np.random.uniform(-1, 1))

        bias_o_val = []
        for x in range(self.output_nodes):
            bias_o_val.append(np.random.uniform(-1, 1))

        self.bias_h = matrix.Matrix.get_values(bias_h_val)
        self.bias_o = matrix.Matrix.get_values(bias_o_val)

    def feedforward(self, input_array):
        # Generate Hidden Outputs
        inputs = matrix.Matrix.get_values(input_array)
        hidden = matrix.Matrix.statscale(self.weights_ih, inputs)
        hidden.add(self.bias_h)
        #activation function
        hidden.map(sigmoid)

        output = matrix.Matrix.statscale(self.weights_ho, hidden)
        output.add(self.bias_o)
        output.map(sigmoid)
        output.toArray()
        
        return output
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie schon beim letzten mal ausfuehrlich diskutiert ist dein Vorgehen nicht sinnvoll. Du baust dir muehselig eigene Matrix-Klassen, die innendrin dann eine numpy-Matrix vorhalten. Und jetzt versuchst du die so zu verwenden, als ob es eine numpy-Matrix waere. Und das geht halt nicht. Spar dir deine komplette Klasse Matrix, und benutz numpy. Dann klappt das auch.

Und die Mehrzahl von Matrix ist Matrizen.
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Die Klasse Matrix arbeitet ja mit numpy und soll nur Funktionen die ich öfters brauche vereinfachen.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ja, nur das tut sie halt nicht. Sie verwirrt dich, und du begreifst offensichtlich nicht, wann du was wie verwenden sollst. Deine diversen Probleme der letzten Wochen hatten alle damit zu tun, das diese Klasse eigentlich nur im Weg ist. Das ist dir auch diverse male gesagt worden. Wenn du hier um Hilfe bittest, warum ignorierst du sie dann?

Hier zB hat __blackjack__ dich schon darauf hingewiesen:

viewtopic.php?f=30&t=45263#p343523

Und nochmal:

viewtopic.php?f=30&t=45263#p343580

Und ich sag's dir hier halt nochmal: das bringt nichts.

Deine Matrix-Klasse hat einen ganzen Sack voll Fehler. Da fehlen self-Argumente, da bezeichnest du eine Eigenschaft, welche die Form der Matrix beschreibt als "values", und so weiter und so fort.

Du machst dir das Leben NICHT einfacher damit. Wirklich nicht. Benutz einfach direkt die numpy-Objekte und Funktionen, und wenn du etwas hast, das wirklich sinnvoll ist, dann schreib es dir als frei stehende Funktion. Das verwirrt dich dann nicht mit dem Zustand des Objektes und den uebergebenen Argumenten, die du da munter durcheinander wuerfelst.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nachtrag: du rufst auch bestaendig Methoden von Matrix direkt als Klassen-Methoden auf, und NICHT wie sie eigentlich gedacht sind als Instanz-Methoden. Oder wenn sie anders gedacht *waeren*, dann muessten sie eben einen @classmethod oder @staticmethod Dekorator haben, und damit greift wieder, was ich vorher sagte: schreib stattdessen einfach eine Funktion.

Du hast offensichtlich noch nicht wirklich verstanden, was ein Objekt ist, und was der Unterschied von

Code: Alles auswählen

meinmodul.MeineKlasse.methode()
zu

Code: Alles auswählen

objekt = meinmodul.MeineKlasse()
objekt.methode()
ist. Das ist wirklich das 1*1 der OO-Programmierung in Python, und mE muss das sitzen, wenn man sich an groessere Dinge wagt.
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Ich bitte ja um Hilfe das ich die Fehler sehe und dann beheben kann. Das mit der Matrix Klasse soll auch eine Übung zur OO-Programmierung für mich sein. Deshalb versuche ich eigentlich hier mit dieser Klasse weiter zu machen.

Das mit den Instanzen hab ich eigentlich nach meinem letzten Post, überall wo ich gesehen habe das es falsch ist, geändert.
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ok, es ist offensichlich aussichtslos dich von deinem Weg abzubringen.

Nein, du hast NICHT ueberall alles geaendert. Oben in deinem Code steht

matrix.Matrix.get_values(bias_h_val)

Was glaubst du was das tut? Ist das eine Instanz-Methode, oder ist das eine Klassenmethode? Und welches von diesen beiden sollte es deiner Meinung nach sein?
Hypec
User
Beiträge: 183
Registriert: Mittwoch 1. August 2018, 16:11

Oke das stimmt wobei die auch in der Klasse Falsch ist und eigentlich außerhalb der Klasse als einzelne Funktion stehen sollte.
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Schau mal in dein Postfach
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten