mirror of
https://github.com/jung-geun/PSO.git
synced 2025-12-19 20:44:39 +09:00
23-07-21
pypi 0.1.4 업데이트 keras 의 메모리 누수를 어느정도 해결했으나 아직 완벽히 해결이 되지 않음 입력 데이터를 tensor 형태로 변환해주어 넣는 방식으로 전환
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
from .optimizer import Optimizer
|
||||
from .particle import Particle
|
||||
|
||||
__version__ = "0.1.3"
|
||||
__version__ = "0.1.4"
|
||||
|
||||
__all__ = [
|
||||
"Optimizer",
|
||||
|
||||
@@ -38,6 +38,7 @@ class Optimizer:
|
||||
mutation_swarm: float = 0,
|
||||
np_seed: int = None,
|
||||
tf_seed: int = None,
|
||||
random_state: tuple = None,
|
||||
particle_min: float = -5,
|
||||
particle_max: float = 5,
|
||||
):
|
||||
@@ -66,6 +67,9 @@ class Optimizer:
|
||||
|
||||
self.random_state = np.random.get_state()
|
||||
|
||||
if random_state is not None:
|
||||
np.random.set_state(random_state)
|
||||
|
||||
self.model = model # 모델 구조
|
||||
self.loss = loss # 손실함수
|
||||
self.n_particles = n_particles # 파티클 개수
|
||||
@@ -113,6 +117,8 @@ class Optimizer:
|
||||
print(f"mutation swarm : {mutation_swarm * 100}%")
|
||||
|
||||
gc.collect()
|
||||
tf.keras.backend.reset_uids()
|
||||
tf.keras.backend.clear_session()
|
||||
|
||||
def __del__(self):
|
||||
del self.model
|
||||
@@ -129,6 +135,8 @@ class Optimizer:
|
||||
del self.g_best_
|
||||
del self.avg_score
|
||||
gc.collect()
|
||||
tf.keras.backend.reset_uids()
|
||||
tf.keras.backend.clear_session()
|
||||
|
||||
def _encode(self, weights):
|
||||
"""
|
||||
@@ -304,7 +312,8 @@ class Optimizer:
|
||||
tf.summary.scalar("accuracy", local_score[1], step=0)
|
||||
del local_score
|
||||
gc.collect()
|
||||
|
||||
tf.keras.backend.reset_uids()
|
||||
tf.keras.backend.clear_session()
|
||||
print(
|
||||
f"initial g_best_score : {self.g_best_score[0] if self.renewal == 'acc' else self.g_best_score[1]}"
|
||||
)
|
||||
@@ -454,7 +463,9 @@ class Optimizer:
|
||||
f.write(", ")
|
||||
else:
|
||||
f.write("\n")
|
||||
|
||||
# gc.collect()
|
||||
# tf.keras.backend.reset_uids()
|
||||
# tf.keras.backend.clear_session()
|
||||
part_pbar.refresh()
|
||||
|
||||
if check_point is not None:
|
||||
@@ -463,6 +474,8 @@ class Optimizer:
|
||||
self._check_point_save(f"./{save_path}/{self.day}/ckpt-{epoch}")
|
||||
|
||||
gc.collect()
|
||||
tf.keras.backend.reset_uids()
|
||||
tf.keras.backend.clear_session()
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print("Ctrl + C : Stop Training")
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import gc
|
||||
|
||||
import numpy as np
|
||||
import tensorflow as tf
|
||||
from tensorflow import keras
|
||||
|
||||
|
||||
@@ -37,7 +38,6 @@ class Particle:
|
||||
|
||||
del i_w_, s_, l_
|
||||
del init_weights
|
||||
gc.collect()
|
||||
|
||||
def __del__(self):
|
||||
del self.model
|
||||
@@ -46,7 +46,6 @@ class Particle:
|
||||
del self.negative
|
||||
del self.best_score
|
||||
del self.best_weights
|
||||
gc.collect()
|
||||
|
||||
def _encode(self, weights: list):
|
||||
"""
|
||||
@@ -109,7 +108,7 @@ class Particle:
|
||||
(float): 점수
|
||||
"""
|
||||
self.model.compile(loss=self.loss, optimizer="sgd", metrics=["accuracy"])
|
||||
score = self.model.evaluate(x, y, verbose=0)
|
||||
score = self.model.evaluate(x, y, verbose=0, use_multiprocessing=True)
|
||||
if renewal == "acc":
|
||||
if score[1] > self.best_score:
|
||||
self.best_score = score[1]
|
||||
@@ -221,26 +220,6 @@ class Particle:
|
||||
del encode_w, w_sh, w_len
|
||||
del encode_v, v_sh, v_len
|
||||
|
||||
def f(self, x, y, weights):
|
||||
"""
|
||||
EBPSO의 목적함수(예상)
|
||||
|
||||
Args:
|
||||
x (list): 입력 데이터
|
||||
y (list): 출력 데이터
|
||||
weights (list): 가중치
|
||||
|
||||
Returns:
|
||||
float: 목적함수 값
|
||||
"""
|
||||
self.model.set_weights(weights)
|
||||
score = self.model.evaluate(x, y, verbose=0)[1]
|
||||
|
||||
if score > 0:
|
||||
return 1 / (1 + score)
|
||||
else:
|
||||
return 1 + np.abs(score)
|
||||
|
||||
def step(self, x, y, local_rate, global_rate, w, g_best, renewal: str = "acc"):
|
||||
"""
|
||||
파티클의 한 스텝을 진행합니다.
|
||||
|
||||
Reference in New Issue
Block a user