def train_social_model(out_dir: str, config: ModelConfig) -> None: # load data train_data, test_data = provide_train_test(config) # prepare train data obs_len_train, pred_len_train = obs_pred_split(config.obs_len, config.pred_len, *train_data) x_obs_len_train, _, grid_obs_len_train, zeros_obs_len_train = obs_len_train _, y_pred_len_train, _, _ = pred_len_train # prepare test data obs_len_test, pred_len_test = obs_pred_split(config.obs_len, config.pred_len, *test_data) x_obs_len_test, _, grid_obs_len_test, zeros_obs_len_test = obs_len_test _, y_pred_len_test, _, _ = pred_len_test os.makedirs(out_dir, exist_ok=True) # training my_model = MySocialModel(config) print(config.steps_per_epoch) # history = my_model.train_model.fit_generator( # train_generator([x_obs_len_train, grid_obs_len_train, zeros_obs_len_train, y_pred_len_train], config.batch_size), # # batch_size=config.batch_size, # epochs=config.n_epochs, # verbose=1, # steps_per_epoch=config.steps_per_epoch, # validation_data=( # [x_obs_len_test, grid_obs_len_test, zeros_obs_len_test], # y_pred_len_test # ) # ) history = my_model.train_model.fit( [x_obs_len_train, grid_obs_len_train, zeros_obs_len_train], y_pred_len_train, batch_size=config.batch_size, epochs=config.n_epochs, verbose=1, # steps_per_epoch=config.steps_per_epoch, validation_data=([ x_obs_len_test, grid_obs_len_test, zeros_obs_len_test ], y_pred_len_test)) # save the trained model weights weights_file = os.path.join(out_dir, _make_weights_file_name(config.n_epochs)) my_model.train_model.save_weights(weights_file) history_file = os.path.join(out_dir, "history.json") dump_json_file(history.history, history_file) # save loss plot plt_save_loss(config, out_dir, history.history)
def train_social_model(out_dir: str, config: ModelConfig) -> None: # load data train_data, test_data = provide_train_test(config) # prepare train data obs_len_train, pred_len_train = obs_pred_split(config.obs_len, config.pred_len, *train_data) x_obs_len_train, _, grid_obs_len_train, zeros_obs_len_train = obs_len_train _, y_pred_len_train, _, _ = pred_len_train # prepare test data obs_len_test, pred_len_test = obs_pred_split(config.obs_len, config.pred_len, *test_data) x_obs_len_test, _, grid_obs_len_test, zeros_obs_len_test = obs_len_test _, y_pred_len_test, _, _ = pred_len_test os.makedirs(out_dir, exist_ok=True) # training my_model = MySocialModel(config) history = my_model.train_model.fit( [x_obs_len_train, grid_obs_len_train, zeros_obs_len_train], y_pred_len_train, batch_size=config.batch_size, epochs=config.n_epochs, verbose=1, validation_data=([ x_obs_len_test, grid_obs_len_test, zeros_obs_len_test ], y_pred_len_test)) # save loss plot plt.plot(history.history["loss"]) plt.plot(history.history["val_loss"]) plt.title("social model loss") plt.ylabel("loss") plt.xlabel("epoch") plt.legend(["train", "test"], loc="upper right") plt.savefig( os.path.join(out_dir, "test={}_loss.png".format(config.test_dataset_kind))) history_file = os.path.join(out_dir, "history.json") dump_json_file(history.history, history_file) # save the trained model weights weights_file = os.path.join(out_dir, _make_weights_file_name(config.n_epochs)) my_model.train_model.save_weights(weights_file)
def main() -> None: args = _load_eval_args() config = load_model_config(args.trained_model_config) out_dir = os.path.join(os.path.dirname(args.trained_model_file), "eval") os.makedirs(out_dir, exist_ok=True) # load data _, test_data = provide_train_test(config) obs_len_test, pred_len_test = obs_pred_split(config.obs_len, config.pred_len, *test_data) # load trained model weights my_model = MySocialModel(config) my_model.train_model.load_weights(args.trained_model_file) # first, predict `pred_len` sequences following observation sequence x_obs_len_test, _, grid_obs_len_test, zeros_obs_len_test = obs_len_test x_pred_len_test, *_ = pred_len_test x_pred_len_model = my_model.sample_model.predict( [x_obs_len_test, grid_obs_len_test, zeros_obs_len_test], batch_size=config.batch_size, verbose=1) # -------------------------------------------------------------------------- # visualization # -------------------------------------------------------------------------- x_concat_test = np.concatenate([x_obs_len_test, x_pred_len_test], axis=1) x_concat_model = np.concatenate([x_obs_len_test, x_pred_len_model], axis=1) # visualize true and predicted trajectories, and save as png files out_fig_dir = os.path.join(out_dir, "figs") os.makedirs(out_fig_dir, exist_ok=True) for s in range(len(x_concat_test)): fig = visualize_trajectories(x_concat_test[s], x_concat_model[s], config.obs_len, config.pred_len) fig_file = os.path.join(out_fig_dir, "{0:04d}.png".format(s)) fig.savefig(fig_file) plt.close(fig) # -------------------------------------------------------------------------- # evaluation # -------------------------------------------------------------------------- # evaluation ade = compute_abe(x_pred_len_test, x_pred_len_model) fde = compute_fde(x_pred_len_test, x_pred_len_model) report = {"ade": float(ade), "fde": float(fde)} # write to a json file report_file = os.path.join(out_dir, "report.json") with open(report_file, "w") as f: json.dump(report, f) print("Average displacement error: {}".format(ade)) print("Final displacement error: {}".format(fde))
def train_social_model(out_dir: str, config: ModelConfig) -> None: # 加载数据 train_data, test_data = provide_train_test(config) # 训练数据 obs_len_train, pred_len_train = obs_pred_split(config.obs_len, config.pred_len, *train_data) x_obs_len_train, _, grid_obs_len_train, zeros_obs_len_train = obs_len_train _, y_pred_len_train, _, _ = pred_len_train # 测试数据 obs_len_test, pred_len_test = obs_pred_split(config.obs_len, config.pred_len, *test_data) x_obs_len_test, _, grid_obs_len_test, zeros_obs_len_test = obs_len_test _, y_pred_len_test, _, _ = pred_len_test os.makedirs(out_dir, exist_ok=True) # 训练部分,加载历史运动轨迹,batch_size,训练批次 my_model = MySocialModel(config) print(config.steps_per_epoch) history = my_model.train_model.fit( [x_obs_len_train, grid_obs_len_train, zeros_obs_len_train], y_pred_len_train, batch_size=config.batch_size, epochs=config.n_epochs, verbose=1, validation_data=([ x_obs_len_test, grid_obs_len_test, zeros_obs_len_test ], y_pred_len_test)) # 保存训练权重 weights_file = os.path.join(out_dir, _make_weights_file_name(config.n_epochs)) my_model.train_model.save_weights(weights_file) history_file = os.path.join(out_dir, "history.json") dump_json_file(history.history, history_file) # 保存训练过程loss曲线图 plt_save_loss(config, out_dir, history.history)
def main() -> None: # 'circle', 'rect grid_type = 'rect' is_test = True args = _load_eval_args() config = load_model_config(args.trained_model_config) config.grid_type = grid_type config.test_dataset_kind = 'students003' out_dir = os.path.join(os.path.dirname(args.trained_model_file), "eval") os.makedirs(out_dir, exist_ok=True) # 加载数据 _, test_data = provide_train_test(config, is_test=is_test) obs_len_test, pred_len_test = obs_pred_split( config.obs_len, config.pred_len, *test_data) # 加载训练权重 my_model = MySocialModel(config) my_model.train_model.load_weights(args.trained_model_file) # obs_len代表历史运动序列;`pred_len`代表预测序列 x_obs_len_test, _, grid_obs_len_test, zeros_obs_len_test = obs_len_test x_pred_len_test, *_ = pred_len_test x_pred_len_model = my_model.sample_model.predict( [x_obs_len_test, grid_obs_len_test, zeros_obs_len_test], batch_size=config.batch_size, verbose=1) # -------------------------------------------------------------------------- # -------------------------------------------------------------------------- x_concat_test = np.concatenate([x_obs_len_test, x_pred_len_test], axis=1) x_concat_model = np.concatenate([x_obs_len_test, x_pred_len_model], axis=1) # 将预测坐标保存至person_n.txt文件 out_fig_dir = os.path.join(out_dir, "figs") os.makedirs(out_fig_dir, exist_ok=True) for s in range(len(x_concat_test)): fig = visualize_trajectories(x_concat_test[s], x_concat_model[s], config.obs_len, config.pred_len) fig_file = os.path.join(out_fig_dir, "{0:04d}.person_n.txt".format(s)) fig.savefig(fig_file) plt.close(fig) # -------------------------------------------------------------------------- # 评估指标 # -------------------------------------------------------------------------- ade = compute_abe(x_pred_len_test, x_pred_len_model) fde = compute_fde(x_pred_len_test, x_pred_len_model) report = {"ade": float(ade), "fde": float(fde)} # 将定性测试结果保存为一个json文件,包含平均位移误差和最终位移误差 report_file = os.path.join(out_dir, "report.json") with open(report_file, "w") as f: json.dump(report, f) print("Average displacement error: {}".format(ade)) print("Final displacement error: {}".format(fde))