diff --git a/checkpoints/b.hdf5 b/checkpoints/b.hdf5 index 0c24afd..ef650fa 100644 Binary files a/checkpoints/b.hdf5 and b/checkpoints/b.hdf5 differ diff --git a/nn.py b/nn.py index 4f9f287..0f6dc0d 100644 --- a/nn.py +++ b/nn.py @@ -11,6 +11,7 @@ import pandas as pd import os.path from utils import * +# from predict import predicted_map RANDOM_SEED = 1 @@ -23,6 +24,11 @@ np.random.seed(RANDOM_SEED) df = pd.read_pickle('data.p') +class MapHistory(keras.callbacks.Callback): + def on_epoch_end(self, epoch, logs): + print('EPOCH', epoch) + predicted_map('maps/{}'.format(epoch)) + class Model(): def __init__(self, name, batch_size=16, shuffle_buffer_size=500, learning_rate=0.001, epochs=1): self.name = name @@ -42,6 +48,8 @@ class Model(): (training, test) = (self.dataset.take(self.TRAIN_SIZE).batch(self.batch_size).repeat(), self.dataset.skip(self.TRAIN_SIZE).batch(self.batch_size).repeat()) + # print(df.groupby(['biome_num']).agg({ 'biome_num': lambda x: x.count() / df.shape[0] })) + print('dataset: size={}, train={}, test={}'.format(dataset_size, self.TRAIN_SIZE, self.TEST_SIZE)) print('input_size={}'.format(features)) @@ -58,6 +66,7 @@ class Model(): # 'kernel_regularizer': keras.regularizers.l2(l=0.01) } dropout = [keras.layers.Dropout(0.1, input_shape=[self.features])] + # dropout = [] self.model = keras.Sequential(dropout + [ keras.layers.Dense(layers[0], activation=tf.nn.elu, **params) ] + [ @@ -69,7 +78,6 @@ class Model(): def compile(self, loss='mse', metrics=['accuracy'], optimizer=tf.train.AdamOptimizer, load_weights=True): if load_weights: self.model.load_weights(self.path) - print('loaded weights') optimizer = optimizer(self.learning_rate) @@ -92,16 +100,19 @@ class Model(): def train(self): self.model.summary() - checkpoint = keras.callbacks.ModelCheckpoint(self.path, monitor='acc', verbose=1, mode='max') + checkpoint = keras.callbacks.ModelCheckpoint(self.path, monitor='val_loss', verbose=1, mode='min', save_best_only=True) tensorboard = keras.callbacks.TensorBoard(log_dir='./logs', update_freq='epoch') - map_callback = keras.callbacks.LambdaCallback(on_epoch_end=self.evaluate_print) + # reduce_lr = keras.callbacks.ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=5, min_lr=0.0001) + # map_callback = MapHistory() self.model.fit( self.training, batch_size=self.batch_size, epochs=self.epochs, - steps_per_epoch=int(self.dataset_size / self.batch_size), + steps_per_epoch=int(self.TRAIN_SIZE / self.batch_size), callbacks=[checkpoint, tensorboard], + validation_data=self.test, + validation_steps=int(self.TEST_SIZE / self.batch_size), verbose=1 ) @@ -109,12 +120,13 @@ class Model(): return np.argmax(self.model.predict(a), axis=1) A = Model('a', epochs=2) -B = Model('b', learning_rate=0.001, epochs=20) +B = Model('b', learning_rate=0.0005, epochs=50) +# 24 so far def compile_b(): B.prepare_dataset(df, dataframe_to_dataset_biomes) - B.create_model([32, 32], tf.nn.softmax) - B.compile(loss='sparse_categorical_crossentropy') + B.create_model([12], tf.nn.softmax) + B.compile(loss='sparse_categorical_crossentropy', load_weights=False) def compile_a(): A.prepare_dataset(df, dataframe_to_dataset_temp_precip) diff --git a/predict.py b/predict.py index c620878..d2e17db 100644 --- a/predict.py +++ b/predict.py @@ -8,13 +8,12 @@ import time def chunker(seq, size): return (seq[pos:pos + size] for pos in range(0, len(seq), size)) -year = MAX_YEAR - 1 -df = pd.read_pickle('data.p') +def predicted_map(path=None): + year = MAX_YEAR - 1 -compile_b() + df = pd.read_pickle('data.p') -for change in range(0, 1): print('TEMPERATURE MODIFICATION OF {}'.format(change)) inputs = ['elevation', 'distance_to_water', 'latitude'] @@ -50,4 +49,9 @@ for change in range(0, 1): }, columns=columns) new_data = new_data.append(f) - draw(new_data) + draw(new_data, path=path) + +if __name__ == "__main__": + compile_b() + predicted_map() +