summaryrefslogtreecommitdiff
path: root/neuralnet.py
diff options
context:
space:
mode:
authorschneefux <schneefux+commit@schneefux.xyz>2016-03-13 18:31:29 +0100
committerschneefux <schneefux+commit@schneefux.xyz>2016-03-13 18:31:29 +0100
commitc190cef2867b1815cfeeea93a2d60b82298da469 (patch)
tree859113538ffd50595d90369007b047320537d2cc /neuralnet.py
parent0d6e932c643bd24be4986769de072ec2d18bcbba (diff)
downloadboston-neuralnet-c190cef2867b1815cfeeea93a2d60b82298da469.tar.gz
boston-neuralnet-c190cef2867b1815cfeeea93a2d60b82298da469.zip
rename
Diffstat (limited to 'neuralnet.py')
-rw-r--r--neuralnet.py142
1 files changed, 142 insertions, 0 deletions
diff --git a/neuralnet.py b/neuralnet.py
new file mode 100644
index 0000000..079e587
--- /dev/null
+++ b/neuralnet.py
@@ -0,0 +1,142 @@
+#!/usr/bin/python3
+from sklearn import datasets
+from sklearn import preprocessing
+from sklearn.cross_validation import train_test_split
+import tensorflow as tf
+import numpy.random
+import numpy as np
+
+# Siehe Kommentar in dem Programm der linearen Regression
+SEED = 42
+numpy.random.seed(SEED)
+tf.set_random_seed(SEED)
+
+# Datenreihe laden
+dataset = datasets.load_boston()
+data, target = dataset.data, dataset.target
+
+# Datenwerte für ein effektiveres Lernen zwischen 0 und 1 skalieren
+data_scaler = preprocessing.MinMaxScaler()
+data = data_scaler.fit_transform(data)
+target_scaler = preprocessing.MinMaxScaler()
+target = target_scaler.fit_transform(target)
+
+# Datenwerte in Trainings- und Testreihe aufteilen
+x_train, x_test, y_train, y_test = train_test_split(
+ data, target, train_size=0.85
+)
+
+# Die Netzkonfiguration
+BATCH = 50
+STEPS = 300
+HIDDEN = 11
+IN = 13
+OUT = 1
+LEARNINGRATE = 0.01
+DECAYRATE = 0.96
+DECAYSTEPS = 50
+
+# Der Lernverlauf wird in einem individuellem Dateinamen gespeichert,
+# der je nach Konfiguration variiert.
+RUNNAME = 'B'+str(BATCH)+'S'+str(STEPS)+'H'+str(HIDDEN)+'LR'+str(LEARNINGRATE)\
+ + 'DR'+str(DECAYRATE)+'DS'+str(DECAYSTEPS)+'SD'+str(SEED)
+
+# Es wird ausschließlich auf der CPU gerechnet,
+# da die GPU zu lange zum Initialisieren braucht und mehr RAM.
+with tf.device('/cpu:0'):
+ sess = tf.InteractiveSession()
+ # Ausführliche Kommentare und ein vereinfachter Ablauf
+ # finden sich in Abschnitt 2.2.2 der Facharbeit.
+
+ with tf.name_scope('input_layer'):
+ matInput = tf.placeholder(tf.float32, [None, IN], name='input')
+ vecTarget = tf.placeholder(tf.float32, [None], name='target')
+ scalarNumelements = tf.shape(vecTarget, name='batch_length')
+ vecBias = tf.Variable(tf.random_uniform([IN], -1.0, 1.0), name='bias')
+ summaryBias = tf.histogram_summary("bias", vecBias)
+ vecsBias = tf.tile(vecBias, scalarNumelements)
+ vecsBias = tf.reshape(vecsBias, [-1, IN])
+ matBiasedInput = tf.add(matInput, vecsBias, name='biased_input')
+
+ with tf.name_scope('hidden_layer'):
+ matWeights = tf.Variable(tf.random_uniform([IN, HIDDEN], -1.0, 1.0),
+ name='weights')
+ summaryWeights = tf.histogram_summary('weights', matWeights)
+ matLayerin = tf.matmul(matBiasedInput, matWeights, name='layer_input')
+ matLayerout = tf.sigmoid(matLayerin, name='layer_output')
+
+ with tf.name_scope('output_layer'):
+ vecTarget = vecTarget
+ matWeightsHidden = tf.Variable(
+ tf.random_uniform([HIDDEN, OUT], -1.0, 1.0),
+ name='hidden-weights')
+ summaryWeightsHidden = tf.histogram_summary('hiddenweights',
+ matWeightsHidden)
+ matLayerinHidden = tf.matmul(matLayerout, matWeightsHidden,
+ name='hidden_input')
+ matLayeroutHidden = tf.sigmoid(matLayerinHidden, name='hidden_output')
+ # nur vec, wenn OUT=1
+ vecLayeroutHidden = tf.reshape(matLayeroutHidden, [-1])
+
+ with tf.name_scope('cost'):
+ vecDifference = tf.sub(vecTarget, vecLayeroutHidden, name='diff')
+ scalarError = tf.reduce_sum(tf.abs(vecDifference), name='error')
+ summaryError = tf.scalar_summary('error', scalarError)
+
+ with tf.name_scope('train'):
+ global_step = tf.Variable(0, trainable=False)
+ learning_rate = tf.train.exponential_decay(LEARNINGRATE,
+ global_step, DECAYSTEPS,
+ DECAYRATE, staircase=True)
+ train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(
+ scalarError, global_step=global_step)
+
+ summaries = tf.merge_all_summaries()
+ writer = tf.train.SummaryWriter("/tmp/boston_logs/%s" % RUNNAME,
+ sess.graph_def)
+ # Alle Tensorflow-Variablen müssen bis hier spezifiziert sein!
+ sess.run(tf.initialize_all_variables())
+
+ # Training
+ for count in range(0, int(len(x_train) / BATCH)):
+ print("batch " + str(count))
+ for i in range(0, STEPS):
+ result = sess.run([summaries, train_step],
+ feed_dict={
+ matInput: x_train[count*BATCH:(count+1)*BATCH],
+ vecTarget: y_train[count*BATCH:(count+1)*BATCH]
+ })
+ writer.add_summary(result[0], count * STEPS + i)
+
+ print("Training beendet")
+
+ print("Testergebnisse - Differenz zu echten Daten:")
+ result = sess.run([vecLayeroutHidden],
+ feed_dict={
+ matInput: x_test,
+ vecTarget: y_test
+ })
+ print("================================")
+ print("erwartete Daten:")
+ print("--------------------------------")
+ # Ausgabedaten sind skaliert, zurückskalieren
+ print(target_scaler.inverse_transform(y_test))
+ print("--------------------------------")
+ print("vorhergesagte Daten:")
+ print(target_scaler.inverse_transform(result[0]))
+ print("--------------------------------")
+ print("")
+ print("Differenz:")
+ print("--------------------------------")
+ # MSE aus der Differenz unskalierter Daten berechnen,
+ # nicht MSE aus Differenz skalierter Daten unskalieren:
+ # !!! (a - b) * f + o != (a * f + o) - (b * f + o)
+ # <=> af - bf + o != af - bf
+ diff = target_scaler.inverse_transform(
+ result[0]) - target_scaler.inverse_transform(y_test)
+ print(diff)
+ print("--------------------------------")
+ print("")
+ print("MSE")
+ # Entsprechend (af - bf + o)^2 != (af - bf)^2…
+ print(np.mean(diff ** 2))