2019-02-13 15:28:10 +01:00
|
|
|
import os
|
|
|
|
import random
|
|
|
|
|
|
|
|
import keras
|
|
|
|
import numpy as np
|
|
|
|
from keras import Sequential
|
|
|
|
from keras.engine.saving import load_model
|
|
|
|
from keras.layers import Dense
|
|
|
|
from keras.utils import plot_model
|
|
|
|
from matplotlib import pyplot as plt
|
|
|
|
|
2019-07-29 13:59:10 +02:00
|
|
|
from CustomScaler import CustomScaler
|
2019-02-13 15:28:10 +01:00
|
|
|
from simulation_list import SimulationList
|
|
|
|
|
|
|
|
simulations = SimulationList.jsonlines_load()
|
|
|
|
|
2019-07-29 13:59:10 +02:00
|
|
|
train_data = set([s for s in simulations.simlist])
|
|
|
|
new_data = [s for s in simulations.simlist if s.type != "original"]
|
|
|
|
random.seed(1)
|
|
|
|
test_data = set(random.sample(new_data, int(len(new_data) * 0.2)))
|
|
|
|
train_data -= test_data
|
|
|
|
print(len(train_data), len(test_data))
|
2019-07-06 15:50:16 +02:00
|
|
|
X = np.array(
|
|
|
|
[[s.alpha, s.v, s.projectile_mass, s.gamma, s.target_water_fraction, s.projectile_water_fraction] for s in
|
|
|
|
train_data])
|
2019-07-29 13:59:10 +02:00
|
|
|
scaler = CustomScaler()
|
2019-03-04 19:24:27 +01:00
|
|
|
scaler.fit(X)
|
2019-07-29 13:59:10 +02:00
|
|
|
x = scaler.transform_data(X)
|
2019-04-18 10:50:57 +02:00
|
|
|
print(x.shape)
|
2019-02-13 15:28:10 +01:00
|
|
|
Y = np.array([s.water_retention_both for s in train_data])
|
2019-04-18 10:50:57 +02:00
|
|
|
print(Y.shape)
|
2019-07-06 15:50:16 +02:00
|
|
|
X_test = np.array(
|
|
|
|
[[s.alpha, s.v, s.projectile_mass, s.gamma, s.target_water_fraction, s.projectile_water_fraction] for s in
|
|
|
|
test_data])
|
|
|
|
Y_test = np.array([s.mass_retention_both for s in test_data])
|
2019-07-29 13:59:10 +02:00
|
|
|
x_test = scaler.transform_data(X_test)
|
2019-07-06 15:50:16 +02:00
|
|
|
# print(X_test)
|
|
|
|
# print(X[0])
|
|
|
|
# exit()
|
2019-07-29 13:59:10 +02:00
|
|
|
random.seed()
|
|
|
|
tbCallBack = keras.callbacks.TensorBoard(log_dir='./logs/{}'.format(random.randint(0, 100)), histogram_freq=1,
|
|
|
|
batch_size=32, write_graph=True,
|
|
|
|
write_grads=True, write_images=True, embeddings_freq=0,
|
2019-02-13 15:28:10 +01:00
|
|
|
embeddings_layer_names=None, embeddings_metadata=None, embeddings_data=None,
|
|
|
|
update_freq='epoch')
|
|
|
|
|
2019-07-29 13:59:10 +02:00
|
|
|
if os.path.exists("model.hd5"):
|
2019-02-13 15:28:10 +01:00
|
|
|
model = load_model("model.hd5")
|
|
|
|
else:
|
|
|
|
model = Sequential()
|
2019-07-29 13:59:10 +02:00
|
|
|
model.add(Dense(6, input_dim=6, activation='relu'))
|
2019-04-18 10:50:57 +02:00
|
|
|
model.add(Dense(4, kernel_initializer='normal', activation='relu'))
|
2019-07-29 13:59:10 +02:00
|
|
|
model.add(Dense(3, kernel_initializer='normal', activation='relu'))
|
|
|
|
model.add(Dense(1, kernel_initializer='normal', activation="sigmoid"))
|
2019-02-13 15:28:10 +01:00
|
|
|
model.compile(loss='mean_squared_error', optimizer='adam')
|
|
|
|
|
|
|
|
model.summary()
|
|
|
|
plot_model(model, "model.png", show_shapes=True, show_layer_names=True)
|
2019-07-29 13:59:10 +02:00
|
|
|
model.fit(x, Y, epochs=200, callbacks=[tbCallBack], validation_data=(x_test, Y_test))
|
2019-07-06 15:50:16 +02:00
|
|
|
loss = model.evaluate(x_test, Y_test)
|
2019-02-13 15:28:10 +01:00
|
|
|
print(loss)
|
2019-07-29 13:59:10 +02:00
|
|
|
if loss > 0.04:
|
|
|
|
# exit()
|
|
|
|
...
|
2019-07-06 15:50:16 +02:00
|
|
|
# print("-------------------------------------")
|
|
|
|
# exit()
|
2019-02-13 15:28:10 +01:00
|
|
|
model.save("model.hd5")
|
|
|
|
|
|
|
|
xrange = np.linspace(-0.5, 60.5, 100)
|
|
|
|
yrange = np.linspace(0.5, 5.5, 100)
|
|
|
|
xgrid, ygrid = np.meshgrid(xrange, yrange)
|
2019-08-20 16:17:19 +02:00
|
|
|
mcode = 1e24
|
2019-07-06 15:50:16 +02:00
|
|
|
wpcode = 15 / 100
|
|
|
|
wtcode = 15 / 100
|
2019-08-20 16:17:19 +02:00
|
|
|
gammacode = 0.6
|
2019-07-06 15:50:16 +02:00
|
|
|
testinput = np.array([[np.nan, np.nan, mcode, gammacode, wtcode, wpcode]] * 100 * 100)
|
|
|
|
testinput[::, 0] = xgrid.flatten()
|
|
|
|
testinput[::, 1] = ygrid.flatten()
|
2019-07-29 13:59:10 +02:00
|
|
|
testinput = scaler.transform_data(testinput)
|
2019-03-04 19:24:27 +01:00
|
|
|
|
2019-02-13 15:28:10 +01:00
|
|
|
print(testinput)
|
|
|
|
print(testinput.shape)
|
|
|
|
testoutput = model.predict(testinput)
|
|
|
|
outgrid = np.reshape(testoutput, (100, 100))
|
2019-08-20 16:17:19 +02:00
|
|
|
print("minmax")
|
|
|
|
print(np.nanmin(outgrid), np.nanmax(outgrid))
|
2019-02-13 15:28:10 +01:00
|
|
|
|
2019-08-20 16:17:19 +02:00
|
|
|
plt.imshow(outgrid, interpolation='none', cmap="Blues", aspect="auto", origin="lower", vmin=0, vmax=1,
|
|
|
|
extent=[xgrid.min(), xgrid.max(), ygrid.min(), ygrid.max()])
|
|
|
|
|
|
|
|
plt.colorbar().set_label("water retention fraction")
|
|
|
|
plt.xlabel("impact angle $\\alpha$ [$^{\circ}$]")
|
|
|
|
plt.ylabel("velocity $v$ [$v_{esc}$]")
|
|
|
|
plt.tight_layout()
|
|
|
|
plt.savefig("../arbeit/images/plots/nn2.pdf")
|
2019-02-13 15:28:10 +01:00
|
|
|
plt.show()
|