Pytorchの学習が段々遅くなってしまう

Python

#main.py データセットの事前処理の部分などは省いていますdef main(param, out_dir):''' 一部省略 ''' param.savetxt_parameter(out_dir) file_log = open(out_dir + "log.txt", "w") accuracy_plot = [[],[],[]] loss_plot = [[],[],[]] score_plot = [[],[],[]] score_jma_plot = [[],[],[]] max_accuracy = 0 min_loss = 100 best_accuracy = np.array([0, 0]) best_loss = np.array([100, 100]) best_score = np.array([0, 0]) best_score_jma = np.array([0, 0]) accuracy = np.array([0, 0, 0]) score = np.array([0, 0, 0]) score_jma = np.array([0, 0, 0]) loss_cal = np.array([0, 0, 0]) count_save_model = 0 #★ 学習開始 #Loop epochs for epoch in range(param.max_epoch): #データのシャッフル dataset = permutation_nclass(sequence) dataset_batch = ["","",""] loss_model = 0 loss_sum = np.array([0,0,0]) count_loss = 0 y_save = [np.array([]),np.array([]),np.array([])] t_save = [np.array([]),np.array([]),np.array([])] #Loop batches for i in range(3): for batch in range(ITERATIONS): if i==0: #学習 batch_size = param.batch_size else: #検証・テスト batch_size = batchsize_test dataset_batch[i] = dataset[i][batch*batch_size:(batch+1)*batch_size] if i==0: dataset_batch[0] = dataset[0][batch*param.batch_size:(batch+1)*param.batch_size] else: dataset_batch[i] = dataset[i][batch*batchsize_test:(batch+1)*batchsize_test] seq_loop = param.sequence_size if i == 0: loss_calculator.model.reset_lstm(32) else: loss_calculator.model.reset_lstm(4) for seq in range(seq_loop): dataset_seq_ = dataset_batch[i][:,seq] #シーケンスから1つ抜き出し (batch, datas) values = dataset_seq_[:,:len(param.use_value)].astype(dtype=np.float32) #数値データ抜き出し t = dataset_seq_[:,len(param.use_value)].astype(dtype=np.float32) # Loss計算用t (教師データ) t_not_norm = dataset_seq_[:,len(param.use_value)+1].astype(dtype=np.float32) # 評価用t t = t[:,np.newaxis] if seq == seq_loop-1: t_save[i] = np.concatenate((t_save[i], t_not_norm)) images = dataset_seq_[:, -1] #画像名抽出 images = np.array(module.data_file.load_image(images, picsize).astype(dtype=np.float32)) dataset_input = (values, images, t) #数値データ,画像データ,教師データ if i==0: loss, y = loss_calculator(dataset_input[0],dataset_input[1], dataset_input[2]) loss_model += loss #メモリ不足回避 else: loss, y = loss_calculator(dataset_input[0],dataset_input[1], dataset_input[2], train=False)#train=Falseで推論モード y = y.flatten() if seq == seq_loop-1: y_save[i] = np.concatenate((y_save[i],y)) count_loss += 1 loss_calculator.zero_grad() if i==0: loss_model.backward(retain_graph=True) del loss_model torch.cuda.empty_cache()        optimizer.step() #評価 elapsed = datetime.datetime.now() - st elapsed_per_epoch = datetime.datetime.now() - now now = datetime.datetime.now() module.output.print_file([" EPOCH:", epoch+1, "/ TIME:", elapsed, now], file_log) module.output.print_file([" Next epoch will be finished at", now+elapsed_per_epoch], file_log) Label = ["Train", "Validation", "Test"] save_model = False for i in range(3): accuracy, score, score_jma, accuracy_table, loss_cal = module.module_evaluate.evaluate_v2(y_save[i], t_save[i], param) module.output.print_file([Label[i], " / Loss:", loss_cal, "/ Accuracy:", accuracy,"/ Score:", score,"/ Score JMA:",score_jma,"/ Accuracy table is shown..."], file_log) module.output.print_file([accuracy_table], file_log) accuracy_plot[i].append(accuracy) loss_plot[i].append(loss_cal) score_plot[i].append(score) score_jma_plot[i].append(score_jma) module.output.draw_train_graph(out_dir+"accuracy.png","accuracy",accuracy_plot[0],accuracy_plot[1],accuracy_plot[2]) #12/17 l386~389に~plot[2]追加 module.output.draw_train_graph(out_dir+"loss.png","loss",loss_plot[0],loss_plot[1],loss_plot[2]) module.output.draw_train_graph(out_dir+"score.png", "score", score_plot[0], score_plot[1],score_plot[2]) module.output.draw_train_graph(out_dir+"score_jma.png", "score_jma", score_jma_plot[0], score_jma_plot[1],score_jma_plot[2]) graph_data = [accuracy_plot, loss_plot, score_plot, score_jma_plot] np.save(out_dir+"graph_plot_data", graph_data) print("training finish") file = open(out_dir+"finished.txt", "w") file.close() if __name__ == "__main__": param = parameter(ResNetLSTM_model_id) #constant.pyから読み込み param.docker = False param.model_type = Regression param.forecast_time = 120 param.max_epoch = 150 param.r_max = 20 param.sequence_size = 10 param.time_sequence = 30 param.panorama = True param.log_norm = False param.max_dataset =5000 param.data_rate = [8,1,1] param.num_of_directories = 5 param.adjust_all = False #格納ファイルづくり now = datetime.datetime.now() now = 1 out_dir = "result/output/" out_dir += str(now) + "/" main(param,out_dir)

コメントを投稿

0 コメント