#
# using a python generator in model.fit()
# this example trains on all the data which is generally bad as it
#   can lead to overfitting...see train-and-val.py for better approach
# this example uses 4 files, fold1.txt, fold2.txt, fold3.txt, fold4.txt

# TensorFlow, keras, numpy
import tensorflow as tf
from tensorflow import keras
import numpy as np

# define a generator function
def load():
 fold=1
 while True:
  filename='fold'+str(fold)+'.txt'
  fpt=open(filename,'r')
  d=[[int(x) for x in line.split()] for line in fpt]
  fpt.close()

  # copy to classes and data
  classes=[]
  data=[]

  for a in range(0,len(d)):
   classes.append(d[a][0])
   row=[]
   for b in range(1,len(d[a])):
    row.append(d[a][b])
   data.append(row)

  # normalize each row of data
  normdata=[]
  for a in range(0,len(data)):
   norm=[]
   s=min(data[a])
   t=max(data[a])
   for b in range(0,len(data[a])):
    norm.append((float(data[a][b])-float(s))/(float(t)-float(s)))
   normdata.append(norm)

  classes=np.array(classes)
  data=np.array(normdata)

  yield data,classes
  fold=fold+1
  if fold > 4:
   fold=1

# create the generator (object)
f=load()

model = keras.Sequential([
    keras.layers.Dense(2, input_shape=(20,), activation='sigmoid')
    ])

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

print("Training")
metrics = model.fit_generator(f, steps_per_epoch=4,  epochs=100, verbose=2)

print("Testing")
test_loss, test_acc = model.evaluate_generator(f, steps=4)
print('Test accuracy:', test_acc)

w=model.get_weights()
print(w)

