Я использую tensorflow.keras в блокноте Jupyter для создания нейронной сети для прогнозирования некоторых данных. При первом запуске кода я получаю результаты от tensorflow.keras. Он создает модели. Проблема в том, что если я попытаюсь запустить его еще раз, он не сможет сгенерировать новые модели. Я не получаю сообщений об ошибках или чего-то подобного. Код работает так же, как и раньше, и пытается найти нейронную сеть, соответствующую заданным данным, но не может ее найти, независимо от того, насколько низко я установил критерий успеха (NSE_cut).
Чтобы заставить его создавать новые модели, мне нужно перезапустить ядро ноутбука Jupyter, которое стирает все данные и обработку, которые я выполнил до сих пор. Когда предварительная обработка занимает 20 минут, а моделирование нейронной сети — всего около 1 минуты, это проблема. Что я делаю не так? > Почему этот код может создавать модели только во время первого запуска?
Вот код:
### --- Calculate Neural Network fit for modes --- ###
def nn_fit(reof_ds, q, NSE_cut):
indx_qual_mode = []
best_model = []
best_score = []
best_nse = 0
# ----- Train Tensorflow Hydro-to-TPC models mode-by-mode -----
for mode in reof_ds.mode.values:
keras.backend.clear_session()
print('Building models for mode-'+str(mode).zfill(2))
tpc = reof_ds.temporal_modes.sel(mode=int(mode))
X = q.values.reshape(len(q),1)
Y = tpc.values.reshape(len(q),1)
X_train = X
Y_train = Y
# -- adapt function is to get the mean and STD used to normalize the input data of the model --
normalizer.adapt(X_train)
# ----- Construct the model and get summary -----
model = build_and_compile_model(normalizer)
#if vis_tf_nn==0:
#elif vis_tf_nn==1:
# plot_model(model, to_file='NOAA_WF\\hydro2rtpc_mdl\\'+data_src+'\\site-'+str(gaugeID_list[site])+'_tpc'+str(mode+1).zfill(2)+'.png', show_shapes=True, show_layer_names=True)
# ----- Fit the model -----
train_proc = model.fit(
X_train,
Y_train,
callbacks=[callback],
batch_size=32,
epochs=200,
verbose=0,
#validation_split=0.2
)
# ----- Plot model estimation and original scatter plot -----
X_sim = tf.linspace(np.amin(X), np.amax(X), X.size*10^10)
Y_sim = model.predict(X_sim)
# ----- The second-time REOF mode screening based on quality of regression models. If qualified, export trained model -----
Y_mdl = model.predict(X[:,0])
nse = 1 - ( (np.nansum(np.square( Y - Y_mdl ))) / (np.nansum(np.square( Y - np.nanmean(Y) ))) )
if nse >= NSE_cut: # Moriasi et al., 2007. Consider NSE>0.5 as satisfactory
model.summary()
print(mode, nse)
# ----- Plot training progress -----
plot_loss(train_proc)
best_nse = nse
best_score.append(best_nse)
best_model.append(model)
indx_qual_mode.append(mode)
fig = plt.figure()
ax = fig.add_axes([0,0,1,1])
plt.scatter(X, Y)
plt.plot(X_sim, Y_sim, color='r')
plt.xlabel('discharge (m3/d)')
plt.ylabel(f"mode {mode}")
plt.xticks(rotation=45, ha='right')
plt.yticks(rotation=45)
plt.legend(['NN-Model','Data'],loc='upper left')
plt.text(0.2,0.5,'NSE: '+"{:.2f}".format(nse), transform=ax.transAxes)
plt.savefig('test.png', dpi=300, bbox_inches='tight')
plt.show()
# ----- Export trained model -----
#best_model.save('test.keras')
# ADDED by Knicely
del Y_mdl, X_sim, Y_sim, X, Y, X_train, Y_train, train_proc, model
keras.backend.clear_session()
return(best_model, indx_qual_mode)
reof_ds содержит пространственные и временные режимы повернутой эмпирической ортогональной функции.
Отредактировано для ясности проблемы.
Я использую tensorflow.keras в блокноте Jupyter для создания нейронной сети для прогнозирования некоторых данных. При первом запуске кода я получаю результаты от tensorflow.keras. Он создает модели. Проблема в том, что если я попытаюсь запустить его еще раз, он не сможет сгенерировать новые модели. Я не получаю сообщений об ошибках или чего-то подобного. Код работает так же, как и раньше, и пытается найти нейронную сеть, соответствующую заданным данным, но не может ее найти, независимо от того, насколько низко я установил критерий успеха (NSE_cut). Чтобы заставить его создавать новые модели, мне нужно перезапустить ядро ноутбука Jupyter, которое стирает все данные и обработку, которые я выполнил до сих пор. Когда предварительная обработка занимает 20 минут, а моделирование нейронной сети — всего около 1 минуты, это проблема. [b]Что я делаю не так?[/b] > Почему этот код может создавать модели только во время первого запуска? Вот код: [code]### --- Calculate Neural Network fit for modes --- ### def nn_fit(reof_ds, q, NSE_cut): indx_qual_mode = [] best_model = [] best_score = [] best_nse = 0
# ----- Train Tensorflow Hydro-to-TPC models mode-by-mode ----- for mode in reof_ds.mode.values: keras.backend.clear_session() print('Building models for mode-'+str(mode).zfill(2)) tpc = reof_ds.temporal_modes.sel(mode=int(mode))
X = q.values.reshape(len(q),1) Y = tpc.values.reshape(len(q),1)
X_train = X Y_train = Y
# -- adapt function is to get the mean and STD used to normalize the input data of the model -- normalizer.adapt(X_train)
# ----- Construct the model and get summary ----- model = build_and_compile_model(normalizer) #if vis_tf_nn==0: #elif vis_tf_nn==1: # plot_model(model, to_file='NOAA_WF\\hydro2rtpc_mdl\\'+data_src+'\\site-'+str(gaugeID_list[site])+'_tpc'+str(mode+1).zfill(2)+'.png', show_shapes=True, show_layer_names=True)
# ----- Fit the model ----- train_proc = model.fit( X_train, Y_train, callbacks=[callback], batch_size=32, epochs=200, verbose=0, #validation_split=0.2 )
# ----- Plot model estimation and original scatter plot ----- X_sim = tf.linspace(np.amin(X), np.amax(X), X.size*10^10) Y_sim = model.predict(X_sim)
# ----- The second-time REOF mode screening based on quality of regression models. If qualified, export trained model ----- Y_mdl = model.predict(X[:,0]) nse = 1 - ( (np.nansum(np.square( Y - Y_mdl ))) / (np.nansum(np.square( Y - np.nanmean(Y) ))) )
if nse >= NSE_cut: # Moriasi et al., 2007. Consider NSE>0.5 as satisfactory
model.summary() print(mode, nse)
# ----- Plot training progress ----- plot_loss(train_proc)
# ----- Export trained model ----- #best_model.save('test.keras') # ADDED by Knicely del Y_mdl, X_sim, Y_sim, X, Y, X_train, Y_train, train_proc, model keras.backend.clear_session()
return(best_model, indx_qual_mode) [/code] reof_ds содержит пространственные и временные режимы повернутой эмпирической ортогональной функции. Отредактировано для ясности проблемы.