프로젝트를 하면서 텐서보드를 사용할 일이 있었는데 구글에는 온통 케라스를 이용한 텐서보드밖에 없었다.
내가 필요한건 케라스가 아니라 텐서플로우로 구현한 Lasso와 Ridge였다. 직접해보고 적는 코랩으로 텐서플로우만을 이용한 텐서보드 사용하기
tensorflow session을 이용해서 tensorboard를 사용하려면 4가지만 기억하자
1. 초기화(tf.reset_default_graph())
2. 텐서보드에서 볼 변수들을 정한다. A_summary = tf.summary.scalar(name, 변수)
3. 묶어준다.
4. 학습을 진행하면서 기록해준다.
merge = tf.
import tensorflow.compat.v1 as tf
from tensorflow.python.framework import ops
def regulRegresor(y, X, RegType, Rconst,Lconst):
tf.reset_default_graph()
regression_type = RegType # LASSO, Ridge
num_cols = X.shape[1]
x_data = tf.placeholder(shape=[None, num_cols], dtype=tf.float32, name="Input")
y_target = tf.placeholder(shape=[None,1],dtype=tf.float32, name='Output')
A = tf.Variable(tf.random_normal(shape=[num_cols,1]),name='Weight') # Weight Vector
b = tf.Variable(tf.random_normal(shape=[1, 1]), name='Bias') # bias Vector
with tf.Session() as sess:
writer = tf.summary.FileWriter(f'./log1/L{Lconst}', sess.graph)
fomula = tf.add(tf.matmul(x_data,A), b, name ='predVal')
if regression_type == 'LASSO':
lasso_params = tf.constant(Lconst, dtype=tf.float32) # limit slope
heavyside_step = tf.truediv(1., tf.add(tf.exp(tf.multiply(tf.subtract(A, lasso_params), -50)), 1))
regularization = tf.multiply(99., heavyside_step)
loss = tf.add(tf.reduce_mean(tf.square(y_target-fomula)), regularization)
print(loss.shape)
Laso = tf.summary.scalar('lasso_params', lasso_params)
elif regression_type == 'Ridge':
ridge_params = tf.constant(Rconst, dtype=tf.float32)
ridge_loss = tf.reduce_mean(tf.square(A))
loss = tf.expand_dims(tf.add(tf.reduce_mean(tf.square(y_target-fomula)), tf.multiply(ridge_params, ridge_loss)), 0)
RidParm=tf.summary.scalar('ridge_params', ridge_params)
loss_summary = tf.summary.scalar('loss', loss[0])
opt = tf.train.GradientDescentOptimizer(learning_rate=0.00000001)
train_step = opt.minimize(loss) #optimizer를 이용해 loss값을 최소화 시키는 A, b를 찾는다.
saver = tf.train.Saver()
init = tf.global_variables_initializer()
init.run()
loss_vec = []
preloss =0
global_num =0
merge = tf.summary.merge([loss_summary,Laso])
for i in range(1000):
rnd_idx = np.random.choice(len(X), size = 250000)
rnd_x = X.iloc[rnd_idx].values.reshape(-1,num_cols)
rnd_y = y_return.iloc[rnd_idx].values.reshape(-1,1)
print(rnd_y.shape)
my_dict = {x_data:rnd_x, y_target:rnd_y}
sess.run(train_step, feed_dict=my_dict)
temp_loss = sess.run(loss, feed_dict=my_dict)
loss_vec.append(temp_loss[0])
if abs(preloss - temp_loss[0]) <= 0.001:break
else:preloss = temp_loss[0]
summary = sess.run(merge,feed_dict={y_target : rnd_y, x_data:rnd_x, A:A.eval(), b: b.eval()})
writer.add_summary(summary, global_num)
global_num +=1
if i % 10 == 0:
print('step={}: A={}, b={}, Loss={}'.format(i+1, A.eval().reshape(1,num_cols), b.eval(), temp_loss))
saver.save(sess, f'./model_L{Lconst}.ckpt')
slope = A.eval()
cept = b.eval()
sess.close()
return slope, cept, loss_vec
'Data Analysis and ML, DL > Tensorflow' 카테고리의 다른 글
[Tensorflow] 가중치 값이 NaN값으로 표시 될 때 (0) | 2020.11.22 |
---|---|
[sklearn] 사이킷런으로 대용량 데이터 분석하기 (0) | 2020.11.20 |
Colab에서 Tensorboard 실행 (0) | 2020.11.15 |
Tensorflow로 구현한 Lasso, Ridge (0) | 2020.11.12 |
Tensorflow 가중치 발산 문제 (0) | 2020.11.12 |