2020. 2. 2. 16:49ㆍ분석 Python/Tensorflow
광고 한 번만 눌러주세요 블로그 운영에 큰 힘이 됩니다! :)
최근에 optuna를 쓰다가 먼가 cpu를 잘 안 쓰는 것 같아서 다른 것을 고민하다가 tune을 발견했다.
https://towardsdatascience.com/fast-hyperparameter-tuning-at-scale-d428223b081c
일단 표 자체에서는 search algorithms 과 fault tolerance 차이밖에 없긴 해서, 더 cpu를 효율적으로 쓰는지는 모르겠지만, medium 글 결과를 보니 효율적으로 쓰는 것 같아서, 기대감에 도전해보기로 했다.
저기 글에선 다른 Framework를 지원해준다고 했지만, 아쉽게도 tensorflow 2부터였다...(언젠가는 넘어가야지..)
필자는 거의 tensorflow version 1을 주로 쓰다 보니, 먼가 고민을 해야 했다.
그래서 지금 원래 코드에서는 안 돌아가서 간단한 코드를 만들어 테스트를 해봤다.
https://ray.readthedocs.io/en/latest/search.html?q=tune.run&check_keywords=yes&area=default
일단은 간단하게 그래프를 만들고 w를 찾는 것을 해봤다.
하나 알게 된 점은 tune을 쓸 때는 simplemodel 함수 안에서 package를 import 해야 에러가 안 난다.
https://ray.readthedocs.io/en/latest/using-ray-with-tensorflow.html
원래 필자의 코드는 여러 개로 분리되어 있고 다른 곳에서 import 해서 사용하고 있는데...
class로 만들어서 다시 도전해봐야겠다.
아무튼 간단한 모델을 만들어봤다.
def simplemodel(config) :
import tensorflow as tf
w = config["node"]
print("="*10)
print(w)
print("="*10)
tf.reset_default_graph()
a = tf.constant([w], dtype=tf.float32,shape=())
loss = (5-a)**2
config=tf.ConfigProto(log_device_placement=True)
config.gpu_options.allow_growth = True
sess = tf.Session(config = config)
sess.run(tf.global_variables_initializer())
loss2 = sess.run(loss, feed_dict={a:w})
tune.track.log(loss=loss2,done=True)
if __name__ == '__main__':
from ray.tune.schedulers import AsyncHyperBandScheduler
ray.init()
sched = AsyncHyperBandScheduler(
metric="loss",
mode="min",
max_t=10,
grace_period=2)
tune.run(
simplemodel,
config={ "node" : tune.uniform(0,10)},
name="tune",
stop={
"loss": 0.0
},
num_samples=2,
scheduler=sched)
잘 돌아간다!
다음에는 회귀모형을 만들어서 구해봤다.
data = np.random.normal(size = (100,2))
true = 5*np.random.normal(size = (100,1))
def simplemodel(space) :
import tensorflow as tf
w = space["node"]
print("="*10)
print(w)
print("="*10)
tf.reset_default_graph()
X = tf.placeholder(tf.float32,shape=[None,2], name= "X")
y = tf.placeholder(tf.float32,shape=[None,1], name= "y")
W = tf.get_variable("w", shape=[2,w],dtype= tf.float32)
W2 = tf.get_variable("ww", shape=[w,1], dtype = tf.float32)
layer = tf.matmul(X , W)
logit = tf.matmul(layer , W2)
loss = tf.reduce_mean((y-logit)**2)
optimizer = tf.train.AdamOptimizer(0.005)
solver = optimizer.minimize(loss ,var_list = tf.trainable_variables() )
config=tf.ConfigProto(log_device_placement=True)
config.gpu_options.allow_growth = True
sess = tf.Session(config = config)
sess.run(tf.global_variables_initializer())
for i in range(100) :
_ , loss2 = sess.run([solver , loss], feed_dict={X:data , y : true})
tune.track.log(loss=loss2,done=True)
if __name__ == '__main__':
from ray.tune.schedulers import AsyncHyperBandScheduler
from ray.tune.suggest.hyperopt import HyperOptSearch
from hyperopt import hp
space = {
"node" : hp.randint("node",5,10)
}
algo = HyperOptSearch(
space,
max_concurrent=4,
metric="loss",
mode="min",)
# points_to_evaluate=current_best_params
ray.init()
sched = AsyncHyperBandScheduler(
metric="loss",
mode="min",
max_t=100,
grace_period=2)
analysis = tune.run(
simplemodel,
name="tune",
search_alg= algo,
stop={
"loss": 0.0
},
num_samples=100,
scheduler=sched)
df = analysis.dataframe()
df.sort_values("loss")
analysis.get_best_config(metric="loss")
다행히 돌아갔다 ㅠㅠ 이젠 class를 만들어서 다시 도전해봐야겠다.
끝
'분석 Python > Tensorflow' 카테고리의 다른 글
Shared Weight AutoEncoder 구현해보기 (0) | 2020.02.24 |
---|---|
[ Tensorflow ] AUC 구하기 (0) | 2020.02.21 |
Tensorflow Projector 사용하기 (0) | 2020.01.26 |
[ Python ] tensorflow에서 결측치(na)를 특정값으로 대체하기 (0) | 2020.01.12 |
tf.scan, tf.less , tf.assign , projector, tf.dtypes (0) | 2020.01.05 |