pypi 0.1.4 업데이트
keras 의 메모리 누수를 어느정도 해결했으나 아직 완벽히 해결이 되지 않음
입력 데이터를 tensor 형태로 변환해주어 넣는 방식으로 전환
This commit is contained in:
jung-geun
2023-07-21 15:20:24 +09:00
parent 23176bafb2
commit 99b1de3f82
9 changed files with 96 additions and 68 deletions

View File

@@ -1,3 +1,5 @@
[![Python Package Index publish](https://github.com/jung-geun/PSO/actions/workflows/pypi.yml/badge.svg?event=push)](https://github.com/jung-geun/PSO/actions/workflows/pypi.yml)
# PSO 알고리즘 구현 및 새로운 시도
pso 알고리즘을 사용하여 새로운 학습 방법을 찾는중 입니다
@@ -21,16 +23,24 @@ pso 알고리즘을 사용하여 새로운 학습 방법을 찾는중 입니다
> \end{cases}
> $$
### 위치를 현재 전역해로 변경(덮어쓰기)하면 안되는 이유
위치를 가장 최적값으로 변경하면 지역 최적값에서 벗어나지 못합니다. 따라서 전역 최적값을 찾을 수 없습니다.
# 초기 세팅
자동으로 conda 환경을 설정하기 위해서는 다음 명령어를 사용합니다
```shell
conda env create -f ./conda_env/environment.yaml
```
현재 python 3.9 버전, tensorflow 2.11 버전에서 테스트 되었습니다
</br>
직접 설치하여 사용할 경우 pso2keras 패키지를 pypi 에서 다운로드 받아서 사용하시기 바랍니다
```shell
pip install pso2keras==0.1.4
```
위의 패키지를 사용하기 위해서는 tensorflow 와 tensorboard 가 설치되어 있어야 합니다
# 현재 진행 상황
## 1. PSO 알고리즘 구현
@@ -55,6 +65,7 @@ conda env create -f ./conda_env/environment.yaml
|-- mnist_tf.py # tensorflow 를 이용한 mnist 문제 풀이
|-- plt.ipynb # pyplot 으로 학습 결과를 그래프로 표현
|-- README.md # 현재 파일
|-- requirements.txt # pypi 에서 다운로드 받을 패키지 목록
```
pso 라이브러리는 tensorflow 모델을 학습하기 위해 기본 ./metacode/pso_meta.py 코드에서 수정하였습니다 [2]
@@ -63,20 +74,12 @@ pso 라이브러리는 tensorflow 모델을 학습하기 위해 기본 ./metacod
pso 알고리즘을 이용하여 오차역전파 함수를 최적화 하는 방법을 찾는 중입니다
### 브레인스토밍
### 알고리즘 작동 방식
> 1. 오차역전파 함수를 1~5회 실행하여 오차를 구합니다
> 2. 오차가 가장 적은 다른 노드(particle) 가중치로 유도합니다.
>
> > 2-1. 만약 오차가 가장 작은 다른 노드가 현재 노드보다 오차가 크다면, 현재 노드의 가중치를 유지합니다. - 현재의 가중치를 최적값으로 업로드합니다
> >
> > 2-2. 지역 최적값을 찾았다면, 전역 최적값을 찾을 때까지 1~2 과정을 반복합니다
>
> 3. 전역 최적값이 특정 임계치에서 변화율이 적다면 학습을 종료합니다 - 현재 결과가 정확도가 높지 않아서 이 기능은 추후에 추가할 예정입니다
</br>
위의 아이디어는 원래의 목표와 다른 방향으로 가고 있습니다. 따라서 다른 방법을 모색해야할 것 같습니다
</br>
> 1. 파티클의 위치와 속도를 초기화 한다.
> 2. 각 파티클의 점수를 계산한다.
> 3. 각 파티클의 지역 최적해와 전역 최적해를 구한다.
> 4. 각 파티클의 속도를 업데이트 한다.
## 3. PSO 알고리즘을 이용하여 풀이한 문제들의 정확도
@@ -160,30 +163,33 @@ loss = 'mean_squared_error'
pso_mnist = Optimizer(
model,
loss=loss,
n_particles=75,
c0=0.25,
c1=0.4,
w_min=0.2,
w_max=0.6,
n_particles=100,
c0=0.3,
c1=0.5,
w_min=0.4,
w_max=0.7,
negative_swarm=0.1,
mutation_swarm=0.2,
particle_min=-5,
particle_max=5,
)
best_score = pso_mnist.fit(
x_test,
y_test,
x_train,
y_train,
epochs=200,
save=True,
save_info=True,
log=2,
log_name="mnist",
save_path="./result/mnist",
renewal="acc",
empirical_balance=False,
Dispersion=False,
check_point=25
check_point=25,
)
```
위의 파라미터 기준 현재 정확도 43.38%를 보이고 있습니다
![mnist](./history_plt/mnist_mse_43.38.png)
위의 파라미터 기준 현재 정확도 51.84%를 보이고 있습니다
![mnist_acc](./history_plt/mnist_51.74_acc.png)
![mnist_loss](./history_plt/mnist_51.74_loss.png)
### Trouble Shooting
@@ -194,13 +200,20 @@ best_score = pso_mnist.fit(
> 2. 지역최적값에 계속 머무르는 조기 수렴 현상이 나타난다. - 30% 정도의 정확도를 가진다
-> 지역최적값에 머무르는 것을 방지하기 위해 negative_swarm, mutation_swarm 파라미터를 추가하였습니다 - 현재 43% 정도의 정확도를 보이고 있습니다
-> 지역최적값에 머무르는 것을 방지하기 위해 negative_swarm, mutation_swarm 파라미터를 추가하였습니다 - 현재 51% 정도의 정확도를 보이고 있습니다
> 3. 파티클의 수를 늘리면 전역 최적해에 좀더 가까워지는 현상을 발견하였다. 하지만 파티클의 수를 늘리면 메모리 사용량이 기하급수적으로 늘어난다.
-> keras 모델을 사용할때 predict, evaluate 함수를 사용하면 메모리 누수가 발생하는 문제를 찾았습니다. 해결방법을 추가로 찾아보는중 입니다.
-> 추가로 파티클의 수가 적을때에도 전역 최적해를 쉽게 찾는 방법을 찾는중 입니다
### 개인적인 생각
> 머신러닝 분류 방식에 존재하는 random forest 방식을 이용하여, 오차역전파 함수를 최적화 하는 방법이 있을것 같습니다
>
> > pso 와 random forest 방식이 매우 유사하다고 생각하여 학습할 때 뿐만 아니라 예측 할 때도 이러한 방식으로 사용할 수 있을 것 같습니다
>
>
# 참고 자료