파이썬 손실함수관련 질문드립니다! 채택완료
코드
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
결론적으로 이미 비용함수가 출력되도록 올바르게 작성하셨습니다 :)
답변에 대한 댓글 3개
제가 데이터를 많이 넣고 학습을 시키고 싶어서 30개의 데이터를 입력했는데 nan이 계속 뜨고있습니다. learning rate를 조절해도 잘 안되는데 뭐가 문제인지 봐주실수있을까요ㅠ
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번에 한 번씩 손실함수값만을 출력하도록 스크립트의 일부를 수정하면 다음과 같습니다.
</p>
<p>for step in range(2001) : </p>
<p> sess.run(optimizer, feed_dict = {X: x_data, Y: y_data})</p>
<p> if step % 100 == 0:</p>
<p> cost_val = sess.run(cost, feed_dict = {X: x_data, Y:y_data})</p>
<p> print(f"{step} : cost {cost_val}")</p>
<p>
작성하신 스크립트의 경우에는 비용함수의 값이 점차 0에 가까워지는데
비용함수의 값이 발산하지 않고 0으로 수렴하면 적절한 예측이라고 알고 있습니다.
그럼 즐거운 주말 되세요 ^^
댓글을 작성하려면 로그인이 필요합니다.
답변을 작성하려면 로그인이 필요합니다.
로그인