'''
Created on 05.10.2017

@author: jens
'''

import tensorflow as tf
# NumPy is often used to load, manipulate and preprocess data.
import numpy as np

#Estimator-API braucht keine Session oder Variablen, Placeholder, etc.
#estimator.train, estimator.evaluate, .. erledigen das fuer mich intern!

# Declare list of features. We only have one numeric feature. There are many
# other types of columns that are more complicated and useful.
feature_columns = [tf.feature_column.numeric_column("x", shape=[1])]
    #Feature columns provide a mechanism to map data to a model
    #hier wird beschrieben, wie der Input des estimator-Modells aussieht!


# An estimator is the front end to invoke training (fitting) and evaluation
# (inference). There are many predefined types like linear regression,
# linear classification, and many neural network classifiers and regressors.
# The following code provides an estimator that does linear regression.
estimator = tf.estimator.LinearRegressor(feature_columns=feature_columns)
    #zur Erstellung eines Schaetzers ist als einziges notwendiges Attribut die Art des Inputs des Modells zu spezifizieren!
    #alles weitere macht dann die Estimator-API passend!

# TensorFlow provides many helper methods to read and set up data sets.
# Here we use two data sets: one for training and one for evaluation
# We have to tell the function how many batches
# of data (num_epochs) we want and how big each batch should be.
x_train = np.array([1., 2., 3., 4.])
y_train = np.array([0., -1., -2., -3.])
x_eval = np.array([2., 5., 8., 1.])
y_eval = np.array([-1.01, -4.1, -7, 0.])
    #ueblicher Weg, um Daten zu erstellen (numpy ist die Regel fuer sowas, deshalb dieses Beispiel!)

input_fn = tf.estimator.inputs.numpy_input_fn(
    {"x": x_train}, y_train, batch_size=4, num_epochs=None, shuffle=True)
train_input_fn = tf.estimator.inputs.numpy_input_fn(
    {"x": x_train}, y_train, batch_size=4, num_epochs=1000, shuffle=False)
eval_input_fn = tf.estimator.inputs.numpy_input_fn(
    {"x": x_eval}, y_eval, batch_size=4, num_epochs=1000, shuffle=False)
    #die Estimator-API bringt funktionen mit, die die gaengigen Datenformate in formate umwandelt, die 
    #Estimator-Modelle lesen koennen (entsprechend der "feature_columns")

# We can invoke 1000 training steps by invoking the  method and passing the
# training data set.
estimator.train(input_fn=input_fn, steps=1000)
    #trainingsschritt - keine for-Schleife! das passiert alles im Estimator!

# Here we evaluate how well our model did.
train_metrics = estimator.evaluate(input_fn=train_input_fn)
eval_metrics = estimator.evaluate(input_fn=eval_input_fn)
print("train metrics: %r"% train_metrics)
print("eval metrics: %r"% eval_metrics)

