#!/usr/bin/python3 from sklearn import datasets from sklearn import preprocessing from sklearn.cross_validation import train_test_split import tensorflow as tf dataset = datasets.load_boston() data, target = dataset.data, dataset.target data_scaler = preprocessing.MinMaxScaler() data = data_scaler.fit_transform(data) # use sklearn to fit the data values between 0 and 1 x_train, x_test, y_train, y_test = train_test_split( data, target, train_size=0.9 ) with tf.device('/cpu:0'): sess = tf.InteractiveSession() vecInput = tf.placeholder(tf.float32, [13], name="input") # 'unfitted' means not squeezed between 0 and 1, but real values numUnfittedTarget = tf.placeholder(tf.float32, [1], name="target") # numbers to scale the output between 0-1 and back to prices numFactor = tf.placeholder(tf.float32, [1], name="factor") numOffset = tf.placeholder(tf.float32, [1], name="offset") vecBias = tf.Variable(tf.random_uniform([13], minval=0, maxval=1), name="bias") vecBias = tf.Print(vecBias, [vecBias], "vecbias") # vecWeights is not a true vector, it is turned by 90 degrees vecWeights = tf.Variable(tf.random_uniform([1, 13], minval=0, maxval=1), name="weight") vecWeights = tf.Print(vecWeights, [vecWeights], "vecweights") # sum((i + b) * w) matWeighted = tf.mul(tf.add(vecInput, vecBias), vecWeights) matWeighted = tf.Print(matWeighted, [matWeighted], "matweighted: ") # DEBUG vecNetinput = tf.reduce_sum(matWeighted, 1) vecNetinput = tf.Print(vecNetinput, [vecNetinput], "netinput: ") # DEBUG vecLayerOutput = tf.sigmoid(vecNetinput) vecLayerOutput = tf.Print(vecLayerOutput, [vecLayerOutput], "vecLayerOutput: ") # DEBUG # since this is the last layer, vecOutput is a numOutput numOutput = tf.reduce_sum(vecLayerOutput) # unscale the output numUnfittedOutput = tf.add(tf.mul(numOutput, numFactor), numOffset) numUnfittedOutput = tf.Print(numUnfittedOutput, [numUnfittedOutput], "unfitted output: ") # DEBUG numUnfittedTarget = tf.Print(numUnfittedTarget, [numUnfittedTarget], "numUnfittedTarget: ") # DEBUG numDifference = tf.sub(numUnfittedOutput, numUnfittedTarget) numDifference = tf.Print(numDifference, [numDifference], "numDifference: ") numMSE = tf.reduce_sum(tf.square(numDifference)) numMSE = tf.Print(numMSE, [numMSE], "MSE: ") summaryMSE = tf.scalar_summary("MSE", numMSE) summaryDifference = tf.scalar_summary("Mean difference", numDifference) summaries = tf.merge_all_summaries() writer = tf.train.SummaryWriter("/tmp/boston_logs", sess.graph_def) # all variables have to be specified here sess.run(tf.initialize_all_variables()) train_step = tf.train.GradientDescentOptimizer(0.01).minimize(numMSE) factor = max(target) - min(target) offset = min(target) for count in range(0, len(x_train)): trainsteps = 100 print("count " + str(count)) for i in range(0, trainsteps): # 100 epochs if i % 10 == 9: feed = { vecInput: x_test[0], numUnfittedTarget: [y_test[0]], numFactor: [factor], numOffset: [offset] } result = sess.run([summaries, numMSE], feed_dict=feed) #print("test " + result[0]) #writer.add_summary(result[0], count * trainsteps + i) sess.run(train_step, feed_dict={ vecInput: x_train[count], numUnfittedTarget: [y_train[count]], numFactor: [factor], numOffset: [offset] }) print("finished training") #yt = [y_test] ## debug #print(" --------- ") #print("mean difference to test data: ") #print(sess.run(mse, feed_dict={input_matrix: x_test, real: yt, fact: factor, offs: offset})) #print(sess.run(diff, feed_dict={input_matrix: x_test, real: yt, fact: factor, offs: offset}))