Als Übung von Chainer habe ich ein einfaches lineares Trennungsproblem ausprobiert.
Ich möchte eine Funktion lernen, um festzustellen, ob ich fettleibig bin oder nicht, indem ich Größe (cm), Gewicht (kg) und Brustumfang (cm) eingebe. Fettleibigkeit wird hier jedoch als BMI (Gewicht geteilt durch Größe im Quadrat) von 25 oder mehr definiert. Daher sind Informationen zu Gewicht und Größe ausreichend, um festzustellen, ob der Patient fettleibig ist oder nicht, und Informationen zum Brustumfang sind nicht erforderlich. Kann das diesmal hergestellte Lerngerät dann feststellen, ob es fettleibig ist oder nicht, indem es sich nur auf Größe und Gewicht konzentriert, ohne durch die Informationen auf dem Brustumfang verwirrt zu werden?
Ich habe Dummy-Daten in Excel erstellt. Die Flaggen für Größe, Gewicht, Brustumfang und Fettleibigkeit sind in einer durch Leerzeichen getrennten Linie angeordnet. Größe, Gewicht und Brustumfang wurden jeweils durch Hinzufügen einer normalen Zufallszahl mit einer angemessenen Varianz zum Durchschnittswert von Männern erzeugt. Das Adipositas-Flag wurde auf 1 gesetzt, wenn der aus Größe und Gewicht berechnete BMI 25 oder mehr betrug. Wir haben 1000 davon unabhängig voneinander hergestellt, 900 davon zum Lernen und 100 zur Bewertung.
Größe Gewicht Brustumfang Fettleibigkeitsflagge
152.5110992 70.64096855 76.24909648 1
176.5483602 72.54812988 79.99468908 0
171.9815877 78.13768514 80.87788608 1
180.013773 77.60660479 79.71464192 0
171.9685041 81.20240554 84.93720091 1
186.3999693 77.03393024 82.25099179 0
175.1117213 81.23388203 86.89111757 1
Wie Sie sehen können, ist es fast linear.
Nachdem ich Chainer geübt hatte, versuchte ich ein mehrschichtiges Perzeptron aufzubauen. Es hat eine dreischichtige Struktur mit drei Dimensionen für die Eingabe, vier Dimensionen für verborgene Elemente und zwei Dimensionen für die Ausgabe. (Da es sich um eine lineare Trennaufgabe handelt, kann sie mit einem einschichtigen Perzeptron durchgeführt werden.) Andere Einstellungen sind wie folgt.
--Aktivierungsfunktion: ReLu
class MLP(Chain):
def __init__(self):
super(MLP, self).__init__(
# 3-4-2 dimensionales Netzwerk
l1=L.Linear(3, 4),
l2=L.Linear(4, 2),
)
def forward(self, x, t, train):
h1 = F.dropout(F.relu(self.l1(x)), train=train)
y = self.l2(h1)
return F.softmax_cross_entropy(y, t), F.accuracy(y, t)
# Instanziierung
model = MLP()
# Adam wird als Optimierungsalgorithmus übernommen
optimizer = optimizers.Adam()
optimizer.setup(model)
N = 900 # Anzahl der Trainingsdaten
N_test = 100 # Anzahl der Bewertungsdaten
n_epoch = 100 # Anzahl der Iterationen
Batchgröße = 5 # Minibatch
# Unten weggelassen
Die Fehlerfunktion und die Genauigkeitsrate wurden durch die Anzahl der Epochen aufgetragen.
Es war etwas weniger als 80% Leistung. subtil?
Wir haben uns auch angesehen, welche Art von Ausgabe nach dem Lernen auf die Bewertungsdaten erfolgt.
Höhe Gewicht Brustumfangssystem geschätzte Adipositas-Flagge Richtige Adipositas-Flagge
[ 179.30055237 69.73477936 84.73832703] 0 0
[ 176.89619446 84.05502319 85.10128021] 1 1
[ 172.04129028 77.36618805 87.89541626] 1 1
[ 168.48660278 73.91072845 84.5171814 ] 1 1
[ 166.53656006 71.42696381 83.17546844] 0 1
[ 163.44270325 77.11021423 90.57539368] 1 1
[ 180.63993835 77.33372498 85.33548737] 0 0
[ 165.73175049 71.87976837 80.57328033] 0 1
Der zweite und vierte von unten, die ursprünglich fettleibig waren, wurden als normal beurteilt. Alle von ihnen sind niedrig, wenn man nur das Gewicht betrachtet. Hast du die Beziehung zu deiner Größe nicht verstanden?
--Fallen Sie in eine lokale Lösung Es gab Zeiten, in denen ich in eine lokale Lösung geriet und das Lernen nicht fortgesetzt wurde. Ich reduzierte die Anzahl der Mini-Batches, ordnete den Anfangswert des Gewichts neu zu, versuchte es viele Male und versuchte es erneut, bis es gut gelernt war.
Die Leistung dieser Aufgabe ist zu weniger als 80% niedrig. Ich möchte ein Gefühl dafür bekommen, indem ich verschiedene Anpassungen wie Lernrate, Mini-Batch-Größe, Abbrecherquote und Datennormalisierung vornehme.
Recommended Posts