ich bin neu im Bereich "Data Science" und habe festgestellt,
dass ich zu wenig Datensätze für ein Training eines einfachen Neuronalen Netzes besitze,
weshalb ich hierfür die Kreuzvalidierung als Lösung gefunden habe.
Meine erste Frage: habe ich die Kreuzvalidierung korrekt als Code umgesetzt?
Code: Alles auswählen
# -*- coding: utf-8 -*-
"""
Created on Wed Apr 3 16:26:14 2019
@author: mattdoe
"""
from data_preprocessor_db import data_storage # validation data
from sklearn.model_selection import StratifiedKFold
# from keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Dense
from keras.utils import normalize
from numpy import mean
from numpy import std
# create and evaluate a single multi-layer-perzeptron
def evaluate_model(Train, Test, Target_Train, Target_Test):
# define model
model = Sequential()
# input layer automatically created
model.add(Dense(9, input_dim=9, activation='relu')) # 1st hidden layer
model.add(Dense(9, activation='relu')) # 2nd hidden layer
model.add(Dense(9, activation='softmax')) #output layer
# create model
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit model
model.fit(Train, Target_Train, epochs=50, verbose=0)
# if not running: try to_categorical(Target_Train)
# evaluate the model
test_loss, test_acc = model.evaluate(Test, Target_Test, verbose=0)
# if not running: try to_categorical(Target_Test)
return model, test_acc
# for seperation of data_storage
# Link_ID = []
Input = []
Output = []
# list all results of k-fold cross-validation
scores, members = list(), list()
# seperate data_storage in Input and Output data
for items in data_storage:
# Link_ID = items[0] # identifier not needed
Input = (items[1], items[2], items[3], items[4], items[5], items[6], items[7], items[8]) # Input: all characteristics
Output = items[9] # Output: scenario_class 1 to 8
# normalize Data
Input = normalize(Input)
Output = normalize(Output)
# prepare k-fold cross-validation
kfold = StratifiedKFold(n_splits=15, random_state=1, shuffle=True)
for train_ix, test_ix in kfold.split(Input, Output):
# select samples
Train, Target_Train = Input[train_ix], Output[train_ix]
Test, Target_Test = Input[test_ix], Output[test_ix]
# evaluate model
model, test_acc = evaluate_model(Train, Test, Target_Train, Target_Test)
# display each evalution result
print('>%.3f' % test_acc)
# add result to list
scores.append(test_acc)
members.append(model)
# summarize expected performance
print('Estimated Accuracy %.3f (%.3f)' % (mean(scores), std(scores)))
# save model // trained neuronal network
model.save('neuronal_network_1.h5')
Code: Alles auswählen
item[0], item[1], item[2], item[3], ... item[9]
....
item[0], item[1], item[2], item[3], ... item[9]
sind alle numerisch, jedoch noch nicht normalisiert.
Noch ist die DB-Tabelle "learn_data" nicht fertig gefüllt, weshalb ich den Code auch noch nicht austesten konnte.
Die Tabelle besteht jedoch nicht nur aus Integer, sondern auch aus Float-Werten.
Ein Problem beim Normalisieren?
Meine zweite Frage: Kombination mit "early stopping" sinnvoll?
Letzten Endes erhalte ich mit meinem bisherigen Code ja immer bei jeden Funktionsaufruf den letzten Wert,
den mein Netz gespeichert hat, aber nicht den "vermeintlich" besten.
Dafür könnte doch der Ansatz des "early sopping's" helfen oder
widerspricht dieses den Grundsätzen der Kreuzvalidierung?
Meine dritte Frage: bedeutet Modell speichern, dass die Gewichte gespeichert werden?
Oder wird so nur die "Struktur" des NN gesichert?
Ich möchte das Modell später ja auch anwenden und brauche dafür die Gewichte...
Vielen Dank schonmal an alle Data Scienec und NN-Experten

Finde das Thema spannend und hoffe, ihr könnt mir da stückweit auch mein Verständnis für das für mich neue Thema schärfen.