파이썬 손실함수관련 질문드립니다!

파이썬 손실함수관련 질문드립니다!

QA

파이썬 손실함수관련 질문드립니다!

본문

코드

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import numpy as np

x_data = [[10,5,5], [9,5,5], [3,2,4], [2,4,4], [11,1,0]] #공부시간, 출석, 과제
y_data = [[1,0,0], [1,0,0], [0,1,0], [0,1,0], [0,0,1]] 

X=tf.placeholder("float",[None,3]) 
Y=tf.placeholder("float",[None,3])
nb_classes = 3 #number of classes

W=tf.Variable(tf.random_normal([3, nb_classes]), name = 'weight')
b=tf.Variable(tf.random_normal([nb_classes]), name = 'bias')

hypothesis = tf.nn.softmax(tf.matmul(X,W) + b)

cost = tf.reduce_mean(-tf.reduce_sum(Y*tf.log(hypothesis), axis = 1)) #손실함수?
optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.1).minimize(cost)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

for step in range(2001) : 
    sess.run(optimizer, feed_dict = {X:x_data, Y:y_data})
    if step%2000 == 0:
        print(step, sess.run([cost,W,b], feed_dict = {X: x_data, Y:y_data}))
        
hypothesis = tf.nn.softmax(tf.matmul(X,W)+b)
a = sess.run(hypothesis, feed_dict = { X:[[2,4,4]] })
print(a, sess.run(tf.arg_max(a,1)))
print(a)

 

결과

0 [2.634595, array([[ 1.0367887 ,  0.8853377 ,  0.20274803],
       [-0.40716738,  0.42761713,  0.43504232],
       [ 1.1480935 ,  0.17992312,  0.9613083 ]], dtype=float32), array([-2.1311436, -1.3054985, -1.9726181], dtype=float32)]
2000 [0.00208337, array([[ 1.2565181 , -1.0393751 ,  1.9077326 ],
       [ 0.709336  ,  0.66508156, -0.918925  ],
       [ 0.37915584,  2.8458543 , -0.9356891 ]], dtype=float32), array([-2.952815 , -0.519662 , -1.9367809], dtype=float32)]
[[5.358378e-04 9.994642e-01 4.199818e-08]] [1]
[[5.358378e-04 9.994642e-01 4.199818e-08]]

이 상황에서 손실함수 값이 출력되도록 하고싶은데 어떻게 해야할까요..?

이 질문에 댓글 쓰기 :

답변 3

(올려주신 댓글에 대한 답변입니다)

 

제가 수정한대로 스크립트를 실행하면 다음과 같은 결과가 출력됩니다 ^^

 

0 : cost 2.83726167678833
100 : cost 0.03598213940858841
200 : cost 0.019302647560834885
300 : cost 0.013156319037079811
400 : cost 0.009973506443202496
500 : cost 0.008029613643884659
600 : cost 0.006719759665429592
700 : cost 0.005777432583272457
800 : cost 0.005067017395049334
900 : cost 0.004512353800237179
1000 : cost 0.004067255649715662
1100 : cost 0.003702207002788782
1200 : cost 0.003397370455786586
1300 : cost 0.003138987347483635
1400 : cost 0.002917176578193903
1500 : cost 0.002724715508520603
1600 : cost 0.00255610141903162
1700 : cost 0.002407197840511799
1800 : cost 0.0022747423499822617
1900 : cost 0.00215608486905694
2000 : cost 0.0020491897594183683

 

 

원래 작성하신 스크립트에서 % 100 부분만 수정하셨다면,

 

print(step, sess.run([cost,W,b], feed_dict = {X: x_data, Y:y_data}))

 

step, cost, W, b 순으로 출력되기 때문에 step 다음의 첫 번째 값이 비용함수의 값입니다.

 

올려주신 결과값에서는 다음과 같네요 ^^

 

100 : 0.04853232

(중략)

2000 : 0.0020838282

 

결론적으로 이미 비용함수가 출력되도록 올바르게 작성하셨습니다 :)

안녕하세요 하나 더 질문드려도 될까해서 글 남김니다ㅠ
제가 데이터를 많이 넣고 학습을 시키고 싶어서 30개의 데이터를 입력했는데 nan이 계속 뜨고있습니다. learning rate를 조절해도 잘 안되는데 뭐가 문제인지 봐주실수있을까요ㅠ

import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import numpy as np

x_data = [[25,10,3],[29,6,4],[0,1,1],[28,2,0],[12,14,1],[5,13,3],[28,1,4],[20,0,3],[5,2,0],[3,0,1],[2,6,3],[20,2,2],[7,15,4],[27,14,2],[18,8,0],[1,12,3],[21,5,4],[19,12,2],[2,5,3],[17,0,4],[5,5,0],[15,3,3],[25,7,4],[26,3,3],[14,12,1],[0,11,0],[9,13,2],[6,6,3],[17,15,2],[19,13,0]] #공부시간, 출석, 과제
y_data = [[0,1,0],[0,0,1],[0,0,1],[0,0,1],[0,1,0],[0,1,0],[0,0,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1],[0,1,0],[1,0,0],[0,0,1],[0,0,1],[0,0,1],[1,0,0],[0,0,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1],[0,1,0],[0,0,1],[0,1,0],[0,0,1],[1,0,0],[0,1,0]] #학점(A, B, C)

X=tf.placeholder(tf.float32,[None,3])
Y=tf.placeholder(tf.float32,[None,3])
nb_classes = 3

W=tf.Variable(tf.random_normal([3, nb_classes]), name = 'weight')
b=tf.Variable(tf.random_normal([nb_classes]), name = 'bias')

hypothesis = tf.nn.softmax(tf.matmul(X,W) + b)

cost = tf.reduce_mean( - tf.reduce_sum(Y * tf.log(hypothesis) + (1-Y) * tf.log(1-hypothesis)))

optimizer =tf.train.GradientDescentOptimizer(learning_rate=0.001)
train=optimizer.minimize(cost)

#-----------------------------------------------------------------------#

xdata_new=  [[1,11,7],[1,3,4],[1,1,0],[1,1,0]] #공부시간, 출석, 과제

sess = tf.Session()
sess.run(tf.global_variables_initializer())

for step in range(10001):
    _, cost_val=sess.run([train,cost], feed_dict={X:x_data, Y:y_data})
   
    if step %1000==0:
            print(step, cost_val)
    sess.run(hypothesis, feed_dict={X: x_data})
   
    a = sess.run(hypothesis, feed_dict = { X:xdata_new})
print(a, sess.run(tf.arg_max(a,1)))

안녕하세요? ^^

 

제가 tensorflow를 사용한 경험이 많지는 않지만,

 

예측치와 실제치의 차이를 비용(cost)이라고 하는데

 

이미 학습 도중에 2000번에 한 번씩 손실함수값을 출력하도록 작성하셨어요~

 

 

그런데 range(2001)로 설정하셔서 중간 과정을 제대로 볼 수가 없네요 ㅠㅠ

 

100번에 한 번씩 손실함수값만을 출력하도록 스크립트의 일부를 수정하면 다음과 같습니다.

 


for step in range(2001) : 
    sess.run(optimizer, feed_dict = {X: x_data, Y: y_data})
    if step % 100 == 0:
        cost_val = sess.run(cost, feed_dict = {X: x_data, Y:y_data})
        print(f"{step} : cost {cost_val}")

 

작성하신 스크립트의 경우에는 비용함수의 값이 점차 0에 가까워지는데

 

비용함수의 값이 발산하지 않고 0으로 수렴하면 적절한 예측이라고 알고 있습니다.

 

그럼 즐거운 주말 되세요 ^^

 

답변을 작성하시기 전에 로그인 해주세요.
전체 209
QA 내용 검색

회원로그인

(주)에스아이알소프트 / 대표:홍석명 / (06211) 서울특별시 강남구 역삼동 707-34 한신인터밸리24 서관 1404호 / E-Mail: admin@sir.kr
사업자등록번호: 217-81-36347 / 통신판매업신고번호:2014-서울강남-02098호 / 개인정보보호책임자:김민섭(minsup@sir.kr)
© SIRSOFT