파이썬 손실함수관련 질문드립니다!
본문
코드
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
결론적으로 이미 비용함수가 출력되도록 올바르게 작성하셨습니다 :)
윽 이렇게 봐선 답변드리기 어렵네요 ㅠ
안녕하세요? ^^
제가 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으로 수렴하면 적절한 예측이라고 알고 있습니다.
그럼 즐거운 주말 되세요 ^^
!-->