readme 파일 수정 - env 파일 및 설명 추가 , 참고 자료 수정
iris_tf.py 모델의 성능 교차 검증을 위해 추가
This commit is contained in:
jung-geun
2023-06-23 06:37:01 +00:00
parent 953cd44396
commit 2a28b7fa04
7 changed files with 98 additions and 57 deletions

View File

@@ -11,8 +11,8 @@ from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split from sklearn.model_selection import train_test_split
from tensorflow import keras from tensorflow import keras
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
from pso import Optimizer from pso import Optimizer
@@ -40,7 +40,7 @@ def load_data():
model = make_model() model = make_model()
x_train, x_test, y_train, y_test = load_data() x_train, x_test, y_train, y_test = load_data()
loss = ['categorical_crossentropy', 'accuracy','mse'] loss = ['categorical_crossentropy']
pso_iris = Optimizer( pso_iris = Optimizer(
model, model,

51
iris_tf.py Normal file
View File

@@ -0,0 +1,51 @@
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices("GPU")
if gpus:
try:
# tf.config.experimental.set_visible_devices(gpus[0], "GPU")
tf.config.experimental.set_memory_growth(gpus[0], True)
except RuntimeError as e:
print(e)
from tensorflow import keras
from tensorflow.keras import layers
from tensorflow.keras.models import Sequential
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
def make_model():
model = Sequential()
model.add(layers.Dense(10, activation='relu', input_shape=(4,)))
model.add(layers.Dense(10, activation='relu'))
model.add(layers.Dense(3, activation='softmax'))
return model
def load_data():
iris = load_iris()
x = iris.data
y = iris.target
y = keras.utils.to_categorical(y, 3)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, shuffle=True, stratify=y)
return x_train, x_test, y_train, y_test
if __name__ == "__main__":
model = make_model()
x_train, x_test, y_train, y_test = load_data()
print(x_train.shape, y_train.shape)
loss = ['categorical_crossentropy', 'accuracy','mse']
metrics = ['accuracy']
model.compile(optimizer='sgd', loss=loss[0], metrics=metrics[0])
model.fit(x_train, y_train, epochs=200, batch_size=32, validation_split=0.2)
model.evaluate(x_test, y_test, batch_size=32)

File diff suppressed because one or more lines are too long

View File

@@ -5,7 +5,6 @@ import tensorflow as tf
from tensorflow import keras from tensorflow import keras
import numpy as np import numpy as np
# import cupy as cp # import cupy as cp
from tqdm import tqdm from tqdm import tqdm
@@ -57,7 +56,7 @@ class Optimizer:
self.w_min = w_min # 최소 관성 수치 self.w_min = w_min # 최소 관성 수치
self.w_max = w_max # 최대 관성 수치 self.w_max = w_max # 최대 관성 수치
self.negative_swarm = negative_swarm # 최적해와 반대로 이동할 파티클 비율 - 0 ~ 1 사이의 값 self.negative_swarm = negative_swarm # 최적해와 반대로 이동할 파티클 비율 - 0 ~ 1 사이의 값
self.g_best_score = 0 # 최고 점수 - 시작은 0으로 초기화 self.g_best_score = [0 , np.inf] # 최고 점수 - 시작은 0으로 초기화
self.g_best = None # 최고 점수를 받은 가중치 self.g_best = None # 최고 점수를 받은 가중치
self.g_best_ = None # 최고 점수를 받은 가중치 - 값의 분산을 위한 변수 self.g_best_ = None # 최고 점수를 받은 가중치 - 값의 분산을 위한 변수
self.avg_score = 0 # 평균 점수 self.avg_score = 0 # 평균 점수
@@ -196,10 +195,6 @@ class Optimizer:
self.Dispersion = Dispersion self.Dispersion = Dispersion
self.renewal = renewal self.renewal = renewal
if renewal == "acc":
self.g_best_score = 0
elif renewal == "loss":
self.g_best_score = np.inf
try: try:
if save: if save:
@@ -219,13 +214,13 @@ class Optimizer:
local_score = p.get_score(x, y, renewal=renewal) local_score = p.get_score(x, y, renewal=renewal)
if renewal == "acc": if renewal == "acc":
if local_score[1] > self.g_best_score: if local_score[1] > self.g_best_score[0]:
self.g_best_score = local_score[1] self.g_best_score[0] = local_score[1]
self.g_best = p.get_best_weights() self.g_best = p.get_best_weights()
self.g_best_ = p.get_best_weights() self.g_best_ = p.get_best_weights()
elif renewal == "loss": elif renewal == "loss":
if local_score[0] < self.g_best_score: if local_score[0] < self.g_best_score[1]:
self.g_best_score = local_score[0] self.g_best_score[1] = local_score[0]
self.g_best = p.get_best_weights() self.g_best = p.get_best_weights()
self.g_best_ = p.get_best_weights() self.g_best_ = p.get_best_weights()
@@ -248,13 +243,11 @@ class Optimizer:
del local_score del local_score
gc.collect() gc.collect()
print(f"initial g_best_score : {self.g_best_score}") print(f"initial g_best_score : {self.g_best_score[0] if self.renewal == 'acc' else self.g_best_score[1]}")
try: try:
epochs_pbar = tqdm(range(epochs), desc=f"best {self.renewal} : {self.g_best_score:.4f}", ascii=True, leave=True) epochs_pbar = tqdm(range(epochs), desc=f"best {self.g_best_score[0]:.4f}|{self.g_best_score[1]:.4f}", ascii=True, leave=True)
for _ in epochs_pbar: for _ in epochs_pbar:
epochs_pbar.set_description(f"best {self.renewal} : {self.g_best_score:.4f}")
acc = 0 acc = 0
loss = 0 loss = 0
min_score = np.inf min_score = np.inf
@@ -315,13 +308,19 @@ class Optimizer:
) )
if renewal == "acc": if renewal == "acc":
if score[1] >= self.g_best_score: if score[1] >= self.g_best_score[0]:
self.g_best_score = score[1] self.g_best_score[0] = score[1]
if score[0] <= self.g_best_score[1]:
self.g_best_score[1] = score[0]
self.g_best = self.particles[i].get_best_weights() self.g_best = self.particles[i].get_best_weights()
epochs_pbar.set_description(f"best {self.g_best_score[0]:.4f} | {self.g_best_score[1]:.4f}")
elif renewal == "loss": elif renewal == "loss":
if score[0] <= self.g_best_score: if score[0] <= self.g_best_score[1]:
self.g_best_score = score[0] self.g_best_score[1] = score[0]
if score[1] >= self.g_best_score[0]:
self.g_best_score[0] = score[1]
self.g_best = self.particles[i].get_best_weights() self.g_best = self.particles[i].get_best_weights()
epochs_pbar.set_description(f"best {self.g_best_score[0]:.4f} | {self.g_best_score[1]:.4f}")
if score[0] == None: if score[0] == None:
score[0] = np.inf score[0] = np.inf
@@ -350,12 +349,6 @@ class Optimizer:
else: else:
f.write("\n") f.write("\n")
# print(f"loss min : {min_loss} | loss max : {max_loss} | acc min : {min_score} | acc max : {max_score}")
# print(f"loss avg : {loss/self.n_particles} | acc avg : {acc/self.n_particles} | Best {renewal} : {self.g_best_score}")
# print(
# f"loss min : {round(min_loss, 4)} | acc max : {round(max_score, 4)} | Best {renewal} : {self.g_best_score}"
# )
if check_point is not None: if check_point is not None:
if _ % check_point == 0: if _ % check_point == 0:
os.makedirs(f"./{save_path}/{self.day}", exist_ok=True) os.makedirs(f"./{save_path}/{self.day}", exist_ok=True)

View File

@@ -5,7 +5,6 @@ from tensorflow import keras
import numpy as np import numpy as np
import gc import gc
class Particle: class Particle:
""" """
Particle Swarm Optimization의 Particle을 구현한 클래스 Particle Swarm Optimization의 Particle을 구현한 클래스

View File

@@ -1,7 +1,7 @@
# PSO 알고리즘 구현 및 새로운 시도 # PSO 알고리즘 구현 및 새로운 시도
pso 알고리즘을 사용하여 새로운 학습 방법을 찾는중 입니다 pso 알고리즘을 사용하여 새로운 학습 방법을 찾는중 입니다
병렬처리로 사용하는 논문을 찾아보았지만 이보다 더 좋은 방법이 있을 것 같아서 찾아보고 있습니다 - A Distribute Deep Learning System Using PSO Algorithm.pdf 병렬처리로 사용하는 논문을 찾아보았지만 이보다 더 좋은 방법이 있을 것 같아서 찾아보고 있습니다 - \[1]
기본 pso 알고리즘의 수식은 다음과 같습니다 기본 pso 알고리즘의 수식은 다음과 같습니다
@@ -38,28 +38,31 @@ $$
### 파일 구조 ### 파일 구조
``` plain text ``` plain text
|-- metacode # pso 기본 코드 |-- /metacode # pso 기본 코드
| |-- pso_bp.py # 오차역전파 함수를 최적화하는 PSO 알고리즘 구현 - 성능이 99% 이상으로 나오나 목적과 다름 | |-- pso_bp.py # 오차역전파 함수를 최적화하는 PSO 알고리즘 구현 - 성능이 99% 이상으로 나오나 목적과 다름
| |-- pso_meta.py # PSO 기본 알고리즘 구현 | |-- pso_meta.py # PSO 기본 알고리즘 구현
| |-- pso_tf.py # tensorflow 모델을 이용가능한 PSO 알고리즘 구현 | |-- pso_tf.py # tensorflow 모델을 이용가능한 PSO 알고리즘 구현
|-- pso # tensorflow 모델을 학습하기 위해 기본 pso 코드에서 수정 - (psokeras 코드 의 구조를 사용하여 만듬) |-- /pso # tensorflow 모델을 학습하기 위해 기본 pso 코드에서 수정 - (psokeras 코드 의 구조를 사용하여 만듬)
| |-- __init__.py # pso 모듈을 사용하기 위한 초기화 파일 | |-- __init__.py # pso 모듈을 사용하기 위한 초기화 파일
| |-- optimizer.py # pso 알고리즘 이용을 위한 기본 코드 | |-- optimizer.py # pso 알고리즘 이용을 위한 기본 코드
| |-- particle.py # 각 파티클의 정보 및 위치를 저장하는 코드 | |-- particle.py # 각 파티클의 정보 및 위치를 저장하는 코드
|-- psokeras # keras 모델을 이용가능한 PSO 알고리즘 - 다른 사람의 코드 |-- /psokeras # keras 모델을 이용가능한 PSO 알고리즘 - 다른 사람의 코드
| |-- *** | |-- ***
|-- pyswarms # pyswarms 라이브러리를 이용가능한 PSO 알고리즘 - 다른 사람의 코드 |-- /pyswarms # pyswarms 라이브러리를 이용가능한 PSO 알고리즘 - 다른 사람의 코드
| |-- *** | |-- ***
|-- examples.py # psokeras 코드를 이용한 예제 |-- examples.py # psokeras 코드를 이용한 예제
|-- iris.py # pso 코드를 이용한 iris 문제 풀이 |-- xor.ipynb # pso 를 이용한 xor 문제 풀이
|-- mnist.py # pso 코드를 이용한 mnist 문제 풀이 |-- iris.py # pso 를 이용한 iris 문제 풀이
|-- xor.ipynb # pso 코드를 이용한 xor 문제 풀이 |-- iris_tf.py # tensorflow 를 이용한 iris 문제 풀이
|-- mnist.py # pso 를 이용한 mnist 문제 풀이
|-- plt.ipynb # pyplot 으로 학습 결과를 그래프로 표현 |-- plt.ipynb # pyplot 으로 학습 결과를 그래프로 표현
|-- env.yaml # conda 환경 설정 파일
|-- readme.md # 현재 파일
``` ```
psokeras 및 pyswarms 라이브러리는 외부 라이브러리이기에 코드를 수정하지 않았습니다 psokeras 및 pyswarms 라이브러리는 외부 라이브러리이기에 코드를 수정하지 않았습니다
pso 라이브러리는 tensorflow 모델을 학습하기 위해 기본 ./metacode/pso_meta.py 코드에서 수정하였습니다 pso 라이브러리는 tensorflow 모델을 학습하기 위해 기본 ./metacode/pso_meta.py 코드에서 수정하였습니다 [2]
## 2. PSO 알고리즘을 이용한 최적화 문제 풀이 ## 2. PSO 알고리즘을 이용한 최적화 문제 풀이
@@ -76,9 +79,9 @@ pso 알고리즘을 이용하여 오차역전파 함수를 최적화 하는 방
> >
> 3. 전역 최적값이 특정 임계치에서 변화율이 적다면 학습을 종료합니다 - 현재 결과가 정확도가 높지 않아서 이 기능은 추후에 추가할 예정입니다 > 3. 전역 최적값이 특정 임계치에서 변화율이 적다면 학습을 종료합니다 - 현재 결과가 정확도가 높지 않아서 이 기능은 추후에 추가할 예정입니다
<br> </br>
위의 아이디어는 원래의 목표와 다른 방향으로 가고 있습니다. 따라서 다른 방법을 모색해야할 것 같습니다 위의 아이디어는 원래의 목표와 다른 방향으로 가고 있습니다. 따라서 다른 방법을 모색해야할 것 같습니다
<br> </br>
## 3. PSO 알고리즘을 이용하여 풀이한 문제들의 정확도 ## 3. PSO 알고리즘을 이용하여 풀이한 문제들의 정확도
@@ -195,9 +198,8 @@ best_score = pso_mnist.fit(
# 참고 자료 # 참고 자료
> A partilce swarm optimization algorithm with empirical balance stategy - <https://www.sciencedirect.com/science/article/pii/S2590054422000185#bib0005> <br> [1]: [A partilce swarm optimization algorithm with empirical balance stategy](https://www.sciencedirect.com/science/article/pii/S2590054422000185#bib0005) </br>
> psokeras - <https://github.com/mike-holcomb/PSOkeras> <br> [2]: [psokeras](https://github.com/mike-holcomb/PSOkeras) </br>
> PSO의 다양한 영역 탐색과 [3]: [PSO의 다양한 영역 탐색과 지역적 미니멈 인식을 위한 전략](https://koreascience.kr/article/JAKO200925836515680.pdf) </br>
지역적 미니멈 인식을 위한 전략 - <https://koreascience.kr/article/JAKO200925836515680.pdf> <br> [4]: [PC 클러스터 기반의 Multi-HPSO를 이용한 안전도 제약의 경제 급전](https://koreascience.kr/article/JAKO200932056732373.pdf) </br>
> PC 클러스터 기반의 Multi-HPSO를 이용한 안전도 제약의 경제 급전 - <https://koreascience.kr/article/JAKO200932056732373.pdf> <br> [5]: [Particle 2-Swarm Optimization for Robust Search](https://s-space.snu.ac.kr/bitstream/10371/29949/3/management_information_v18_01_p01.pdf) </br>
> Particle 2-Swarm Optimization for Robust Search - <https://s-space.snu.ac.kr/bitstream/10371/29949/3/management_information_v18_01_p01.pdf> <br>

4
xor.py
View File

@@ -10,15 +10,11 @@ np.random.seed(777)
# from pso_tf import PSO # from pso_tf import PSO
from pso import Optimizer from pso import Optimizer
from tensorflow import keras
from tensorflow import keras from tensorflow import keras
from tensorflow.keras.models import Sequential from tensorflow.keras.models import Sequential
from tensorflow.keras import layers from tensorflow.keras import layers
from datetime import datetime
print(tf.__version__) print(tf.__version__)
print(tf.config.list_physical_devices()) print(tf.config.list_physical_devices())