Machine Learning Problem in keras/Tensorflow

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
wernersbacher
User
Beiträge: 1
Registriert: Montag 11. März 2019, 00:07

Montag 11. März 2019, 10:46

Moin moin,

ich bin ziemlich neu in Python und Machine Learning, und versuche ein kleines NN zu bauen. Dieses soll 2 Datensätze lernen und am Ende die Daten dem einem oder anderem zuordnen können. (good soll eine 1 produizieren, bad eine 0) Eingang sind 2 Werte, x1 und x2, Ausgang eben y.
Nun funktioniert das ganze soweit, als dass ich die Daten aus csv lesen kann, in einem numpy array vorliegen habe, und ich auch die Daten "fitte". Nur leider bekomme ich für unterschiedliche Testdaten genau dieselben Ergebnisse. Damit ich andere Ergebnisse bekomme, müssen die Eingabewerte stark abweichen.

Ich kann mein Problem nicht finden - ich poste einfach mal meinen Code.

Code: Alles auswählen

import csv
from numpy import genfromtxt
import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import SGD


train_good_x = genfromtxt('data/gehen.csv', delimiter=',', dtype=float)
train_good_y = np.full((len(train_good_x), 1), 1)
train_bad_x = genfromtxt('data/gehenS.csv', delimiter=',', dtype=float)
train_bad_y = np.full((len(train_bad_x), 1), 0)


train_merged_x = (np.array(np.ravel(train_good_x).tolist() + np.ravel(train_bad_x).tolist())).reshape((-1, 2))
train_merged_y = (np.array(np.ravel(train_good_y).tolist() + np.ravel(train_bad_y).tolist())).reshape((-1, 1))

test_x = genfromtxt('data/sitzenS.csv', delimiter=',', dtype=float)

madeup_x = np.array([-20, 20, -10, 10, -10, 20, 0, 0, 100, 200, -50, 0, 10, 20]).reshape(-1, 2)

model = Sequential()
model.add(Dense(8, input_dim=2, activation='sigmoid')) #hidden layer

model.add(Dense(1, activation='sigmoid')) #output

# compiling
sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='binary_crossentropy', optimizer=sgd)

#training
for x in range(0, 1):
    model.fit(train_merged_x, train_merged_y, batch_size=32, epochs=50, shuffle=True)
    #model.fit(train_good_x, train_good_y, batch_size=32, epochs=10)

#prediction
predict_madeup = model.predict(madeup_x)
predict_bad = model.predict(test_x, batch_size=32, verbose=0)
predict_good = model.predict(train_good_x, batch_size=32, verbose=0)

np.savetxt('out/madeup.out', predict_madeup, delimiter=',')
np.savetxt('out/bad.out', predict_bad, delimiter=',')
np.savetxt('out/good.out', predict_good, delimiter=',')
Die Ausgabe der prediction sieht bspw wie folgt aus:

made up data:
2.886866033077239990e-02
3.239934891462326050e-02
3.187835216522216797e-01
8.813233375549316406e-01
3.082492016255855560e-02
8.827737569808959961e-01
good data:
9.503311514854431152e-01
9.503250122070312500e-01
9.508721828460693359e-01
9.516936540603637695e-01
9.517768025398254395e-01
9.518370032310485840e-01
9.518744945526123047e-01
9.518316388130187988e-01
bad data:
9.519318342208862305e-01
9.519319534301757812e-01
9.519315361976623535e-01
9.519318342208862305e-01
9.519321918487548828e-01
9.519321322441101074e-01
9.519323110580444336e-01
9.519323110580444336e-01
Offenbar liegen die Daten irgendwie zu nah aneinander, um richtig differenziert zu werden?
Ich habe die Trainingsdaten hier als kleine Sätze verwenden (200 x-y Kombis), die echten liegen bei 5k - 20k, jedoch gibt es mit den großen Daten ähnliche Ergebnisse.

Hier ein XY Plot der Datensätze:
Bild

Kann mir jemand einen Tipp geben, wo das Problem begraben liegt? Eigentlich müsste das ganze doch eine triviale Aufgabenstellung sein...

Liebe Grüße
Markus
Antworten