diff --git a/Train.ipynb b/Train.ipynb index f3ed067..f582391 100644 --- a/Train.ipynb +++ b/Train.ipynb @@ -15,7 +15,7 @@ "\n", "import config\n", "import utils\n", - "import main_classificaiton as mc" + "import main_regression as mr" ] }, { @@ -37,28 +37,65 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 21, + "id": "877996be", + "metadata": {}, + "outputs": [], + "source": [ + "import glob\n", + "import os\n", + "\n", + "def Saver(model_name):\n", + "\n", + " os.makedirs('./ckpt', exist_ok=True)\n", + " os.makedirs('./ckpt/' + model_name, exist_ok=True)\n", + " \n", + " model_dir_path = './ckpt/' + model_name\n", + " runs = sorted(glob.glob(os.path.join('./', model_name, '/experiment_*')))\n", + " indices = []\n", + " for tmp in runs:\n", + " tmp_num = tmp.split(\"\\\\\")[-1]\n", + " tmp_num = int(tmp_num.split(\"_\")[-1])\n", + " indices.append(tmp_num)\n", + " \n", + " if len(indices) == 0:\n", + " run_id = str(0)\n", + " else:\n", + " run_id = np.max(indices) + 1\n", + "\n", + " experiment_dir = os.path.join(model_dir_path, '/', f'experiment_{str(run_id)}')\n", + "\n", + " os.makedirs(experiment_dir, exist_ok = True)\n", + " \n", + "\n", + " return experiment_dir" + ] + }, + { + "cell_type": "code", + "execution_count": 22, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "(7352, 9, 128)\n", - "(7352,)\n", - "(2947, 9, 128)\n", - "(2947,)\n", - "inputSize(train_x.shape[1]): 9\n", - "sequenceLenth (train_x.shape[2]): 128\n", - "Save MinMaxScaler in path: ./scaler/minmax_scaler_x.pkl\n" + "(95, 24, 144)\n", + "(95,)\n", + "(42, 24, 144)\n", + "(42,)\n", + "inputSize(train_x.shape[1]): 24\n", + "sequenceLenth (train_x.shape[2]): 144\n", + "Save MinMaxScaler in path: ./scaler/minmax_scaler_x.pkl\n", + "Save MinMaxScaler in path: ./scaler/minmax_scaler_y.pkl\n" ] } ], "source": [ "# load raw data\n", - "# [\"LSTM\", \"GRU\", \"CNN_1D\", \"LSTM_FCNs\"]는 사용 데이터가 동일하기 때문에 편의상 utils.load_data에서 model_name을 'LSTM'로 설정하여 불러온 데이터를 함께 사용함\n", + "# [\"LSTM_rg\", \"GRU_rg\", \"CNN_1D_rg\", \"LSTM_FCNs_rg\"]는 사용 데이터가 동일하기 때문에 편의상 utils.load_data에서 model_name을 'LSTM_rg'로 설정하여 불러온 데이터를 함께 사용함\n", "data_root_dir = './data/'\n", - "train_x, train_y, test_x, test_y = utils.load_data(data_root_dir, model_name='LSTM') # shape=(num_of_instance, input_dims, time_steps)\n", + "train_x, train_y, test_x, test_y = utils.load_data(data_root_dir, model_name='LSTM_rg') # shape=(num_of_instance, input_dims, time_steps)\n", "\n", "# split train data into train/valiation data\n", "# train data를 랜덤으로 test_size=split_ratio에 대하여 train/validation set으로 분할 (관측치 단위 데이터)\n", @@ -67,12 +104,14 @@ "\n", "# normalization\n", "scaler_x_path = './scaler/minmax_scaler_x.pkl'\n", - "train_x, valid_x = utils.get_train_val_data(train_x, valid_x, scaler_x_path)" + "scaler_y_path = './scaler/minmax_scaler_y.pkl'\n", + "train_x, valid_x = utils.get_train_val_data(train_x, valid_x, scaler_x_path)\n", + "train_y, valid_y = utils.get_train_val_data(train_y, valid_y, scaler_y_path)" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 24, "metadata": { "scrolled": true }, @@ -81,85 +120,34 @@ "name": "stdout", "output_type": "stream", "text": [ - "Start training model: LSTM\n", - "\n", - "Epoch 1/150\n", - "train Loss: 1.7860 Acc: 0.2268\n", - "val Loss: 1.7782 Acc: 0.1903\n", - "\n", - "Epoch 10/150\n", - "train Loss: 1.0381 Acc: 0.5348\n", - "val Loss: 1.0081 Acc: 0.5364\n", - "\n", - "Epoch 20/150\n", - "train Loss: 0.9961 Acc: 0.5482\n", - "val Loss: 1.0043 Acc: 0.5398\n", - "\n", - "Epoch 30/150\n", - "train Loss: 0.9771 Acc: 0.5533\n", - "val Loss: 0.9687 Acc: 0.5574\n", - "\n", - "Epoch 40/150\n", - "train Loss: 0.9759 Acc: 0.5599\n", - "val Loss: 0.9543 Acc: 0.5554\n", - "\n", - "Epoch 50/150\n", - "train Loss: 0.9517 Acc: 0.5666\n", - "val Loss: 0.9388 Acc: 0.5697\n", - "\n", - "Epoch 60/150\n", - "train Loss: 0.9573 Acc: 0.5698\n", - "val Loss: 0.9812 Acc: 0.5534\n", - "\n", - "Epoch 70/150\n", - "train Loss: 0.9433 Acc: 0.5718\n", - "val Loss: 0.9271 Acc: 0.5717\n", - "\n", - "Epoch 80/150\n", - "train Loss: 0.9461 Acc: 0.5739\n", - "val Loss: 0.9663 Acc: 0.5506\n", - "\n", - "Epoch 90/150\n", - "train Loss: 0.9134 Acc: 0.5980\n", - "val Loss: 0.8862 Acc: 0.5908\n", - "\n", - "Epoch 100/150\n", - "train Loss: 0.8907 Acc: 0.6058\n", - "val Loss: 0.8716 Acc: 0.6071\n", + "Start training model: LSTM_rg\n", "\n", - "Epoch 110/150\n", - "train Loss: 0.9150 Acc: 0.5990\n", - "val Loss: 0.9410 Acc: 0.5778\n", + "Epoch 1/100\n", + "train Loss: 0.0566\n", + "val Loss: 0.0569\n", "\n", - "Epoch 120/150\n", - "train Loss: 0.4736 Acc: 0.8242\n", - "val Loss: 0.4536 Acc: 0.8307\n", + "Epoch 50/100\n", + "train Loss: 0.0434\n", + "val Loss: 0.0434\n", "\n", - "Epoch 130/150\n", - "train Loss: 0.3744 Acc: 0.8536\n", - "val Loss: 0.3544 Acc: 0.8511\n", + "Epoch 100/100\n", + "train Loss: 0.0326\n", + "val Loss: 0.0346\n", "\n", - "Epoch 140/150\n", - "train Loss: 0.3119 Acc: 0.8786\n", - "val Loss: 0.3006 Acc: 0.8749\n", - "\n", - "Epoch 150/150\n", - "train Loss: 0.2581 Acc: 0.8978\n", - "val Loss: 0.2512 Acc: 0.8973\n", - "\n", - "Training complete in 2m 8s\n", - "Best val Acc: 0.899388\n" + "Training complete in 0m 5s\n", + "Best val MSE: 0.034624\n" ] } ], "source": [ "# Case 1. LSTM model (w/o data representation)\n", - "model_name = 'LSTM'\n", + "model_name = 'LSTM_rg'\n", "model_params = config.model_config[model_name]\n", "\n", - "data_cls = mc.Classification(model_params)\n", - "best_model = data_cls.train_model(train_x, train_y, valid_x, valid_y) # 모델 학습\n", - "data_cls.save_model(best_model, best_model_path=model_params[\"best_model_path\"]) # 모델 저장" + "exp_path = Saver(model_name)\n", + "data_reg = mr.Regression(model_params)\n", + "best_model = data_reg.train_model(train_x, train_y, valid_x, valid_y) # 모델 학습\n", + "data_reg.save_model(best_model, best_model_path=os.path.join(exp_path, model_params[\"best_model\"])) # 모델 저장" ] }, { @@ -173,85 +161,106 @@ "name": "stdout", "output_type": "stream", "text": [ - "Start training model: GRU\n", + "Start training model: GRU_rg\n", + "\n", + "Epoch 1/1000\n", + "train Loss: 0.0489\n", + "val Loss: 0.0434\n", + "\n", + "Epoch 50/1000\n", + "train Loss: 0.0342\n", + "val Loss: 0.0434\n", + "\n", + "Epoch 100/1000\n", + "train Loss: 0.0218\n", + "val Loss: 0.0316\n", + "\n", + "Epoch 150/1000\n", + "train Loss: 0.0187\n", + "val Loss: 0.0232\n", "\n", - "Epoch 1/150\n", - "train Loss: 1.7731 Acc: 0.1916\n", - "val Loss: 1.7537 Acc: 0.1903\n", + "Epoch 200/1000\n", + "train Loss: 0.0160\n", + "val Loss: 0.0187\n", "\n", - "Epoch 10/150\n", - "train Loss: 1.0544 Acc: 0.5222\n", - "val Loss: 1.0374 Acc: 0.5255\n", + "Epoch 250/1000\n", + "train Loss: 0.0149\n", + "val Loss: 0.0210\n", "\n", - "Epoch 20/150\n", - "train Loss: 1.0031 Acc: 0.5485\n", - "val Loss: 0.9924 Acc: 0.5472\n", + "Epoch 300/1000\n", + "train Loss: 0.0141\n", + "val Loss: 0.0207\n", "\n", - "Epoch 30/150\n", - "train Loss: 0.9822 Acc: 0.5562\n", - "val Loss: 0.9828 Acc: 0.5520\n", + "Epoch 350/1000\n", + "train Loss: 0.0120\n", + "val Loss: 0.0214\n", "\n", - "Epoch 40/150\n", - "train Loss: 0.9771 Acc: 0.5650\n", - "val Loss: 0.9612 Acc: 0.5602\n", + "Epoch 400/1000\n", + "train Loss: 0.0104\n", + "val Loss: 0.0217\n", "\n", - "Epoch 50/150\n", - "train Loss: 0.9622 Acc: 0.5676\n", - "val Loss: 0.9475 Acc: 0.5765\n", + "Epoch 450/1000\n", + "train Loss: 0.0092\n", + "val Loss: 0.0194\n", "\n", - "Epoch 60/150\n", - "train Loss: 0.9493 Acc: 0.5732\n", - "val Loss: 0.9281 Acc: 0.5819\n", + "Epoch 500/1000\n", + "train Loss: 0.0081\n", + "val Loss: 0.0173\n", "\n", - "Epoch 70/150\n", - "train Loss: 0.9316 Acc: 0.5834\n", - "val Loss: 0.9118 Acc: 0.5887\n", + "Epoch 550/1000\n", + "train Loss: 0.0074\n", + "val Loss: 0.0167\n", "\n", - "Epoch 80/150\n", - "train Loss: 0.9022 Acc: 0.6007\n", - "val Loss: 0.8824 Acc: 0.6044\n", + "Epoch 600/1000\n", + "train Loss: 0.0066\n", + "val Loss: 0.0169\n", "\n", - "Epoch 90/150\n", - "train Loss: 0.6534 Acc: 0.7789\n", - "val Loss: 0.6194 Acc: 0.7587\n", + "Epoch 650/1000\n", + "train Loss: 0.0058\n", + "val Loss: 0.0166\n", "\n", - "Epoch 100/150\n", - "train Loss: 0.3516 Acc: 0.8764\n", - "val Loss: 0.3273 Acc: 0.8797\n", + "Epoch 700/1000\n", + "train Loss: 0.0074\n", + "val Loss: 0.0194\n", "\n", - "Epoch 110/150\n", - "train Loss: 0.2687 Acc: 0.9004\n", - "val Loss: 0.2482 Acc: 0.9062\n", + "Epoch 750/1000\n", + "train Loss: 0.0053\n", + "val Loss: 0.0207\n", "\n", - "Epoch 120/150\n", - "train Loss: 0.2203 Acc: 0.9162\n", - "val Loss: 0.2025 Acc: 0.9198\n", + "Epoch 800/1000\n", + "train Loss: 0.0043\n", + "val Loss: 0.0209\n", "\n", - "Epoch 130/150\n", - "train Loss: 0.1857 Acc: 0.9259\n", - "val Loss: 0.1803 Acc: 0.9252\n", + "Epoch 850/1000\n", + "train Loss: 0.0041\n", + "val Loss: 0.0283\n", "\n", - "Epoch 140/150\n", - "train Loss: 0.1727 Acc: 0.9306\n", - "val Loss: 0.1688 Acc: 0.9279\n", + "Epoch 900/1000\n", + "train Loss: 0.0038\n", + "val Loss: 0.0195\n", "\n", - "Epoch 150/150\n", - "train Loss: 0.1578 Acc: 0.9359\n", - "val Loss: 0.1551 Acc: 0.9361\n", + "Epoch 950/1000\n", + "train Loss: 0.0052\n", + "val Loss: 0.0222\n", "\n", - "Training complete in 2m 5s\n", - "Best val Acc: 0.936098\n" + "Epoch 1000/1000\n", + "train Loss: 0.0034\n", + "val Loss: 0.0215\n", + "\n", + "Training complete in 0m 50s\n", + "Best val MSE: 0.013994\n" ] } ], "source": [ "# Case 2. GRU (w/o data representation)\n", - "model_name = 'GRU'\n", + "model_name = 'GRU_rg'\n", "model_params = config.model_config[model_name]\n", "\n", - "data_cls = mc.Classification(model_params)\n", - "best_model = data_cls.train_model(train_x, train_y, valid_x, valid_y) # 모델 학습\n", - "data_cls.save_model(best_model, best_model_path=model_params[\"best_model_path\"]) # 모델 저장" + "exp_path = Saver(model_name)\n", + "data_reg = mr.Regression(model_params)\n", + "best_model = data_reg.train_model(train_x, train_y, valid_x, valid_y) # 모델 학습\n", + "data_reg.save_model(best_model, best_model_path=os.path.join(exp_path, model_params[\"best_model\"])) # 모델 저장" ] }, { @@ -265,85 +274,106 @@ "name": "stdout", "output_type": "stream", "text": [ - "Start training model: CNN_1D\n", + "Start training model: CNN_1D_rg\n", + "\n", + "Epoch 1/1000\n", + "train Loss: 0.0499\n", + "val Loss: 0.0436\n", + "\n", + "Epoch 50/1000\n", + "train Loss: 0.0363\n", + "val Loss: 0.0441\n", + "\n", + "Epoch 100/1000\n", + "train Loss: 0.0315\n", + "val Loss: 0.0448\n", + "\n", + "Epoch 150/1000\n", + "train Loss: 0.0270\n", + "val Loss: 0.0450\n", "\n", - "Epoch 1/150\n", - "train Loss: 1.7472 Acc: 0.3323\n", - "val Loss: 1.6865 Acc: 0.3494\n", + "Epoch 200/1000\n", + "train Loss: 0.0238\n", + "val Loss: 0.0458\n", "\n", - "Epoch 10/150\n", - "train Loss: 0.8122 Acc: 0.7369\n", - "val Loss: 0.7855 Acc: 0.7362\n", + "Epoch 250/1000\n", + "train Loss: 0.0187\n", + "val Loss: 0.0479\n", "\n", - "Epoch 20/150\n", - "train Loss: 0.5346 Acc: 0.8164\n", - "val Loss: 0.5212 Acc: 0.8015\n", + "Epoch 300/1000\n", + "train Loss: 0.0160\n", + "val Loss: 0.0483\n", "\n", - "Epoch 30/150\n", - "train Loss: 0.4605 Acc: 0.8235\n", - "val Loss: 0.4499 Acc: 0.8253\n", + "Epoch 350/1000\n", + "train Loss: 0.0132\n", + "val Loss: 0.0493\n", "\n", - "Epoch 40/150\n", - "train Loss: 0.4274 Acc: 0.8322\n", - "val Loss: 0.4142 Acc: 0.8368\n", + "Epoch 400/1000\n", + "train Loss: 0.0107\n", + "val Loss: 0.0495\n", "\n", - "Epoch 50/150\n", - "train Loss: 0.4071 Acc: 0.8391\n", - "val Loss: 0.3944 Acc: 0.8498\n", + "Epoch 450/1000\n", + "train Loss: 0.0083\n", + "val Loss: 0.0484\n", "\n", - "Epoch 60/150\n", - "train Loss: 0.3847 Acc: 0.8444\n", - "val Loss: 0.3875 Acc: 0.8287\n", + "Epoch 500/1000\n", + "train Loss: 0.0071\n", + "val Loss: 0.0490\n", "\n", - "Epoch 70/150\n", - "train Loss: 0.3733 Acc: 0.8507\n", - "val Loss: 0.3694 Acc: 0.8477\n", + "Epoch 550/1000\n", + "train Loss: 0.0061\n", + "val Loss: 0.0485\n", "\n", - "Epoch 80/150\n", - "train Loss: 0.3632 Acc: 0.8570\n", - "val Loss: 0.3612 Acc: 0.8484\n", + "Epoch 600/1000\n", + "train Loss: 0.0049\n", + "val Loss: 0.0483\n", "\n", - "Epoch 90/150\n", - "train Loss: 0.3534 Acc: 0.8575\n", - "val Loss: 0.3512 Acc: 0.8518\n", + "Epoch 650/1000\n", + "train Loss: 0.0038\n", + "val Loss: 0.0495\n", "\n", - "Epoch 100/150\n", - "train Loss: 0.3443 Acc: 0.8641\n", - "val Loss: 0.3343 Acc: 0.8654\n", + "Epoch 700/1000\n", + "train Loss: 0.0034\n", + "val Loss: 0.0503\n", "\n", - "Epoch 110/150\n", - "train Loss: 0.3330 Acc: 0.8706\n", - "val Loss: 0.3309 Acc: 0.8640\n", + "Epoch 750/1000\n", + "train Loss: 0.0034\n", + "val Loss: 0.0501\n", "\n", - "Epoch 120/150\n", - "train Loss: 0.3227 Acc: 0.8738\n", - "val Loss: 0.3161 Acc: 0.8708\n", + "Epoch 800/1000\n", + "train Loss: 0.0028\n", + "val Loss: 0.0518\n", "\n", - "Epoch 130/150\n", - "train Loss: 0.3161 Acc: 0.8743\n", - "val Loss: 0.3134 Acc: 0.8613\n", + "Epoch 850/1000\n", + "train Loss: 0.0021\n", + "val Loss: 0.0517\n", "\n", - "Epoch 140/150\n", - "train Loss: 0.3044 Acc: 0.8806\n", - "val Loss: 0.3083 Acc: 0.8640\n", + "Epoch 900/1000\n", + "train Loss: 0.0016\n", + "val Loss: 0.0506\n", "\n", - "Epoch 150/150\n", - "train Loss: 0.2953 Acc: 0.8811\n", - "val Loss: 0.2982 Acc: 0.8831\n", + "Epoch 950/1000\n", + "train Loss: 0.0016\n", + "val Loss: 0.0515\n", "\n", - "Training complete in 0m 29s\n", - "Best val Acc: 0.886472\n" + "Epoch 1000/1000\n", + "train Loss: 0.0018\n", + "val Loss: 0.0512\n", + "\n", + "Training complete in 0m 10s\n", + "Best val MSE: 0.042776\n" ] } ], "source": [ "# Case 3. CNN_1D (w/o data representation)\n", - "model_name = 'CNN_1D'\n", + "model_name = 'CNN_1D_rg'\n", "model_params = config.model_config[model_name]\n", "\n", - "data_cls = mc.Classification(model_params)\n", - "best_model = data_cls.train_model(train_x, train_y, valid_x, valid_y) # 모델 학습\n", - "data_cls.save_model(best_model, best_model_path=model_params[\"best_model_path\"]) # 모델 저장" + "exp_path = Saver(model_name)\n", + "data_reg = mr.Regression(model_params)\n", + "best_model = data_reg.train_model(train_x, train_y, valid_x, valid_y) # 모델 학습\n", + "data_reg.save_model(best_model, best_model_path=os.path.join(exp_path, model_params[\"best_model\"])) # 모델 저장" ] }, { @@ -357,85 +387,106 @@ "name": "stdout", "output_type": "stream", "text": [ - "Start training model: LSTM_FCNs\n", + "Start training model: LSTM_FCNs_rg\n", + "\n", + "Epoch 1/1000\n", + "train Loss: 0.0531\n", + "val Loss: 0.0456\n", + "\n", + "Epoch 50/1000\n", + "train Loss: 0.0156\n", + "val Loss: 0.0420\n", + "\n", + "Epoch 100/1000\n", + "train Loss: 0.0070\n", + "val Loss: 0.0409\n", + "\n", + "Epoch 150/1000\n", + "train Loss: 0.0034\n", + "val Loss: 0.0337\n", + "\n", + "Epoch 200/1000\n", + "train Loss: 0.0036\n", + "val Loss: 0.0366\n", "\n", - "Epoch 1/150\n", - "train Loss: 1.4998 Acc: 0.7123\n", - "val Loss: 1.3969 Acc: 0.7682\n", + "Epoch 250/1000\n", + "train Loss: 0.0030\n", + "val Loss: 0.0375\n", "\n", - "Epoch 10/150\n", - "train Loss: 0.4978 Acc: 0.9379\n", - "val Loss: 0.4642 Acc: 0.9483\n", + "Epoch 300/1000\n", + "train Loss: 0.0046\n", + "val Loss: 0.0367\n", "\n", - "Epoch 20/150\n", - "train Loss: 0.3371 Acc: 0.9515\n", - "val Loss: 0.2842 Acc: 0.9579\n", + "Epoch 350/1000\n", + "train Loss: 0.0025\n", + "val Loss: 0.0396\n", "\n", - "Epoch 30/150\n", - "train Loss: 0.1591 Acc: 0.9549\n", - "val Loss: 0.1580 Acc: 0.9572\n", + "Epoch 400/1000\n", + "train Loss: 0.0018\n", + "val Loss: 0.0368\n", "\n", - "Epoch 40/150\n", - "train Loss: 0.1276 Acc: 0.9607\n", - "val Loss: 0.1133 Acc: 0.9592\n", + "Epoch 450/1000\n", + "train Loss: 0.0023\n", + "val Loss: 0.0320\n", "\n", - "Epoch 50/150\n", - "train Loss: 0.1059 Acc: 0.9626\n", - "val Loss: 0.1027 Acc: 0.9613\n", + "Epoch 500/1000\n", + "train Loss: 0.0029\n", + "val Loss: 0.0358\n", "\n", - "Epoch 60/150\n", - "train Loss: 0.0929 Acc: 0.9663\n", - "val Loss: 0.0938 Acc: 0.9680\n", + "Epoch 550/1000\n", + "train Loss: 0.0013\n", + "val Loss: 0.0368\n", "\n", - "Epoch 70/150\n", - "train Loss: 0.0834 Acc: 0.9655\n", - "val Loss: 0.1311 Acc: 0.9477\n", + "Epoch 600/1000\n", + "train Loss: 0.0021\n", + "val Loss: 0.0345\n", "\n", - "Epoch 80/150\n", - "train Loss: 0.0788 Acc: 0.9679\n", - "val Loss: 0.2269 Acc: 0.9048\n", + "Epoch 650/1000\n", + "train Loss: 0.0013\n", + "val Loss: 0.0329\n", "\n", - "Epoch 90/150\n", - "train Loss: 0.0762 Acc: 0.9660\n", - "val Loss: 0.0718 Acc: 0.9680\n", + "Epoch 700/1000\n", + "train Loss: 0.0006\n", + "val Loss: 0.0340\n", "\n", - "Epoch 100/150\n", - "train Loss: 0.0748 Acc: 0.9689\n", - "val Loss: 0.0922 Acc: 0.9579\n", + "Epoch 750/1000\n", + "train Loss: 0.0021\n", + "val Loss: 0.0347\n", "\n", - "Epoch 110/150\n", - "train Loss: 0.0723 Acc: 0.9685\n", - "val Loss: 0.0696 Acc: 0.9680\n", + "Epoch 800/1000\n", + "train Loss: 0.0028\n", + "val Loss: 0.0356\n", "\n", - "Epoch 120/150\n", - "train Loss: 0.0654 Acc: 0.9721\n", - "val Loss: 0.3229 Acc: 0.8708\n", + "Epoch 850/1000\n", + "train Loss: 0.0009\n", + "val Loss: 0.0295\n", "\n", - "Epoch 130/150\n", - "train Loss: 0.0666 Acc: 0.9725\n", - "val Loss: 0.1340 Acc: 0.9375\n", + "Epoch 900/1000\n", + "train Loss: 0.0010\n", + "val Loss: 0.0311\n", "\n", - "Epoch 140/150\n", - "train Loss: 0.0603 Acc: 0.9728\n", - "val Loss: 0.0778 Acc: 0.9667\n", + "Epoch 950/1000\n", + "train Loss: 0.0006\n", + "val Loss: 0.0310\n", "\n", - "Epoch 150/150\n", - "train Loss: 0.0604 Acc: 0.9723\n", - "val Loss: 0.1095 Acc: 0.9606\n", + "Epoch 1000/1000\n", + "train Loss: 0.0008\n", + "val Loss: 0.0324\n", "\n", - "Training complete in 1m 34s\n", - "Best val Acc: 0.974847\n" + "Training complete in 0m 46s\n", + "Best val MSE: 0.026001\n" ] } ], "source": [ "# Case 4. LSTM_FCNs (w/o data representation)\n", - "model_name = 'LSTM_FCNs'\n", + "model_name = 'LSTM_FCNs_rg'\n", "model_params = config.model_config[model_name]\n", "\n", - "data_cls = mc.Classification(model_params)\n", - "best_model = data_cls.train_model(train_x, train_y, valid_x, valid_y) # 모델 학습\n", - "data_cls.save_model(best_model, best_model_path=model_params[\"best_model_path\"]) # 모델 저장" + "exp_path = Saver(model_name)\n", + "data_reg = mr.Regression(model_params)\n", + "best_model = data_reg.train_model(train_x, train_y, valid_x, valid_y) # 모델 학습\n", + "data_reg.save_model(best_model, best_model_path=os.path.join(exp_path, model_params[\"best_model\"])) # 모델 저장" ] }, { @@ -454,14 +505,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "Save MinMaxScaler in path: ./scaler/minmax_scaler_x_repr.pkl\n" + "Save MinMaxScaler in path: ./scaler/minmax_scaler_x_repr.pkl\n", + "Save MinMaxScaler in path: ./scaler/minmax_scaler_y_repr.pkl\n" ] } ], "source": [ "# load representation data\n", "data_root_dir = './data/'\n", - "train_x, train_y, test_x, test_y = utils.load_data(data_root_dir, model_name='FC') # shape=(num_of_instance, embedding_dim)\n", + "train_x, train_y, test_x, test_y = utils.load_data(data_root_dir, model_name='FC_rg') # shape=(num_of_instance, embedding_dim)\n", "\n", "# split train data into train/valiation data\n", "# train data를 랜덤으로 test_size=split_ratio에 대하여 train/validation set으로 분할\n", @@ -470,7 +522,9 @@ "\n", "# normalization\n", "scaler_x_path = './scaler/minmax_scaler_x_repr.pkl'\n", - "train_x, valid_x = utils.get_train_val_data(train_x, valid_x, scaler_x_path)" + "scaler_y_path = './scaler/minmax_scaler_y_repr.pkl'\n", + "train_x, valid_x = utils.get_train_val_data(train_x, valid_x, scaler_x_path)\n", + "train_y, valid_y = utils.get_train_val_data(train_y, valid_y, scaler_y_path)" ] }, { @@ -484,85 +538,106 @@ "name": "stdout", "output_type": "stream", "text": [ - "Start training model: FC\n", + "Start training model: FC_rg\n", + "\n", + "Epoch 1/1000\n", + "train Loss: 0.0522\n", + "val Loss: 0.0415\n", + "\n", + "Epoch 50/1000\n", + "train Loss: 0.0433\n", + "val Loss: 0.0345\n", + "\n", + "Epoch 100/1000\n", + "train Loss: 0.0416\n", + "val Loss: 0.0340\n", + "\n", + "Epoch 150/1000\n", + "train Loss: 0.0416\n", + "val Loss: 0.0335\n", + "\n", + "Epoch 200/1000\n", + "train Loss: 0.0392\n", + "val Loss: 0.0332\n", "\n", - "Epoch 1/150\n", - "train Loss: 1.7845 Acc: 0.1682\n", - "val Loss: 1.7542 Acc: 0.2345\n", + "Epoch 250/1000\n", + "train Loss: 0.0382\n", + "val Loss: 0.0329\n", "\n", - "Epoch 10/150\n", - "train Loss: 1.2704 Acc: 0.6596\n", - "val Loss: 1.2287 Acc: 0.6737\n", + "Epoch 300/1000\n", + "train Loss: 0.0375\n", + "val Loss: 0.0327\n", "\n", - "Epoch 20/150\n", - "train Loss: 0.8235 Acc: 0.7495\n", - "val Loss: 0.7868 Acc: 0.8389\n", + "Epoch 350/1000\n", + "train Loss: 0.0368\n", + "val Loss: 0.0325\n", "\n", - "Epoch 30/150\n", - "train Loss: 0.6276 Acc: 0.8051\n", - "val Loss: 0.5940 Acc: 0.8742\n", + "Epoch 400/1000\n", + "train Loss: 0.0361\n", + "val Loss: 0.0324\n", "\n", - "Epoch 40/150\n", - "train Loss: 0.5202 Acc: 0.8373\n", - "val Loss: 0.4832 Acc: 0.8926\n", + "Epoch 450/1000\n", + "train Loss: 0.0347\n", + "val Loss: 0.0323\n", "\n", - "Epoch 50/150\n", - "train Loss: 0.4367 Acc: 0.8708\n", - "val Loss: 0.4038 Acc: 0.9028\n", + "Epoch 500/1000\n", + "train Loss: 0.0344\n", + "val Loss: 0.0323\n", "\n", - "Epoch 60/150\n", - "train Loss: 0.3723 Acc: 0.8912\n", - "val Loss: 0.3447 Acc: 0.9164\n", + "Epoch 550/1000\n", + "train Loss: 0.0332\n", + "val Loss: 0.0323\n", "\n", - "Epoch 70/150\n", - "train Loss: 0.3287 Acc: 0.8978\n", - "val Loss: 0.2992 Acc: 0.9211\n", + "Epoch 600/1000\n", + "train Loss: 0.0327\n", + "val Loss: 0.0323\n", "\n", - "Epoch 80/150\n", - "train Loss: 0.2944 Acc: 0.9112\n", - "val Loss: 0.2645 Acc: 0.9259\n", + "Epoch 650/1000\n", + "train Loss: 0.0309\n", + "val Loss: 0.0323\n", "\n", - "Epoch 90/150\n", - "train Loss: 0.2663 Acc: 0.9170\n", - "val Loss: 0.2383 Acc: 0.9320\n", + "Epoch 700/1000\n", + "train Loss: 0.0285\n", + "val Loss: 0.0324\n", "\n", - "Epoch 100/150\n", - "train Loss: 0.2400 Acc: 0.9267\n", - "val Loss: 0.2173 Acc: 0.9334\n", + "Epoch 750/1000\n", + "train Loss: 0.0298\n", + "val Loss: 0.0325\n", "\n", - "Epoch 110/150\n", - "train Loss: 0.2243 Acc: 0.9286\n", - "val Loss: 0.2009 Acc: 0.9368\n", + "Epoch 800/1000\n", + "train Loss: 0.0284\n", + "val Loss: 0.0327\n", "\n", - "Epoch 120/150\n", - "train Loss: 0.2131 Acc: 0.9289\n", - "val Loss: 0.1885 Acc: 0.9402\n", + "Epoch 850/1000\n", + "train Loss: 0.0279\n", + "val Loss: 0.0327\n", "\n", - "Epoch 130/150\n", - "train Loss: 0.2020 Acc: 0.9303\n", - "val Loss: 0.1785 Acc: 0.9443\n", + "Epoch 900/1000\n", + "train Loss: 0.0287\n", + "val Loss: 0.0328\n", "\n", - "Epoch 140/150\n", - "train Loss: 0.1910 Acc: 0.9335\n", - "val Loss: 0.1705 Acc: 0.9456\n", + "Epoch 950/1000\n", + "train Loss: 0.0297\n", + "val Loss: 0.0330\n", "\n", - "Epoch 150/150\n", - "train Loss: 0.1821 Acc: 0.9362\n", - "val Loss: 0.1633 Acc: 0.9456\n", + "Epoch 1000/1000\n", + "train Loss: 0.0247\n", + "val Loss: 0.0331\n", "\n", - "Training complete in 0m 17s\n", - "Best val Acc: 0.947655\n" + "Training complete in 0m 6s\n", + "Best val MSE: 0.032240\n" ] } ], "source": [ "# Case 5. fully-connected layers (w/ data representation)\n", - "model_name = 'FC'\n", + "model_name = 'FC_rg'\n", "model_params = config.model_config[model_name]\n", "\n", - "data_cls = mc.Classification(model_params)\n", - "best_model = data_cls.train_model(train_x, train_y, valid_x, valid_y) # 모델 학습\n", - "data_cls.save_model(best_model, best_model_path=model_params[\"best_model_path\"]) # 모델 저장" + "exp_path = Saver(model_name)\n", + "data_reg = mr.Regression(model_params)\n", + "best_model = data_reg.train_model(train_x, train_y, valid_x, valid_y) # 모델 학습\n", + "data_reg.save_model(best_model, best_model_path=os.path.join(exp_path, model_params[\"best_model\"])) # 모델 저장" ] }, { @@ -575,9 +650,9 @@ ], "metadata": { "kernelspec": { - "display_name": "iitp_time_serise", + "display_name": "Python 3.7.13 ('hwang')", "language": "python", - "name": "iitp" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -589,7 +664,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.11" + "version": "3.7.13" }, "toc": { "base_numbering": 1, @@ -606,7 +681,7 @@ }, "vscode": { "interpreter": { - "hash": "448579598765c533641c9414ab2d5f7dc2c763c0bd653033bda6f4c5cb841b26" + "hash": "4f311b633f277f5e4d199db5715cd5ecdec0742926e2e6ae6b04aa7fd42957fc" } } }, diff --git a/config.py b/config.py index 52694bf..eeedbf4 100644 --- a/config.py +++ b/config.py @@ -1,7 +1,7 @@ model_config = { 'LSTM' : { # Case 1. LSTM model (w/o data representation) 'model': 'LSTM', - 'best_model_path': './ckpt/lstm.pt', # 학습 완료 모델 저장 경로 + 'best_model': 'lstm.pt', # 학습 완료 모델 저장 경로 'parameter': { 'input_size': 9, # 데이터의 변수 개수, int 'num_classes': 6, # 분류할 class 개수, int @@ -17,7 +17,7 @@ }, 'GRU' : { # Case 2. GRU model (w/o data representation) 'model': 'GRU', - 'best_model_path': './ckpt/gru.pt', # 학습 완료 모델 저장 경로 + 'best_model': 'gru.pt', # 학습 완료 모델 저장 경로 'parameter': { 'input_size': 9, # 데이터의 변수 개수, int 'num_classes': 6, # 분류할 class 개수, int @@ -33,7 +33,7 @@ }, 'CNN_1D' : { # Case 3. CNN_1D model (w/o data representation) 'model': 'CNN_1D', - 'best_model_path': './ckpt/cnn_1d.pt', # 학습 완료 모델 저장 경로 + 'best_model': 'cnn_1d.pt', # 학습 완료 모델 저장 경로 'parameter': { 'input_size': 9, # 데이터의 변수 개수, int 'num_classes': 6, # 분류할 class 개수, int @@ -51,7 +51,7 @@ }, 'LSTM_FCNs' : { # Case 4. LSTM_FCNs model (w/o data representation) 'model': 'LSTM_FCNs', - 'best_model_path': './ckpt/lstm_fcn.pt', # 학습 완료 모델 저장 경로 + 'best_model': 'lstm_fcn.pt', # 학습 완료 모델 저장 경로 'parameter': { 'input_size': 9, # 데이터의 변수 개수, int 'num_classes': 6, # 분류할 class 개수, int @@ -66,7 +66,7 @@ }, 'FC' : { # Case 5. fully-connected layers (w/ data representation) 'model': 'FC', - "best_model_path": './ckpt/fc.pt', # 학습 완료 모델 저장 경로 + "best_model": 'fc.pt', # 학습 완료 모델 저장 경로 'parameter': { 'input_size': 64, # 데이터의 변수 개수(representation 차원), int 'num_classes': 6, # 분류할 class 개수, int