From 27d40ab56cb72ad82a61ae588c4a342004d03654 Mon Sep 17 00:00:00 2001 From: jung-geun Date: Wed, 24 May 2023 14:00:31 +0900 Subject: [PATCH] =?UTF-8?q?23-05-24=20pso=20=EC=95=8C=EA=B3=A0=EB=A6=AC?= =?UTF-8?q?=EC=A6=98=EC=9D=84=20=EA=B5=AC=ED=98=84=ED=95=98=EB=8A=94?= =?UTF-8?q?=EB=8D=B0=20bp=20=EB=A5=BC=20=EC=99=84=EC=A0=84=ED=9E=88=20?= =?UTF-8?q?=EB=B0=B0=EC=A0=9C=ED=95=98=EB=8A=94=20=EB=B0=A9=EB=B2=95?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EA=B5=AC=ED=98=84=20model=20=EB=94=94?= =?UTF-8?q?=EB=A0=89=ED=86=A0=EB=A6=AC=EB=A5=BC=20=EC=9E=90=EB=8F=99?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=83=9D=EC=84=B1=ED=95=98=EA=B2=8C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mnist.ipynb | 847 ++++++++++++++++++++++++++++++++++++------ mnist.py | 136 +++++++ pso_bp.py | 280 ++++++++++++++ pso.py => pso_meta.py | 0 pso_tf.py | 76 ++-- pso_tuning.py | 155 ++++++++ readme.md | 14 +- readme.png | Bin 0 -> 228442 bytes xor.ipynb | 400 +++++++++----------- 9 files changed, 1556 insertions(+), 352 deletions(-) create mode 100644 mnist.py create mode 100644 pso_bp.py rename pso.py => pso_meta.py (100%) create mode 100644 pso_tuning.py create mode 100644 readme.png diff --git a/mnist.ipynb b/mnist.ipynb index c58e0dc..441e108 100644 --- a/mnist.ipynb +++ b/mnist.ipynb @@ -4,13 +4,15 @@ "cell_type": "code", "execution_count": 1, "id": "8a637c69-9071-4012-ac1e-93037548b3e9", - "metadata": {}, + "metadata": { + "tags": [] + }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ - "2023-05-21 03:38:18.127052: E tensorflow/stream_executor/cuda/cuda_blas.cc:2981] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n" + "2023-05-24 12:58:36.275491: E tensorflow/stream_executor/cuda/cuda_blas.cc:2981] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n" ] }, { @@ -26,22 +28,24 @@ "import os\n", "os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'\n", "\n", - "from pso_tf import PSO\n", - "\n", - "import numpy as np\n", - "\n", "import tensorflow as tf\n", - "from tensorflow import keras\n", - "tf.random.set_seed(777) # for reproducibility\n", + "# tf.random.set_seed(777) # for reproducibility\n", "\n", + "from tensorflow import keras\n", "from keras.datasets import mnist\n", "from keras.models import Sequential\n", "from keras.layers import Dense, Dropout, Flatten\n", "from keras.layers import Conv2D, MaxPooling2D\n", "from keras import backend as K\n", "\n", + "from pso_tf import PSO\n", + "\n", + "import numpy as np\n", "import matplotlib.pyplot as plt\n", + "\n", "from datetime import date\n", + "from tqdm import tqdm\n", + "import json\n", "\n", "print(tf.__version__)\n", "print(tf.config.list_physical_devices())\n", @@ -68,9 +72,7 @@ " model.add(Dense(128, activation='relu'))\n", " model.add(Dense(10, activation='softmax'))\n", "\n", - " model.compile(loss='sparse_categorical_crossentropy',optimizer='adam', metrics=['accuracy'])\n", - "\n", - " model.summary()\n", + " # model.summary()\n", "\n", " return model" ] @@ -79,41 +81,83 @@ "cell_type": "code", "execution_count": 2, "id": "a2d9891d", - "metadata": {}, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "'''\n", + "optimizer parameter\n", + "'''\n", + "lr = 0.1\n", + "momentun = 0.8\n", + "decay = 1e-04\n", + "nestrov = True\n", + "\n", + "'''\n", + "pso parameter\n", + "'''\n", + "n_particles = 30\n", + "maxiter = 50\n", + "# epochs = 1\n", + "w = 0.8\n", + "c0 = 0.6\n", + "c1 = 1.6\n", + "\n", + "def auto_tuning(n_particles=n_particles, maxiter=maxiter, c0=c0, c1=c1, w=w):\n", + " x_train, y_train, x_test, y_test = get_data()\n", + " model = make_model()\n", + "\n", + " loss = keras.losses.MeanSquaredError()\n", + " optimizer = keras.optimizers.SGD(lr=lr, momentum=momentun, decay=decay, nesterov=nestrov)\n", + "\n", + "\n", + " pso_m = PSO(model=model, loss_method=loss, n_particles=n_particles, x_train=x_train, y_train=y_train)\n", + " # c0 : 지역 최적값 중요도\n", + " # c1 : 전역 최적값 중요도\n", + " # w : 관성 (현재 속도를 유지하는 정도)\n", + " best_weights, score = pso_m.optimize(x_train, y_train, x_test, y_test, maxiter=maxiter, c0=c0, c1=c1, w=w)\n", + " model.set_weights(best_weights)\n", + "\n", + " score_ = model.evaluate(x_test, y_test, verbose=2)\n", + " print(f\" Test loss: {score_}\")\n", + " score = round(score_[1]*100, 2)\n", + "\n", + " day = date.today().strftime(\"%Y-%m-%d\")\n", + " \n", + " os.makedirs(f'./model', exist_ok=True)\n", + " model.save(f'./model/{day}_{score}_mnist.h5')\n", + " json_save = {\n", + " \"name\" : f\"{day}_{score}_mnist.h5\",\n", + " \"score\" : score_,\n", + " \"maxiter\" : maxiter,\n", + " \"c0\" : c0,\n", + " \"c1\" : c1,\n", + " \"w\" : w \n", + " }\n", + " with open(f'./model/{day}_{score}_mnist.json', 'a') as f:\n", + " json.dump(json_save, f)\n", + " f.write(',\\n')\n", + " \n", + " return model\n", + "\n", + "# auto_tuning(n_particles=30, maxiter=1000, c0=0.5, c1=1.5, w=0.75)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "1a38f3c1-8291-40d9-838e-4ffbf4578be5", + "metadata": { + "tags": [] + }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x_train : (28, 28, 1) | y_train : ()\n", - "x_test : (28, 28, 1) | y_test : ()\n", - "Model: \"sequential\"\n", - "_________________________________________________________________\n", - " Layer (type) Output Shape Param # \n", - "=================================================================\n", - " conv2d (Conv2D) (None, 24, 24, 32) 832 \n", - " \n", - " max_pooling2d (MaxPooling2D (None, 8, 8, 32) 0 \n", - " ) \n", - " \n", - " conv2d_1 (Conv2D) (None, 6, 6, 64) 18496 \n", - " \n", - " max_pooling2d_1 (MaxPooling (None, 3, 3, 64) 0 \n", - " 2D) \n", - " \n", - " dropout (Dropout) (None, 3, 3, 64) 0 \n", - " \n", - " flatten (Flatten) (None, 576) 0 \n", - " \n", - " dense (Dense) (None, 128) 73856 \n", - " \n", - " dense_1 (Dense) (None, 10) 1290 \n", - " \n", - "=================================================================\n", - "Total params: 94,474\n", - "Trainable params: 94,474\n", - "Non-trainable params: 0\n", - "_________________________________________________________________\n" + "x_test : (28, 28, 1) | y_test : ()\n" ] }, { @@ -122,184 +166,733 @@ "text": [ "/home/pieroot/miniconda3/envs/pso/lib/python3.8/site-packages/keras/optimizers/optimizer_v2/gradient_descent.py:111: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.\n", " super().__init__(name, **kwargs)\n", - "init particles position: 100%|██████████| 2/2 [00:00<00:00, 34.52it/s]\n", - "init velocities: 100%|██████████| 2/2 [00:00<00:00, 1203.19it/s]\n", - "Iteration 0 / 10: 100%|##########| 2/2 [00:48<00:00, 24.43s/it]\n" + "init particles position: 100%|██████████| 30/30 [00:00<00:00, 36.95it/s]\n", + "init velocities: 100%|██████████| 30/30 [00:00<00:00, 1399.35it/s]\n", + "Iter 0/50: 100%|##########| 30/30 [00:15<00:00, 1.98it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "loss : 0.021180160343647003 | acc : 0.9930999875068665\n" + "loss avg : 0.9084339777628581 | acc avg : 0.0019799999892711638 | best loss : 0.15219999849796295\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "Iteration 1 / 10: 100%|##########| 2/2 [00:46<00:00, 23.46s/it]\n" + "Iter 1/50: 100%|##########| 30/30 [00:11<00:00, 2.54it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "loss : 0.029995786026120186 | acc : 0.9927999973297119\n" + "loss avg : 0.9090563456217448 | acc avg : 0.0031199999153614043 | best loss : 0.20149999856948853\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "Iteration 2 / 10: 100%|##########| 2/2 [00:47<00:00, 23.57s/it]\n" + "Iter 2/50: 100%|##########| 30/30 [00:11<00:00, 2.59it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "loss : 0.13020965456962585 | acc : 0.9929999709129333\n" + "loss avg : 0.9103448867797852 | acc avg : 0.005286666750907898 | best loss : 0.20149999856948853\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "Iteration 3 / 10: 100%|##########| 2/2 [00:47<00:00, 23.62s/it]\n" + "Iter 3/50: 100%|##########| 30/30 [00:11<00:00, 2.55it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "loss : 0.032199352979660034 | acc : 0.9918000102043152\n" + "loss avg : 0.9113266626993816 | acc avg : 0.004926666617393494 | best loss : 0.20149999856948853\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "Iteration 4 / 10: 100%|##########| 2/2 [00:47<00:00, 23.66s/it]\n" + "Iter 4/50: 100%|##########| 30/30 [00:11<00:00, 2.54it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "loss : 0.025606701150536537 | acc : 0.9925000071525574\n" + "loss avg : 0.9113243738810222 | acc avg : 0.004126666734615962 | best loss : 0.20149999856948853\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "Iteration 5 / 10: 100%|##########| 2/2 [00:47<00:00, 23.64s/it]\n" + "Iter 5/50: 100%|##########| 30/30 [00:11<00:00, 2.56it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "loss : 0.04198306426405907 | acc : 0.9921000003814697\n" + "loss avg : 0.9113284428914388 | acc avg : 0.002809999883174896 | best loss : 0.20180000364780426\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "Iteration 6 / 10: 100%|##########| 2/2 [00:47<00:00, 23.69s/it]\n" + "Iter 6/50: 100%|##########| 30/30 [00:11<00:00, 2.51it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "loss : 0.048351287841796875 | acc : 0.9919999837875366\n" + "loss avg : 0.9113288243611654 | acc avg : 0.0034666667381922406 | best loss : 0.20180000364780426\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "Iteration 7 / 10: 100%|##########| 2/2 [00:47<00:00, 23.73s/it]\n" + "Iter 7/50: 100%|##########| 30/30 [00:11<00:00, 2.60it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "loss : 0.0416271910071373 | acc : 0.9890999794006348\n" + "loss avg : 0.9113253911336263 | acc avg : 0.0029633333285649615 | best loss : 0.20180000364780426\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "Iteration 8 / 10: 100%|##########| 2/2 [00:47<00:00, 23.70s/it]\n" + "Iter 8/50: 100%|##########| 30/30 [00:11<00:00, 2.57it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "loss : 0.18129077553749084 | acc : 0.9502000212669373\n" + "loss avg : 0.9113227208455403 | acc avg : 0.002809999883174896 | best loss : 0.20180000364780426\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "Iteration 9 / 10: 100%|##########| 2/2 [00:47<00:00, 23.69s/it]\n" + "Iter 9/50: 100%|##########| 30/30 [00:11<00:00, 2.53it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "loss : 0.8072962760925293 | acc : 0.7225000262260437\n", - "313/313 - 0s - loss: 0.0212 - accuracy: 0.9931 - 290ms/epoch - 926us/step\n", - "Test loss: 0.021180160343647003 / Test accuracy: 0.9930999875068665\n" + "loss avg : 0.911251958211263 | acc avg : 0.005486666659514109 | best loss : 0.20180000364780426\n" ] - } - ], - "source": [ - "x_train, y_train, x_test, y_test = get_data()\n", - "model = make_model()\n", - "\n", - "loss = keras.losses.MeanSquaredError()\n", - "optimizer = keras.optimizers.SGD(lr=0.1, momentum=1, decay=1e-05, nesterov=True)\n", - "\n", - "pso_m = PSO(model=model, loss_method=loss, optimizer=optimizer, n_particles=2)\n", - "best_weights, score = pso_m.optimize(x_train, y_train, x_test, y_test, maxiter=10)\n", - "\n", - "model.set_weights(best_weights)\n", - "\n", - "score = model.evaluate(x_test, y_test, verbose=2)\n", - "print(f\"Test loss: {score[0]} / Test accuracy: {score[1]}\")\n", - "\n", - "day = date.today().strftime(\"%Y-%m-%d\")\n", - "\n", - "model.save(f'./model/{day}_mnist.h5')\n" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "1a38f3c1-8291-40d9-838e-4ffbf4578be5", - "metadata": {}, - "outputs": [ + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 10/50: 100%|##########| 30/30 [00:11<00:00, 2.57it/s]\n" + ] + }, { "name": "stdout", "output_type": "stream", "text": [ - "313/313 [==============================] - 0s 685us/step\n", - "틀린 것 갯수 > 69\n" + "loss avg : 0.9113367716471354 | acc avg : 0.004316666722297668 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 11/50: 100%|##########| 30/30 [00:12<00:00, 2.47it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.9113431294759115 | acc avg : 0.002943333238363266 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 12/50: 100%|##########| 30/30 [00:11<00:00, 2.57it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.9113429387410482 | acc avg : 0.004413333535194397 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 13/50: 100%|##########| 30/30 [00:11<00:00, 2.58it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.9113424936930339 | acc avg : 0.004670000076293946 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 14/50: 100%|##########| 30/30 [00:11<00:00, 2.55it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.9113433202107747 | acc avg : 0.0024433332184950513 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 15/50: 100%|##########| 30/30 [00:12<00:00, 2.48it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.9113349914550781 | acc avg : 0.0030966666837533314 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 16/50: 100%|##########| 30/30 [00:11<00:00, 2.57it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.002956666549046834 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 17/50: 100%|##########| 30/30 [00:11<00:00, 2.56it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.002806666741768519 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 18/50: 100%|##########| 30/30 [00:11<00:00, 2.55it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.002503333240747452 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 19/50: 100%|##########| 30/30 [00:12<00:00, 2.47it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.9113413492838541 | acc avg : 0.003179999937613805 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 20/50: 100%|##########| 30/30 [00:11<00:00, 2.60it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.004823333521684011 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 21/50: 100%|##########| 30/30 [00:11<00:00, 2.60it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.003663333257039388 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 22/50: 100%|##########| 30/30 [00:11<00:00, 2.54it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.002916666616996129 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 23/50: 100%|##########| 30/30 [00:11<00:00, 2.55it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.0026966666181882223 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 24/50: 100%|##########| 30/30 [00:12<00:00, 2.43it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.0028999999165534975 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 25/50: 100%|##########| 30/30 [00:11<00:00, 2.56it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.0028833332161108654 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 26/50: 100%|##########| 30/30 [00:11<00:00, 2.55it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.0027433333297570547 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 27/50: 100%|##########| 30/30 [00:11<00:00, 2.59it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.0024033332864443462 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 28/50: 100%|##########| 30/30 [00:11<00:00, 2.60it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.004453333218892416 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 29/50: 100%|##########| 30/30 [00:11<00:00, 2.56it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.00338333323597908 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 30/50: 100%|##########| 30/30 [00:12<00:00, 2.44it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.0028333333631356556 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 31/50: 100%|##########| 30/30 [00:11<00:00, 2.58it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.002480000009139379 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 32/50: 100%|##########| 30/30 [00:11<00:00, 2.58it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.0030733334521452584 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 33/50: 100%|##########| 30/30 [00:11<00:00, 2.58it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.0028366667528947195 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 34/50: 100%|##########| 30/30 [00:11<00:00, 2.58it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.002760000030199687 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 35/50: 100%|##########| 30/30 [00:11<00:00, 2.57it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.002463333308696747 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 36/50: 100%|##########| 30/30 [00:11<00:00, 2.55it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.004286666711171468 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 37/50: 100%|##########| 30/30 [00:12<00:00, 2.39it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.003916666656732559 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 38/50: 100%|##########| 30/30 [00:11<00:00, 2.59it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.0037066665788491565 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 39/50: 100%|##########| 30/30 [00:11<00:00, 2.60it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.003233333428700765 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 40/50: 100%|##########| 30/30 [00:11<00:00, 2.60it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.0020900001128514607 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 41/50: 100%|##########| 30/30 [00:11<00:00, 2.60it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.002956666549046834 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 42/50: 100%|##########| 30/30 [00:11<00:00, 2.60it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.0028566665947437286 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 43/50: 100%|##########| 30/30 [00:11<00:00, 2.57it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.0026866666972637176 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 44/50: 100%|##########| 30/30 [00:11<00:00, 2.58it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.0045466666420300806 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 45/50: 100%|##########| 30/30 [00:12<00:00, 2.36it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.004050000011920929 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 46/50: 100%|##########| 30/30 [00:11<00:00, 2.58it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.0037399999797344207 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 47/50: 100%|##########| 30/30 [00:11<00:00, 2.60it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.00264999990661939 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 48/50: 100%|##########| 30/30 [00:11<00:00, 2.61it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.0029666667183240254 | best loss : 0.20180000364780426\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iter 49/50: 100%|##########| 30/30 [00:11<00:00, 2.56it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss avg : 0.911343765258789 | acc avg : 0.002906666696071625 | best loss : 0.20180000364780426\n", + "313/313 - 0s - loss: 27.3092 - accuracy: 0.2018 - 247ms/epoch - 788us/step\n", + " Test loss: [27.309202194213867, 0.20180000364780426]\n", + "x_train : (28, 28, 1) | y_train : ()\n", + "x_test : (28, 28, 1) | y_test : ()\n", + "313/313 [==============================] - 0s 691us/step\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "진행도: 100%|██████████| 10000/10000 [00:00<00:00, 2226867.00it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "틀린 갯수 > 7982/10000\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" ] }, { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAaAAAAGdCAYAAABU0qcqAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAbtUlEQVR4nO3df2zV9fXH8dctP66AvZfV0t52FFZAQQVKYNA1KuJoaLuEifCHPxMwBgcrRmROg1PRbUkd5qtGw3BZHIxE1JkJKMm6aLFlbgUHShhxNpR0A0NbJkvvLUUulb6/fxDuvFB+fC739vReno/kJvTee3qPHy59entvb33OOScAAPpYlvUCAIArEwECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmBlovcLaenh4dPnxY2dnZ8vl81usAADxyzqmzs1OFhYXKyjr/45x+F6DDhw+rqKjIeg0AwGU6dOiQRo4ced7L+12AsrOzJZ1ePBAIGG8DAPAqEomoqKgo9vX8fFIWoDVr1uj5559XW1ubSkpK9Morr2jGjBkXnTvzbbdAIECAACCNXexplJS8COGtt97SihUrtGrVKn3yyScqKSlRRUWFjhw5koqbAwCkoZQE6IUXXtDixYt1//3364YbbtCrr76qoUOH6ne/+10qbg4AkIaSHqCTJ09q9+7dKi8v/9+NZGWpvLxcjY2N51w/Go0qEonEnQAAmS/pAfryyy916tQp5efnx52fn5+vtra2c65fU1OjYDAYO/EKOAC4Mpj/IOrKlSsVDodjp0OHDlmvBADoA0l/FVxubq4GDBig9vb2uPPb29sVCoXOub7f75ff70/2GgCAfi7pj4AGDx6sadOmqa6uLnZeT0+P6urqVFZWluybAwCkqZT8HNCKFSu0cOFCffe739WMGTP00ksvqaurS/fff38qbg4AkIZSEqA777xT//nPf/T000+rra1NU6ZMUW1t7TkvTAAAXLl8zjlnvcQ3RSIRBYNBhcNh3gkBANLQpX4dN38VHADgykSAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYGGi9wJXitdde8zzj8/k8z0yZMsXzzNSpUz3PAMDl4hEQAMAEAQIAmEh6gJ555hn5fL6404QJE5J9MwCANJeS54BuvPFGffDBB/+7kYE81QQAiJeSMgwcOFChUCgVnxoAkCFS8hzQ/v37VVhYqDFjxujee+/VwYMHz3vdaDSqSCQSdwIAZL6kB6i0tFTr169XbW2t1q5dq5aWFt1yyy3q7Ozs9fo1NTUKBoOxU1FRUbJXAgD0Qz7nnEvlDXR0dGj06NF64YUX9MADD5xzeTQaVTQajX0ciURUVFSkcDisQCCQytX6FD8HBOBKEYlEFAwGL/p1POWvDhg+fLiuu+46NTc393q53++X3+9P9RoAgH4m5T8HdOzYMR04cEAFBQWpvikAQBpJeoAeffRRNTQ06F//+pf+9re/6Y477tCAAQN09913J/umAABpLOnfgvviiy9099136+jRoxoxYoRuvvlm7dixQyNGjEj2TQEA0ljKX4Tg1aU+eZVusrK8P9hM5EUIifzQ79ChQz3P4PIk8s9u7dq1nmf68vnVd9991/PMj370I88zZWVlnmfQty716zjvBQcAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAEAQIAmEj5L6RD3/r66689z0QikRRsggtJ5M1I77vvvhRsYqutrc3zTG1tbQo2gQUeAQEATBAgAIAJAgQAMEGAAAAmCBAAwAQBAgCYIEAAABMECABgggABAEwQIACACQIEADBBgAAAJggQAMAE74bdR7Zs2eJ55t13303BJslz5MgRzzNbt25NwSYA0hGPgAAAJggQAMAEAQIAmCBAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEz7nnLNe4psikYiCwaDC4bACgYD1OriAzz77zPPMpEmTUrBJ+hk7dqznmalTp6Zgk94l8veUl5fneeaHP/yh55n8/HzPM+hbl/p1nEdAAAATBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADA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o8OHDys7O1s+ny/uskgkoqKiIh06dEiBQMBoQ3sch9M4DqdxHE7jOJzWH46Dc06dnZ0qLCxUVtb5n+npd4+AsrKyNHLkyAteJxAIXNF3sDM4DqdxHE7jOJzGcTjN+jhc6JHPGbwIAQBgggABAEykVYD8fr9WrVolv99vvYopjsNpHIfTOA6ncRxOS6fj0O9ehAAAuDKk1SMgAEDmIEAAABMECABgggABAEykTYDWrFmj73znO7rqqqtUWlqqjz/+2HqlPvfMM8/I5/PFnSZMmGC9Vspt375dc+fOVWFhoXw+nzZv3hx3uXNOTz/9tAoKCjRkyBCVl5dr//79Nsum0MWOw6JFi865f1RWVtosmyI1NTWaPn26srOzlZeXp3nz5qmpqSnuOidOnFB1dbWuueYaXX311VqwYIHa29uNNk6NSzkOs2bNOuf+sGTJEqONe5cWAXrrrbe0YsUKrVq1Sp988olKSkpUUVGhI0eOWK/W52688Ua1trbGTh999JH1SinX1dWlkpISrVmzptfLV69erZdfflmvvvqqdu7cqWHDhqmiokInTpzo401T62LHQZIqKyvj7h9vvPFGH26Yeg0NDaqurtaOHTv0/vvvq7u7W3PmzFFXV1fsOo888ojee+89vf3222poaNDhw4c1f/58w62T71KOgyQtXrw47v6wevVqo43Pw6WBGTNmuOrq6tjHp06dcoWFha6mpsZwq763atUqV1JSYr2GKUlu06ZNsY97enpcKBRyzz//fOy8jo4O5/f73RtvvGGwYd84+zg459zChQvd7bffbrKPlSNHjjhJrqGhwTl3+u9+0KBB7u23345d55///KeT5BobG63WTLmzj4Nzzt16663u4YcftlvqEvT7R0AnT57U7t27VV5eHjsvKytL5eXlamxsNNzMxv79+1VYWKgxY8bo3nvv1cGDB61XMtXS0qK2tra4+0cwGFRpaekVef+or69XXl6exo8fr6VLl+ro0aPWK6VUOByWJOXk5EiSdu/ere7u7rj7w4QJEzRq1KiMvj+cfRzOeP3115Wbm6uJEydq5cqVOn78uMV659Xv3oz0bF9++aVOnTql/Pz8uPPz8/P1+eefG21lo7S0VOvXr9f48ePV2tqqZ599Vrfccov27dun7Oxs6/VMtLW1SVKv948zl10pKisrNX/+fBUXF+vAgQN64oknVFVVpcbGRg0YMMB6vaTr6enR8uXLddNNN2nixImSTt8fBg8erOHDh8ddN5PvD70dB0m65557NHr0aBUWFmrv3r16/PHH1dTUpHfeecdw23j9PkD4n6qqqtifJ0+erNLSUo0ePVp/+MMf9MADDxhuhv7grrvuiv150qRJmjx5ssaOHav6+nrNnj3bcLPUqK6u1r59+66I50Ev5HzH4cEHH4z9edKkSSooKNDs2bN14MABjR07tq/X7FW//xZcbm6uBgwYcM6rWNrb2xUKhYy26h+GDx+u6667Ts3NzdarmDlzH+D+ca4xY8YoNzc3I+8fy5Yt09atW/Xhhx/G/fqWUCikkydPqqOjI+76mXp/ON9x6E1paakk9av7Q78P0ODBgzVt2jTV1dXFzuvp6VFdXZ3KysoMN7N37NgxHThwQAUFBdarmCkuLlYoFIq7f0QiEe3cufOKv3988cUXOnr0aEbdP5xzWrZsmTZt2qRt27apuLg47vJp06Zp0KBBcfeHpqYmHTx4MKPuDxc7Dr3Zs2ePJPWv+4P1qyAuxZtvvun8fr9bv369++yzz9yDDz7ohg8f7tra2qxX61M/+clPXH19vWtpaXF//etfXXl5ucvNzXVHjhyxXi2lOjs73aeffuo+/fRTJ8m98MIL7tNPP3X//ve/nXPOPffcc2748OFuy5Ytbu/eve722293xcXF7quvvjLePLkudBw6Ozvdo48+6hobG11LS4v74IMP3NSpU921117rTpw4Yb160ixdutQFg0FXX1/vWltbY6fjx4/HrrNkyRI3atQot23bNrdr1y5XVlbmysrKDLdOvosdh+bmZvfzn//c7dq1y7W0tLgtW7a4MWPGuJkzZxpvHi8tAuScc6+88oobNWqUGzx4sJsxY4bbsWOH9Up97s4773QFBQVu8ODB7tvf/ra78847XXNzs/VaKffhhx86SeecFi5c6Jw7/VLsp556yuXn5zu/3+9mz57tmpqabJdOgQsdh+PHj7s5c+a4ESNGuEGDBrnRo0e7xYsXZ9z/pPX23y/JrVu3Lnadr776yv34xz923/rWt9zQoUPdHXfc4VpbW+2WToGLHYeDBw+6mTNnupycHOf3+924cePcT3/6UxcOh20XPwu/jgEAYKLfPwcEAMhMBAgAYIIAAQBMECAAgAkCBAAwQYAAACYIEADABAECAJggQAAAEwQIAGCCAAEATBAgAICJ/wdNoTZjrQGkuQAAAABJRU5ErkJggg==", + "image/png": "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", "text/plain": [ "
" ] @@ -310,24 +903,62 @@ ], "source": [ "# print(f\"정답 > {y_test}\")\n", - "predicted_result = model.predict(x_test)\n", - "predicted_labels = np.argmax(predicted_result, axis=1)\n", - "not_correct = []\n", - "for i in range(len(y_test)):\n", - " if predicted_labels[i] != y_test[i]:\n", - " not_correct.append(i)\n", - " # print(f\"추론 > {predicted_labels[i]} | 정답 > {y_test[i]}\")\n", - " \n", - "print(f\"틀린 것 갯수 > {len(not_correct)}\")\n", - "for i in range(3):\n", - " plt.imshow(x_test[not_correct[i]].reshape(28,28), cmap='Greys')\n", - "plt.show()" + "def get_score(model):\n", + " x_train, y_train, x_test, y_test = get_data()\n", + " \n", + " predicted_result = model.predict(x_test)\n", + " predicted_labels = np.argmax(predicted_result, axis=1)\n", + " not_correct = []\n", + " for i in tqdm(range(len(y_test)), desc=\"진행도\"):\n", + " if predicted_labels[i] != y_test[i]:\n", + " not_correct.append(i)\n", + " # print(f\"추론 > {predicted_labels[i]} | 정답 > {y_test[i]}\")\n", + " \n", + " print(f\"틀린 갯수 > {len(not_correct)}/{len(y_test)}\")\n", + "\n", + " for i in range(3):\n", + " plt.imshow(x_test[not_correct[i]].reshape(28,28), cmap='Greys')\n", + " plt.show() \n", + " \n", + "get_score(auto_tuning(n_particles=30, maxiter=1000, c0=0.5, c1=1.5, w=0.75))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "fc2d7044", + "metadata": {}, + "outputs": [], + "source": [ + "def default_mnist(epochs=5):\n", + " x_train, y_train, x_test, y_test = get_data()\n", + " model = make_model()\n", + " \n", + " model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])\n", + " wei = model.get_weights()\n", + " model.set_weights(wei)\n", + " score = model.evaluate(x_test, y_test, verbose=2)\n", + " print(f\"score : {score}\")\n", + " # hist = model.fit(x_train, y_train, epochs=epochs, batch_size=32, verbose=1)\n", + " # print(hist.history['loss'][-1])\n", + " # print(hist.history['accuracy'][-1])\n", + "\n", + " # predicted_result = model.predict(x_test)\n", + " # predicted_labels = np.argmax(predicted_result, axis=1)\n", + " # not_correct = []\n", + " # for i in tqdm(range(len(y_test)), desc=\"진행도\"):\n", + " # if predicted_labels[i] != y_test[i]:\n", + " # not_correct.append(i)\n", + " # print(f\"추론 > {predicted_labels[i]} | 정답 > {y_test[i]}\")\n", + " \n", + " # print(f\"틀린 갯수 > {len(not_correct)}/{len(y_test)}\")\n", + "# default_mnist()" ] }, { "cell_type": "code", "execution_count": null, - "id": "fc2d7044", + "id": "27024a0b", "metadata": {}, "outputs": [], "source": [] diff --git a/mnist.py b/mnist.py new file mode 100644 index 0000000..fe8fbf0 --- /dev/null +++ b/mnist.py @@ -0,0 +1,136 @@ +# %% +import os +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' + +import tensorflow as tf +# tf.random.set_seed(777) # for reproducibility + +from tensorflow import keras +from keras.datasets import mnist +from keras.models import Sequential +from keras.layers import Dense, Dropout, Flatten +from keras.layers import Conv2D, MaxPooling2D +from keras import backend as K + +from pso_tf import PSO + +import numpy as np +import matplotlib.pyplot as plt + +from datetime import date +from tqdm import tqdm +import json + +print(tf.__version__) +print(tf.config.list_physical_devices()) + +def get_data(): + (x_train, y_train), (x_test, y_test) = mnist.load_data() + + x_train, x_test = x_train / 255.0, x_test / 255.0 + x_train = x_train.reshape((60000, 28 ,28, 1)) + x_test = x_test.reshape((10000, 28 ,28, 1)) + + print(f"x_train : {x_train[0].shape} | y_train : {y_train[0].shape}") + print(f"x_test : {x_test[0].shape} | y_test : {y_test[0].shape}") + return x_train, y_train, x_test, y_test + +def make_model(): + model = Sequential() + model.add(Conv2D(32, kernel_size=(5, 5), activation='relu', input_shape=(28,28,1))) + model.add(MaxPooling2D(pool_size=(3, 3))) + model.add(Conv2D(64, kernel_size=(3, 3), activation='relu')) + model.add(MaxPooling2D(pool_size=(2, 2))) + model.add(Dropout(0.25)) + model.add(Flatten()) + model.add(Dense(128, activation='relu')) + model.add(Dense(10, activation='softmax')) + + # model.summary() + + return model + +# %% +''' +optimizer parameter +''' +lr = 0.1 +momentun = 0.8 +decay = 1e-04 +nestrov = True + +''' +pso parameter +''' +n_particles = 30 +maxiter = 50 +# epochs = 1 +w = 0.8 +c0 = 0.6 +c1 = 1.6 + +def auto_tuning(n_particles=n_particles, maxiter=maxiter, c0=c0, c1=c1, w=w): + x_train, y_train, x_test, y_test = get_data() + model = make_model() + + loss = keras.losses.MeanSquaredError() + optimizer = keras.optimizers.SGD(lr=lr, momentum=momentun, decay=decay, nesterov=nestrov) + + + pso_m = PSO(model=model, loss_method=loss, n_particles=n_particles, x_train=x_train, y_train=y_train) + # c0 : 지역 최적값 중요도 + # c1 : 전역 최적값 중요도 + # w : 관성 (현재 속도를 유지하는 정도) + best_weights, score = pso_m.optimize(x_train, y_train, x_test, y_test, maxiter=maxiter, c0=c0, c1=c1, w=w) + model.set_weights(best_weights) + + score_ = model.evaluate(x_test, y_test, verbose=2) + print(f" Test loss: {score_}") + score = round(score_[1]*100, 2) + + day = date.today().strftime("%Y-%m-%d") + + os.makedirs(f'./model', exist_ok=True) + model.save(f'./model/{day}_{score}_mnist.h5') + json_save = { + "name" : f"{day}_{score}_mnist.h5", + "score" : score_, + "maxiter" : maxiter, + "c0" : c0, + "c1" : c1, + "w" : w + } + with open(f'./model/{day}_{score}_pso_mnist.json', 'a') as f: + json.dump(json_save, f) + f.write(',\n') + + return model + +# auto_tuning(n_particles=30, maxiter=1000, c0=0.5, c1=1.5, w=0.75) + + +# %% +# print(f"정답 > {y_test}") +def get_score(model): + x_train, y_train, x_test, y_test = get_data() + + predicted_result = model.predict(x_test) + predicted_labels = np.argmax(predicted_result, axis=1) + not_correct = [] + for i in tqdm(range(len(y_test)), desc="진행도"): + if predicted_labels[i] != y_test[i]: + not_correct.append(i) + # print(f"추론 > {predicted_labels[i]} | 정답 > {y_test[i]}") + + print(f"틀린 갯수 > {len(not_correct)}/{len(y_test)}") + + # for i in range(3): + # plt.imshow(x_test[not_correct[i]].reshape(28,28), cmap='Greys') + # plt.show() + +get_score(auto_tuning(n_particles=30, maxiter=1000, c0=0.5, c1=1.5, w=0.75)) + +# %% + + + diff --git a/pso_bp.py b/pso_bp.py new file mode 100644 index 0000000..5502687 --- /dev/null +++ b/pso_bp.py @@ -0,0 +1,280 @@ +import numpy as np +import tensorflow as tf +from tensorflow import keras +from tqdm import tqdm + + +class PSO(object): + """ + Class implementing PSO algorithm + """ + + def __init__(self, model: keras.models, loss_method=keras.losses.MeanSquaredError(), optimizer='adam', n_particles=5): + """ + Initialize the key variables. + + Args: + model : 학습할 모델 객체 (Sequential) + loss_method : 손실 함수 + optimizer : 최적화 함수 + n_particles(int) : 파티클의 개수 + """ + self.model = model # 모델 + self.n_particles = n_particles # 파티클의 개수 + self.loss_method = loss_method # 손실 함수 + self.optimizer = optimizer # 최적화 함수 + self.model_structure = self.model.to_json() # 모델의 구조 + self.init_weights = self.model.get_weights() # 검색할 차원 + self.particle_depth = len(self.model.get_weights()) # 검색할 차원의 깊이 + self.particles_weights = [None] * n_particles # 파티클의 위치 + for _ in tqdm(range(self.n_particles), desc="init particles position"): + # particle_node = [] + m = keras.models.model_from_json(self.model_structure) + m.compile(loss=self.loss_method, + optimizer=self.optimizer, metrics=["accuracy"]) + self.particles_weights[_] = m.get_weights() + # print(f"shape > {self.particles_weights[_][0]}") + + + # self.particles_weights.append(particle_node) + + # print(f"particles_weights > {self.particles_weights}") + # self.particles_weights = np.random.uniform(size=(n_particles, self.particle_depth)) \ + # * self.init_pos + # 입력받은 파티클의 개수 * 검색할 차원의 크기 만큼의 균등한 위치를 생성 + # self.velocities = [None] * self.n_particles + self.velocities = [ + [0 for i in range(self.particle_depth)] for n in range(n_particles)] + for i in tqdm(range(n_particles), desc="init velocities"): + # print(i) + for index, layer in enumerate(self.init_weights): + # print(f"index > {index}") + # print(f"layer > {layer.shape}") + self.velocities[i][index] = np.random.rand( + *layer.shape) / 5 - 0.10 + # if layer.ndim == 1: + # self.velocities[i][index] = np.random.uniform( + # size=(layer.shape[0],)) + # elif layer.ndim == 2: + # self.velocities[i][index] = np.random.uniform( + # size=(layer.shape[0], layer.shape[1])) + # elif layer.ndim == 3: + # self.velocities[i][index] = np.random.uniform( + # size=(layer.shape[0], layer.shape[1], layer.shape[2])) + # print(f"type > {type(self.velocities)}") + # print(f"velocities > {self.velocities}") + + # print(f"velocities > {self.velocities}") + # for i, layer in enumerate(self.init_weights): + # self.velocities[i] = np.random.rand(*layer.shape) / 5 - 0.10 + + # self.velocities = np.random.uniform( + # size=(n_particles, self.particle_depth)) + # 입력받은 파티클의 개수 * 검색할 차원의 크기 만큼의 속도를 무작위로 초기화 + # 최대 사이즈로 전역 최적갑 저장 - global best + self.g_best = self.model.get_weights() # 전역 최적값(최적의 가중치) + self.p_best = self.particles_weights # 각 파티클의 최적값(최적의 가중치) + self.p_best_score = [0 for i in range( + n_particles)] # 각 파티클의 최적값의 점수 + self.g_best_score = 0 # 전역 최적값의 점수(초기화 - 무한대) + self.g_history = [] + self.g_best_score_history = [] + self.history = [] + + def _update_weights(self, weights, v): + """ + Update particle position + + Args: + weights (array-like) : 파티클의 현재 가중치 + v (array-like) : 가중치의 속도 + + Returns: + (array-like) : 파티클의 새로운 가중치(위치) + """ + # w = np.array(w) # 각 파티클의 위치 + # v = np.array(v) # 각 파티클의 속도(방향과 속력을 가짐) + # print(f"len(w) > {len(w)}") + # print(f"len(v) > {len(v)}") + new_weights = [0 for i in range(len(weights))] + for i in range(len(weights)): + # print(f"shape > w : {np.shape(w[i])}, v : {np.shape(v[i])}") + new_weights[i] = tf.add(weights[i], v[i]) + # new_w = tf.add(w, v) # 각 파티클을 랜덤한 속도만큼 진행 + return new_weights # 진행한 파티클들의 위치를 반환 + + def _update_velocity(self, weights, v, p_best, c0=0.5, c1=1.5, w=0.75): + """ + Update particle velocity + + Args: + weights (array-like) : 파티클의 현재 가중치 + v (array-like) : 속도 + p_best(array-like) : 각 파티클의 최적의 위치 (최적의 가중치) + c0 (float) : 인지 스케일링 상수 (가중치의 중요도 - 지역) - 지역 관성 + c1 (float) : 사회 스케일링 상수 (가중치의 중요도 - 전역) - 전역 관성 + w (float) : 관성 상수 (현재 속도의 중요도) + + Returns: + (array-like) : 각 파티클의 새로운 속도 + """ + # x = np.array(x) + # v = np.array(v) + # assert np.shape(weights) == np.shape(v), "Position and velocity must have same shape." + # 두 데이터의 shape 이 같지 않으면 오류 출력 + # 0에서 1사이의 숫자를 랜덤 생성 + r0 = np.random.rand() + r1 = np.random.rand() + # print(f"type > weights : {type(weights)}") + # print(f"type > v : {type(v)}") + # print( + # f"shape > weights : {np.shape(weights[0])}, v : {np.shape(v[0])}") + # print(f"len > weights : {len(weights)}, v : {len(v)}") + # p_best = np.array(p_best) + # g_best = np.array(g_best) + + # 가중치(상수)*속도 + \ + # 스케일링 상수*랜덤 가중치*(나의 최적값 - 처음 위치) + \ + # 전역 스케일링 상수*랜덤 가중치*(전체 최적값 - 처음 위치) + # for i, layer in enumerate(weights): + new_velocity = [None] * len(weights) + for i, layer in enumerate(weights): + + new_v = w*v[i] + new_v = new_v + c0*r0*(p_best[i] - layer) + new_v = new_v + c1*r1*(self.g_best[i] - layer) + new_velocity[i] = new_v + + # m2 = tf.multiply(tf.multiply(c0, r0), + # tf.subtract(p_best[i], layer)) + # m3 = tf.multiply(tf.multiply(c1, r1), + # tf.subtract(g_best[i], layer)) + # new_v[i] = tf.add(m1, tf.add(m2, m3)) + # new_v[i] = tf.add_n([m1, m2, m3]) + # new_v[i] = tf.add_n( + # tf.multiply(w, v[i]), + # tf.multiply(tf.multiply(c0, r0), + # tf.subtract(p_best[i], layer)), + # tf.multiply(tf.multiply(c1, r1), + # tf.subtract(g_best[i], layer))) + # new_v = w*v + c0*r0*(p_best - weights) + c1*r1*(g_best - weights) + return new_velocity + + def _get_score(self, x, y): + """ + Compute the score of the current position of the particles. + + Args: + x (array-like): The current position of the particles + y (array-like): The current position of the particles + Returns: + (array-like) : 추론에 대한 점수 + """ + # = self.model + # model.set_weights(weights) + score = self.model.evaluate(x, y, verbose=0) + + return score + + def optimize(self, x_train, y_train, x_test, y_test, maxiter=10, epochs=1, batch_size=32, c0=0.5, c1=1.5, w=0.75): + """ + Run the PSO optimization process utill the stoping critera is met. + Cas for minization. The aim is to minimize the cost function + + Args: + maxiter (int): the maximum number of iterations before stopping the optimization + 파티클의 최종 위치를 위한 반복 횟수 + Returns: + The best solution found (array-like) + """ + for _ in range(maxiter): + loss = 0 + acc = 1e-10 + for i in tqdm(range(self.n_particles), desc=f"Iter {_}/{maxiter} | acc avg {round(acc/(_+1) ,4)}", ascii=True): + weights = self.particles_weights[i] # 각 파티클 추출 + v = self.velocities[i] # 각 파티클의 다음 속도 추출 + p_best = self.p_best[i] # 결과치 저장할 변수 지정 + # 2. 속도 계산 + self.velocities[i] = self._update_velocity( + weights, v, p_best, c0, c1, w) + # 다음에 움직일 속도 = 최초 위치, 현재 속도, 현재 위치, 최종 위치 + # 3. 위치 업데이트 + self.particles_weights[i] = self._update_weights(weights, v) + # 현재 위치 = 최초 위치 현재 속도 + # Update the besst position for particle i + # 내 현재 위치가 내 위치의 최소치보다 작으면 갱신 + self.model.set_weights(self.particles_weights[i].copy()) + self.model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size, + verbose=0, validation_data=(x_test, y_test)) + self.particles_weights[i] = self.model.get_weights() + # 4. 평가 + self.model.compile(loss=self.loss_method, + optimizer='adam', metrics=['accuracy']) + score = self._get_score(x_test, y_test) + # print(score) + + # print(f"score : {score}") + # print(f"loss : {loss}") + # print(f"p_best_score : {self.p_best_score[i]}") + + if score[1] > self.p_best_score[i]: + self.p_best_score[i] = score[1] + self.p_best[i] = self.particles_weights[i].copy() + if score[1] > self.g_best_score: + self.g_best_score = score[1] + self.g_best = self.particles_weights[i].copy() + self.g_history.append(self.g_best) + self.g_best_score_history.append( + self.g_best_score) + + self.score = score[1] + loss = loss + score[0] + acc = acc + score[1] + # if self.func(self.particles_weights[i]) < self.func(p_best): + # self.p_best[i] = self.particles_weights[i] + # if self. + # Update the best position overall + # 내 현재 위치가 전체 위치 최소치보다 작으면 갱신 + # if self.func(self.particles_weights[i]) < self.func(self.g_best): + # self.g_best = self.particles_weights[i] + # self.g_history.append(self.g_best) + # print(f"{i} particle score : {score[0]}") + print( + f"loss avg : {loss/self.n_particles} | acc avg : {acc/self.n_particles} | best loss : {self.g_best_score}") + + # self.history.append(self.particles_weights.copy()) + + # 전체 최소 위치, 전체 최소 벡터 + return self.g_best, self._get_score(x_test, y_test) + + """ + Returns: + 현재 전체 위치 + """ + + def position(self): + return self.particles_weights.copy() + + """ + Returns: + 전체 위치 벡터 history + """ + + def position_history(self): + return self.history.copy() + + """ + Returns: + global best 의 갱신된 값의 변화를 반환 + """ + + def global_history(self): + return self.g_history.copy() + + """ + Returns: + global best score 의 갱신된 값의 변화를 반환 + """ + + def global_score_history(self): + return self.g_best_score_history.copy() diff --git a/pso.py b/pso_meta.py similarity index 100% rename from pso.py rename to pso_meta.py diff --git a/pso_tf.py b/pso_tf.py index f0d5f6a..0e98b6d 100644 --- a/pso_tf.py +++ b/pso_tf.py @@ -9,7 +9,7 @@ class PSO(object): Class implementing PSO algorithm """ - def __init__(self, model, loss_method=keras.losses.MeanSquaredError(), optimizer=keras.optimizers.SGD(), n_particles=5): + def __init__(self, model: keras.models, x_train, y_train, loss_method=keras.losses.MeanSquaredError(), n_particles=5): """ Initialize the key variables. @@ -22,7 +22,6 @@ class PSO(object): self.model = model # 모델 self.n_particles = n_particles # 파티클의 개수 self.loss_method = loss_method # 손실 함수 - self.optimizer = optimizer # 최적화 함수 self.model_structure = self.model.to_json() # 모델의 구조 self.init_weights = self.model.get_weights() # 검색할 차원 self.particle_depth = len(self.model.get_weights()) # 검색할 차원의 깊이 @@ -30,9 +29,12 @@ class PSO(object): for _ in tqdm(range(self.n_particles), desc="init particles position"): # particle_node = [] m = keras.models.model_from_json(self.model_structure) - m.compile(loss=self.loss_method, optimizer=self.optimizer) - + m.compile(loss=self.loss_method, + optimizer="adam", metrics=["accuracy"]) + # m.fit(x_train, y_train, epochs=1, batch_size=32, verbose=0) # 결과가 너무 좋지 않아서 처음 초기화 할때 어느정도 위치를 수정 self.particles_weights[_] = m.get_weights() + # print(f"shape > {self.particles_weights[_][0]}") + # self.particles_weights.append(particle_node) @@ -72,10 +74,12 @@ class PSO(object): # 최대 사이즈로 전역 최적갑 저장 - global best self.g_best = self.model.get_weights() # 전역 최적값(최적의 가중치) self.p_best = self.particles_weights # 각 파티클의 최적값(최적의 가중치) - self.p_best_score = [np.inf for i in range( + self.p_best_score = [0 for i in range( n_particles)] # 각 파티클의 최적값의 점수 - self.g_best_score = np.inf # 전역 최적값의 점수(초기화 - 무한대) + self.g_best_score = 0 # 전역 최적값의 점수(초기화 - 무한대) self.g_history = [] + self.all_cost_history = [[] for i in range(n_particles)] + self.g_best_score_history = [] self.history = [] def _update_weights(self, weights, v): @@ -139,12 +143,13 @@ class PSO(object): new_v = w*v[i] new_v = new_v + c0*r0*(p_best[i] - layer) + new_v = new_v + c1*r1*(self.g_best[i] - layer) + new_velocity[i] = new_v + # m2 = tf.multiply(tf.multiply(c0, r0), # tf.subtract(p_best[i], layer)) - new_v = new_v + c1*r1*(self.g_best[i] - layer) # m3 = tf.multiply(tf.multiply(c1, r1), # tf.subtract(g_best[i], layer)) - new_velocity[i] = new_v # new_v[i] = tf.add(m1, tf.add(m2, m3)) # new_v[i] = tf.add_n([m1, m2, m3]) # new_v[i] = tf.add_n( @@ -172,7 +177,7 @@ class PSO(object): return score - def optimize(self, x_train, y_train, x_test, y_test, maxiter=20, epoch=10, verbose=0): + def optimize(self, x_train, y_train, x_test, y_test, maxiter=10, c0=0.5, c1=1.5, w=0.75): """ Run the PSO optimization process utill the stoping critera is met. Cas for minization. The aim is to minimize the cost function @@ -186,40 +191,45 @@ class PSO(object): for _ in range(maxiter): loss = 0 acc = 0 - for i in tqdm(range(self.n_particles), desc=f"Iteration {_} / {maxiter}", ascii=True): + for i in tqdm(range(self.n_particles), desc=f"Iter {_}/{maxiter}", ascii=True): weights = self.particles_weights[i] # 각 파티클 추출 v = self.velocities[i] # 각 파티클의 다음 속도 추출 p_best = self.p_best[i] # 결과치 저장할 변수 지정 + # 2. 속도 계산 self.velocities[i] = self._update_velocity( - weights, v, p_best) + weights, v, p_best, c0, c1, w) # 다음에 움직일 속도 = 최초 위치, 현재 속도, 현재 위치, 최종 위치 + # 3. 위치 업데이트 self.particles_weights[i] = self._update_weights(weights, v) # 현재 위치 = 최초 위치 현재 속도 # Update the besst position for particle i # 내 현재 위치가 내 위치의 최소치보다 작으면 갱신 - - self.model.set_weights(self.particles_weights[i]) - self.model.fit(x_train, y_train, epochs=epoch, - verbose=0, validation_data=(x_test, y_test)) - self.particles_weights[i] = self.model.get_weights() - + self.model.set_weights(self.particles_weights[i].copy()) + # self.model.fit(x_train, y_train, epochs=epochs, batch_size=batch_size, + # verbose=0, validation_data=(x_test, y_test)) + # self.particles_weights[i] = self.model.get_weights() + # 4. 평가 + self.model.compile(loss=self.loss_method, + optimizer='adam', metrics=['accuracy']) score = self._get_score(x_test, y_test) + # print(score) # print(f"score : {score}") # print(f"loss : {loss}") # print(f"p_best_score : {self.p_best_score[i]}") - if score[0] < self.p_best_score[i]: - self.p_best_score[i] = score[0] - self.p_best[i] = self.particles_weights[i] - if score[0] < self.g_best_score: - self.g_best_score = score[0] + if score[1] > self.p_best_score[i]: + self.p_best_score[i] = score[1] + self.p_best[i] = self.particles_weights[i].copy() + if score[1] > self.g_best_score: + self.g_best_score = score[1] self.g_best = self.particles_weights[i].copy() - self.g_history.append(self.g_best.copy()) + self.g_history.append(self.g_best) + self.g_best_score_history.append( + self.g_best_score) - self.score = score[0] - loss = score[0] - acc = score[1] + self.score = score + self.all_cost_history[i].append(score) # if self.func(self.particles_weights[i]) < self.func(p_best): # self.p_best[i] = self.particles_weights[i] # if self. @@ -229,7 +239,8 @@ class PSO(object): # self.g_best = self.particles_weights[i] # self.g_history.append(self.g_best) # print(f"{i} particle score : {score[0]}") - print(f"loss : {loss} | acc : {acc}") + print( + f"loss avg : {self.score[0]/self.n_particles} | acc avg : {self.score[1]/self.n_particles} | best loss : {self.g_best_score}") # self.history.append(self.particles_weights.copy()) @@ -259,3 +270,14 @@ class PSO(object): def global_history(self): return self.g_history.copy() + + """ + Returns: + global best score 의 갱신된 값의 변화를 반환 + """ + + def global_score_history(self): + return self.g_best_score_history.copy() + + def all_cost(self): + return self.all_cost_history.copy() diff --git a/pso_tuning.py b/pso_tuning.py new file mode 100644 index 0000000..fa267ce --- /dev/null +++ b/pso_tuning.py @@ -0,0 +1,155 @@ +# %% +import json +from tqdm import tqdm +from datetime import date +import matplotlib.pyplot as plt +import numpy as np +from PSO.pso_bp import PSO +from keras import backend as K +from keras.layers import Conv2D, MaxPooling2D +from keras.layers import Dense, Dropout, Flatten +from keras.models import Sequential +from keras.datasets import mnist +from tensorflow import keras +import tensorflow as tf +import os +os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' + +tf.random.set_seed(777) # for reproducibility + + +print(tf.__version__) +print(tf.config.list_physical_devices()) + + +def get_data(): + (x_train, y_train), (x_test, y_test) = mnist.load_data() + + x_train, x_test = x_train / 255.0, x_test / 255.0 + x_train = x_train.reshape((60000, 28, 28, 1)) + x_test = x_test.reshape((10000, 28, 28, 1)) + + print(f"x_train : {x_train[0].shape} | y_train : {y_train[0].shape}") + print(f"x_test : {x_test[0].shape} | y_test : {y_test[0].shape}") + return x_train, y_train, x_test, y_test + + +def make_model(): + model = Sequential() + model.add(Conv2D(32, kernel_size=(5, 5), + activation='relu', input_shape=(28, 28, 1))) + model.add(MaxPooling2D(pool_size=(3, 3))) + model.add(Conv2D(64, kernel_size=(3, 3), activation='relu')) + model.add(MaxPooling2D(pool_size=(2, 2))) + model.add(Dropout(0.25)) + model.add(Flatten()) + model.add(Dense(128, activation='relu')) + model.add(Dense(10, activation='softmax')) + + model.compile(loss='sparse_categorical_crossentropy', + optimizer='adam', metrics=['accuracy']) + + # model.summary() + + return model + + +# %% +''' +optimizer parameter +''' +lr = 0.1 +momentun = 0.8 +decay = 1e-04 +nestrov = True + +''' +pso parameter +''' +n_particles = 100 +maxiter = 500 +# epochs = 1 +w = 0.8 +c0 = 0.6 +c1 = 1.6 + +def auto_tuning(): + x_train, y_train, x_test, y_test = get_data() + model = make_model() + + loss = keras.losses.MeanSquaredError() + optimizer = keras.optimizers.SGD(lr=lr, momentum=momentun, decay=decay, nesterov=nestrov) + + + pso_m = PSO(model=model, loss_method=loss, n_particles=n_particles) + # c0 : 지역 최적값 중요도 + # c1 : 전역 최적값 중요도 + # w : 관성 (현재 속도를 유지하는 정도) + best_weights, score = pso_m.optimize(x_train, y_train, x_test, y_test, maxiter=maxiter, c0=c0, c1=c1, w=w) + model.set_weights(best_weights) + + score_ = model.evaluate(x_test, y_test, verbose=2) + print(f" Test loss: {score_}") + score = round(score_[0]*100, 2) + + day = date.today().strftime("%Y-%m-%d") + + model.save(f'./model/{day}_{score}_mnist.h5') + json_save = { + "name" : f"{day}_{score}_mnist.h5", + "score" : score_, + "maxiter" : maxiter, + "c0" : c0, + "c1" : c1, + "w" : w + } + with open(f'./model/{day}_{score}_bp_mnist.json', 'a') as f: + json.dump(json_save, f) + f.write(',\n') + + return model +auto_tuning() + + +# %% +# print(f"정답 > {y_test}") +def get_score(model): + x_train, y_train, x_test, y_test = get_data() + + predicted_result = model.predict(x_test) + predicted_labels = np.argmax(predicted_result, axis=1) + not_correct = [] + for i in tqdm(range(len(y_test)), desc="진행도"): + if predicted_labels[i] != y_test[i]: + not_correct.append(i) + # print(f"추론 > {predicted_labels[i]} | 정답 > {y_test[i]}") + + print(f"틀린 갯수 > {len(not_correct)}/{len(y_test)}") + + for i in range(3): + plt.imshow(x_test[not_correct[i]].reshape(28, 28), cmap='Greys') + plt.show() + +# %% + + +def default_mnist(epochs=5): + x_train, y_train, x_test, y_test = get_data() + model = make_model() + + hist = model.fit(x_train, y_train, epochs=epochs, batch_size=32, verbose=1) + print(hist.history['loss'][-1]) + print(hist.history['accuracy'][-1]) + + predicted_result = model.predict(x_test) + predicted_labels = np.argmax(predicted_result, axis=1) + not_correct = [] + for i in tqdm(range(len(y_test)), desc="진행도"): + if predicted_labels[i] != y_test[i]: + not_correct.append(i) + # print(f"추론 > {predicted_labels[i]} | 정답 > {y_test[i]}") + + print(f"틀린 갯수 > {len(not_correct)}/{len(y_test)}") + + +# %% diff --git a/readme.md b/readme.md index 03093ee..f10c78e 100644 --- a/readme.md +++ b/readme.md @@ -24,11 +24,14 @@ pso 알고리즘을 사용하여 새로운 학습 방법을 찾는중 입니다 ## 1. PSO 알고리즘 구현 ```plain text -pso.py # PSO 알고리즘 구현 +pso_meta.py # PSO 알고리즘 구현 pso_tf.py # tensorflow 모델을 이용가능한 PSO 알고리즘 구현 +pso_bp.py # 오차역전파 함수를 최적화하는 PSO 알고리즘 구현 - 성능이 99% 이상으로 나오나 목적과 다름 +pso_tuning.py # pso 알고리즘의 하이퍼 파라미터를 자동으로 튜닝하는 파일 xor.ipynb # xor 문제를 pso 알고리즘으로 풀이 mnist.ipynb # mnist 문제를 pso 알고리즘으로 풀이 +mnist.py # mnist 문제를 pso 알고리즘으로 풀이 - shell 실행용 ``` ## 2. PSO 알고리즘을 이용한 최적화 문제 풀이 @@ -44,10 +47,17 @@ pso 알고리즘을 이용하여 오차역전파 함수를 최적화 하는 방 2-2. 지역 최적값을 찾았다면, 전역 최적값을 찾을 때까지 1~2 과정을 반복합니다 -3. 전역 최적값이 특정 임계치에서 변화율이 적다면 학습을 종료합니다 +3. 전역 최적값이 특정 임계치에서 변화율이 적다면 학습을 종료합니다 - 현재 결과가 정확도가 높지 않아서 이 기능은 추후에 추가할 예정입니다 + +### 현재 문제 + +> 딥러닝 알고리즘 특성상 weights는 처음 컴파일시 무작위하게 생성된다. weights의 각 지점의 중요도는 매번 무작위로 정해지기에 전역 최적값으로 찾아갈 때 값이 높은 loss를 향해서 상승하는 현상이 나타난다. +>
+> 따라서 weights의 이동 방법을 더 탐구하거나, weights를 초기화 할때 random 중요도를 좀더 노이즈가 적게 생성하는 방향을 모색해야할 것 같다. ### 개인적인 생각 > 머신러닝 분류 방식에 존재하는 random forest 방식을 이용하여, 오차역전파 함수를 최적화 하는 방법이 있을것 같습니다 +>
> > > pso 와 random forest 방식이 매우 유사하다고 생각하여 학습할 때 뿐만 아니라 예측 할 때도 이러한 방식으로 사용할 수 있을 것 같습니다 diff --git a/readme.png b/readme.png new file mode 100644 index 0000000000000000000000000000000000000000..45685b11c2c097b8ec91120a21b6efd9db405834 GIT binary patch literal 228442 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

XqNvC$(H`$v7s?RVKiQ988yjZWv-TV(8Sx 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

JV0O(TedZjqn4kEm)pb?KtQ`H=hmIHG0r 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 Rbw|N3^YNCZ(I&PV{|CB`epdhh literal 0 HcmV?d00001 diff --git a/xor.ipynb b/xor.ipynb index 948dd9a..cb86049 100644 --- a/xor.ipynb +++ b/xor.ipynb @@ -2,18 +2,11 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 13, "metadata": { "tags": [] }, "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "2023-05-21 01:52:28.471404: E tensorflow/stream_executor/cuda/cuda_blas.cc:2981] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n" - ] - }, { "name": "stdout", "output_type": "stream", @@ -55,7 +48,7 @@ " model = Sequential(leyer)\n", "\n", " sgd = keras.optimizers.SGD(lr=0.1, momentum=1, decay=1e-05, nesterov=True)\n", - " adam = keras.optimizers.Adam(lr=0.1, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.)\n", + " # adam = keras.optimizers.Adam(lr=0.1, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.)\n", " model.compile(loss='mse', optimizer=sgd, metrics=['accuracy'])\n", "\n", " print(model.summary())\n", @@ -65,238 +58,185 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Model: \"sequential\"\n", + "Model: \"sequential_11\"\n", "_________________________________________________________________\n", " Layer (type) Output Shape Param # \n", "=================================================================\n", - " dense (Dense) (None, 2) 6 \n", + " dense_22 (Dense) (None, 2) 6 \n", " \n", - " dense_1 (Dense) (None, 1) 3 \n", + " dense_23 (Dense) (None, 1) 3 \n", " \n", "=================================================================\n", "Total params: 9\n", "Trainable params: 9\n", "Non-trainable params: 0\n", - "_________________________________________________________________\n" + "_________________________________________________________________\n", + "None\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ - "/home/pieroot/miniconda3/envs/pso/lib/python3.8/site-packages/keras/optimizers/optimizer_v2/gradient_descent.py:111: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.\n", - " super().__init__(name, **kwargs)\n", - "/home/pieroot/miniconda3/envs/pso/lib/python3.8/site-packages/keras/optimizers/optimizer_v2/adam.py:114: UserWarning: The `lr` argument is deprecated, use `learning_rate` instead.\n", - " super().__init__(name, **kwargs)\n" + "init particles position: 100%|██████████| 15/15 [00:00<00:00, 85.12it/s]\n", + "init velocities: 100%|██████████| 15/15 [00:00<00:00, 46465.70it/s]\n", + "Iteration 0 / 10: 100%|##########| 15/15 [00:05<00:00, 2.63it/s]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ - "None\n", - "0 particle score : 0.24921603500843048\n", - "1 particle score : 0.2509610056877136\n", - "2 particle score : 0.28712478280067444\n", - "3 particle score : 0.2665291726589203\n", - "4 particle score : 0.2513682246208191\n", - "0 particle score : 0.26079031825065613\n", - "1 particle score : 0.24931921064853668\n", - "2 particle score : 0.2679133415222168\n", - "3 particle score : 0.27925199270248413\n", - "4 particle score : 0.2605195641517639\n", - "0 particle score : 0.30758577585220337\n", - "1 particle score : 0.26747316122055054\n", - "2 particle score : 0.36957648396492004\n", - "3 particle score : 0.19372068345546722\n", - "4 particle score : 0.3671383857727051\n", - "0 particle score : 0.24090810120105743\n", - "1 particle score : 0.3176509141921997\n", - "2 particle score : 0.23225924372673035\n", - "3 particle score : 0.37263113260269165\n", - "4 particle score : 0.47822105884552\n", - "0 particle score : 0.37611791491508484\n", - "1 particle score : 0.27166277170181274\n", - "2 particle score : 0.21416285634040833\n", - "3 particle score : 0.23324625194072723\n", - "4 particle score : 0.024583835154771805\n", - "0 particle score : 0.05194556713104248\n", - "1 particle score : 0.3102635443210602\n", - "2 particle score : 0.31894028186798096\n", - "3 particle score : 0.12679985165596008\n", - "4 particle score : 0.012038745917379856\n", - "0 particle score : 0.004551469348371029\n", - "1 particle score : 0.03923884406685829\n", - "2 particle score : 0.003701586974784732\n", - "3 particle score : 0.0026527238078415394\n", - "4 particle score : 0.0430503748357296\n", - "0 particle score : 0.000214503234019503\n", - "1 particle score : 0.0025649480521678925\n", - "2 particle score : 0.008843829855322838\n", - "3 particle score : 0.23036976158618927\n", - "4 particle score : 0.21686825156211853\n", - "0 particle score : 4.901693273495766e-07\n", - "1 particle score : 0.003860481781885028\n", - "2 particle score : 0.00047884139348752797\n", - "3 particle score : 0.1563722789287567\n", - "4 particle score : 1.1759411222556082e-07\n", - "0 particle score : 0.24969959259033203\n", - "1 particle score : 2.8646991268033162e-05\n", - "2 particle score : 1.0552450024903237e-09\n", - "3 particle score : 3.566808572941227e-07\n", - "4 particle score : 8.882947003831243e-14\n", - "0 particle score : 0.2497878521680832\n", - "1 particle score : 1.879385969766334e-12\n", - "2 particle score : 0.44945281744003296\n", - "3 particle score : 2.485284791549705e-14\n", - "4 particle score : 2.431787924306583e-26\n", - "0 particle score : 3.854774978241029e-18\n", - "1 particle score : 1.2515056546646974e-08\n", - "2 particle score : 0.49999988079071045\n", - "3 particle score : 2.8881452344524906e-22\n", - "4 particle score : 4.162688806996304e-30\n", - "0 particle score : 9.170106118851775e-37\n", - "1 particle score : 0.49933725595474243\n", - "2 particle score : 0.43209874629974365\n", - "3 particle score : 7.681456478781658e-30\n", - "4 particle score : 1.1656278206215614e-33\n", - "0 particle score : 0.0\n", - "1 particle score : 0.49545660614967346\n", - "2 particle score : 0.25\n", - "3 particle score : 0.0\n", - "4 particle score : 0.0\n", - "0 particle score : 0.0\n", - "1 particle score : 0.25\n", - "2 particle score : 0.25\n", - "3 particle score : 0.25\n", - "4 particle score : 0.25\n", - "0 particle score : 0.0\n", - "1 particle score : 0.0\n", - "2 particle score : 0.25\n", - "3 particle score : 0.25\n", - "4 particle score : 0.25\n", - "0 particle score : 0.0\n", - "1 particle score : 0.25\n", - "2 particle score : 0.25\n", - "3 particle score : 0.25\n", - "4 particle score : 0.25\n", - "0 particle score : 0.0\n", - "1 particle score : 0.0\n", - "2 particle score : 0.0\n", - "3 particle score : 0.0\n", - "4 particle score : 0.5\n", - "0 particle score : 1.2923532081356227e-22\n", - "1 particle score : 0.5\n", - "2 particle score : 0.25\n", - "3 particle score : 0.942779541015625\n", - "4 particle score : 0.5\n", - "0 particle score : 0.4959273338317871\n", - "1 particle score : 0.5\n", - "2 particle score : 0.5\n", - "3 particle score : 0.75\n", - "4 particle score : 0.75\n", - "0 particle score : 0.23154164850711823\n", - "1 particle score : 0.5\n", - "2 particle score : 0.5\n", - "3 particle score : 0.5\n", - "4 particle score : 0.5\n", - "0 particle score : 0.0\n", - "1 particle score : 0.5\n", - "2 particle score : 0.25\n", - "3 particle score : 0.0\n", - "4 particle score : 0.25\n", - "0 particle score : 0.0\n", - "1 particle score : 0.5\n", - "2 particle score : 0.25\n", - "3 particle score : 0.25\n", - "4 particle score : 0.25\n", - "0 particle score : 0.25\n", - "1 particle score : 0.25\n", - "2 particle score : 0.25\n", - "3 particle score : 0.25\n", - "4 particle score : 0.25\n", - "0 particle score : 0.0\n", - "1 particle score : 0.25\n", - "2 particle score : 0.25\n", - "3 particle score : 0.25\n", - "4 particle score : 0.25\n", - "0 particle score : 0.5760642290115356\n", - "1 particle score : 0.25\n", - "2 particle score : 0.25000467896461487\n", - "3 particle score : 0.5\n", - "4 particle score : 0.5\n", - "0 particle score : 0.5\n", - "1 particle score : 0.25\n", - "2 particle score : 0.4998854398727417\n", - "3 particle score : 0.5\n", - "4 particle score : 0.5\n", - "0 particle score : 0.5\n", - "1 particle score : 0.25\n", - "2 particle score : 0.5000014305114746\n", - "3 particle score : 0.5\n", - "4 particle score : 0.5\n", - "0 particle score : 0.5\n", - "1 particle score : 0.007790721021592617\n", - "2 particle score : 0.5\n", - "3 particle score : 0.75\n", - "4 particle score : 0.5\n", - "0 particle score : 0.25\n", - "1 particle score : 0.5\n", - "2 particle score : 0.5\n", - "3 particle score : 0.0\n", - "4 particle score : 0.5\n", - "1/1 [==============================] - 0s 40ms/step\n", - "[[1.8555788e-26]\n", - " [1.0000000e+00]\n", - " [1.0000000e+00]\n", - " [1.8555788e-26]]\n", + "loss : 0.2620863338311513 | acc : 0.5 | best loss : 0.24143654108047485\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iteration 1 / 10: 100%|##########| 15/15 [00:05<00:00, 2.69it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss : 0.24147300918896994 | acc : 0.6333333333333333 | best loss : 0.20360520482063293\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iteration 2 / 10: 100%|##########| 15/15 [00:05<00:00, 2.72it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss : 0.211648628115654 | acc : 0.65 | best loss : 0.17383326590061188\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iteration 3 / 10: 100%|##########| 15/15 [00:05<00:00, 2.72it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss : 0.21790608167648315 | acc : 0.6833333333333333 | best loss : 0.16785581409931183\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iteration 4 / 10: 100%|##########| 15/15 [00:05<00:00, 2.73it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss : 0.20557119349638622 | acc : 0.7333333333333333 | best loss : 0.16668711602687836\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iteration 5 / 10: 100%|##########| 15/15 [00:05<00:00, 2.68it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss : 0.20823073089122773 | acc : 0.7 | best loss : 0.16668711602687836\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iteration 6 / 10: 100%|##########| 15/15 [00:05<00:00, 2.53it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss : 0.21380058924357095 | acc : 0.7166666666666667 | best loss : 0.16668711602687836\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iteration 7 / 10: 100%|##########| 15/15 [00:06<00:00, 2.30it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss : 0.2561836312214533 | acc : 0.6833333333333333 | best loss : 0.16667115688323975\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iteration 8 / 10: 100%|##########| 15/15 [00:05<00:00, 2.55it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss : 0.30372582376003265 | acc : 0.65 | best loss : 0.16667115688323975\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Iteration 9 / 10: 100%|##########| 15/15 [00:05<00:00, 2.65it/s]" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "loss : 0.281868569056193 | acc : 0.7 | best loss : 0.16667115688323975\n", + "1/1 [==============================] - 0s 26ms/step\n", + "[[0. ]\n", + " [0.66422266]\n", + " [0.6642227 ]\n", + " [0.6642227 ]]\n", "[[0]\n", " [1]\n", " [1]\n", - " [0]]\n", - "history > [[array([[-0.9191145, -0.7256227],\n", - " [ 1.2947526, 1.0081983]], dtype=float32), array([ 0.01203067, -0.07866445], dtype=float32), array([[-0.72274315],\n", - " [ 0.88691926]], dtype=float32), array([-0.08449478], dtype=float32)], [array([[-0.7327981, -2.120965 ],\n", - " [ 3.5870228, 2.0618958]], dtype=float32), array([-0.06788628, -2.1460009 ], dtype=float32), array([[-1.8084345],\n", - " [ 3.2274616]], dtype=float32), array([0.40823892], dtype=float32)], [array([[-6.749437, -5.01979 ],\n", - " [ 9.477569, 9.011221]], dtype=float32), array([ 1.0140182, -5.089527 ], dtype=float32), array([[-5.9527373],\n", - " [ 8.538484 ]], dtype=float32), array([0.8423419], dtype=float32)], [array([[-4.4376955, -7.542317 ],\n", - " [13.042126 , 9.401183 ]], dtype=float32), array([ 1.7249748, -6.2829194], dtype=float32), array([[-4.6019 ],\n", - " [12.654787]], dtype=float32), array([2.11288], dtype=float32)], [array([[-7.9655757, -8.855807 ],\n", - " [14.27012 , 12.6986265]], dtype=float32), array([ 2.2102568, -7.4656196], dtype=float32), array([[-5.386531],\n", - " [16.770058]], dtype=float32), array([2.2161639], dtype=float32)], [array([[-10.937471, -9.346545],\n", - " [ 15.040345, 13.547635]], dtype=float32), array([ 3.7305086, -8.93729 ], dtype=float32), array([[-9.661456],\n", - " [14.314214]], dtype=float32), array([1.9838718], dtype=float32)], [array([[-7.618989 , -8.295806 ],\n", - " [ 9.591193 , 7.3881774]], dtype=float32), array([ 2.9443424, -6.85388 ], dtype=float32), array([[-6.120155],\n", - " [ 9.558391]], dtype=float32), array([2.900807], dtype=float32)], [array([[-12.431582, -14.683373],\n", - " [ 24.192898, 18.607504]], dtype=float32), array([ 4.375762, -11.899742], dtype=float32), array([[-11.140665],\n", - " [ 25.361753]], dtype=float32), array([3.5045836], dtype=float32)], [array([[-16.167437, -19.325432],\n", - " [ 25.197618, 15.928284]], dtype=float32), array([ 6.8536587, -14.406519 ], dtype=float32), array([[-16.149462],\n", - " [ 21.955147]], dtype=float32), array([6.5853295], dtype=float32)], [array([[-20.64401 , -25.207134],\n", - " [ 28.023142, 19.938404]], dtype=float32), array([ 7.2551775, -17.74039 ], dtype=float32), array([[-15.623163],\n", - " [ 30.90391 ]], dtype=float32), array([7.7026973], dtype=float32)], [array([[-27.585245, -28.003128],\n", - " [ 46.606903, 34.010803]], dtype=float32), array([ 9.391173, -25.379646], dtype=float32), array([[-27.2021 ],\n", - " [ 44.79025]], dtype=float32), array([9.642486], dtype=float32)], [array([[-44.09209, -37.20285],\n", - " [ 47.20231, 40.34598]], dtype=float32), array([ 13.101824, -25.8866 ], dtype=float32), array([[-33.470924],\n", - " [ 47.784706]], dtype=float32), array([14.320648], dtype=float32)], [array([[-36.38443 , -39.23304 ],\n", - " [ 52.953644, 38.646732]], dtype=float32), array([ 10.276208, -30.864595], dtype=float32), array([[-31.08338],\n", - " [ 52.16088]], dtype=float32), array([15.342434], dtype=float32)], [array([[-62.84543 , -47.409748],\n", - " [ 63.300335, 56.867214]], dtype=float32), array([ 17.78217, -33.01626], dtype=float32), array([[-48.512455],\n", - " [ 61.87751 ]], dtype=float32), array([19.369736], dtype=float32)], [array([[-71.16499 , -57.702408],\n", - " [ 80.223915, 69.13328 ]], dtype=float32), array([ 19.08833 , -41.566013], dtype=float32), array([[-57.950104],\n", - " [ 76.35351 ]], dtype=float32), array([24.470982], dtype=float32)], [array([[-120.93972, -92.38105],\n", - " [ 107.01377, 110.19025]], dtype=float32), array([ 28.39684 , -59.285316], dtype=float32), array([[-75.1781 ],\n", - " [129.59488]], dtype=float32), array([34.034805], dtype=float32)], [array([[-161.36476, -114.62916],\n", - " [ 142.47905, 152.3887 ]], dtype=float32), array([ 36.139404, -74.1054 ], dtype=float32), array([[-101.517525],\n", - " [ 171.30031 ]], dtype=float32), array([42.26851], dtype=float32)]]\n", - "score > [0.5, 0.5]\n" + " [0]]\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "\n" ] } ], @@ -309,13 +249,12 @@ "model = make_model()\n", "\n", "loss = keras.losses.MeanSquaredError()\n", - "optimizer = keras.optimizers.SGD(lr=0.1, momentum=1, decay=1e-05, nesterov=True)\n", + "optimizer = keras.optimizers.SGD(lr=0.1, momentum=0.9, decay=1e-05, nesterov=True)\n", "\n", "\n", + "pso_xor = PSO(model=model, loss_method=loss, optimizer=optimizer, n_particles=15)\n", "\n", - "pso_xor = PSO(model=model, loss=loss, optimizer=optimizer, n_particles=5)\n", - "\n", - "best_weights, score = pso_xor.optimize(x, y, x_test, y_test, maxiter=30)\n", + "best_weights, score = pso_xor.optimize(x, y, x_test, y_test, maxiter=10, epochs=20)\n", "\n", "model.set_weights(best_weights)\n", "\n", @@ -330,6 +269,17 @@ "# plt.plot(history)\n" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x_test = np.array([[0, 1], [0, 0], [1, 1], [1, 0]])\n", + "y_pred = model.predict(x_test)\n", + "print(y_pred)" + ] + }, { "cell_type": "code", "execution_count": null, @@ -352,6 +302,26 @@ " return hist" ] }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "predicted_result = model.predict(x_test)\n", + "predicted_labels = np.argmax(predicted_result, axis=1)\n", + "not_correct = []\n", + "for i in range(len(y_test)):\n", + " if predicted_labels[i] != y_test[i]:\n", + " not_correct.append(i)\n", + " # print(f\"추론 > {predicted_labels[i]} | 정답 > {y_test[i]}\")\n", + " \n", + "print(f\"틀린 것 갯수 > {len(not_correct)}\")\n", + "for i in range(3):\n", + " plt.imshow(x_test[not_correct[i]].reshape(28,28), cmap='Greys')\n", + "plt.show()" + ] + }, { "cell_type": "code", "execution_count": null,