반응형



1. Linear Regression 

++ single attribute . 

H(x) = x*W + b
cost(W,b) = 1/m * 오차제곱의 합  =   오차제곱의 평균. (편차제곱의 평균은 분산이다.)
   = 1/m * Sigma(  (H(x)-y)^2  )                    # cost함수를 여기에다가 1/2을 곱하여 사용하기도 한다. 그 때의 미분결과는 아래에 2*가 없어진다.
dJ/dW = 2* (1/m) * Sigma(  (H(x)-y) x )
#train
W := W - alpha* dJ/dW

x_train=[1,2,3]
y_train=[1,2,3]

W=tf.Variable(tf.random_normal([1]), name='weight')
b = tf.Variable(tf.random_normal([1]), name="bias')
hypothesis = x_train * W + b

cost = tf.reduce_mean(  tf.square(hypothesis - y_train) )

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

sess = tf.Session()
sess.run( tf.global_variables_initializer())
for step in range(2001):
     sess.run(train)
     if step%100==0:
          print(step, sess.run(cost), sess.run(W), sess.run(b) )

+ 예측 
print ( sess.run( hypothesis , {X:[100]} ) )



반응형




-학습데이터 저장 및 복구

: 저장
변수들 선언. (tf.Variables....) 주의! 이름을 지정.
W1 = tf.Variable( tf.truncated_normal(shape=[INPUTSIZE, HIEEDNSIZE]), dtype=tf.float32, name='W1')
저장할 변수들 지정

param_list={ 'W1':W1, 'b1':b1, 'W2':W2, 'b2':b2}
saver = tf.train.Saver( param_list )
...
saver.save(sess, './savedata.ckpt', write_meta_graph=False)     #디렉터리 명시

: 로딩
변수들 선언. (tf.Variables....) 주의! 이름을 지정. (저장시 사용했던 variables 그대로 복사)
saver 초기화도 동일
param_list={ 'W1':W1, 'b1':b1, 'W2':W2, 'b2':b2}
saver = tf.train.Saver( param_list )
...
sess=tf.Session()
saver.restore(sess, './savedata.ckpt')
로딩 완료. W1, b1, ... 변수들 사용 가능.



반응형


+ 자료 처리 및 많이 사용하는 함수들...

-Shape, Rank, Axis
t=tf.constant(  [1,2,3,4])
tf.shape(t).eval()
     tensor의 shape과 타입을 알수 있다.   Rank는 처음에 [의 개수로 볼 수 있음.
     array ( [4],  dtype=int32 )

t=tf.constant(  [[1,2],  [3,4] ])
tf.shape(t).eval()
     array ( [2,2],  dtype=int32 )

     축에도 번호를 매길수 있는데, 가장큰 범위부터 0으로 매김.
     2차원배열의 경우 0은 행방향, 1은 열 방향.

-Matrix 곱

tf.matmul( matrix1, matrix2)          ; Matrix 곱; 내적
matrix1*matrix2     ; 성분곱.
 ( *과 matmul은 다름. 주의!)

;Broadcasting  알아서 형을 변환하여 연산해 줌. (편하지만 주의할 필요가 있음)



-reduce_sum( input_tensor, axis=None)

axis가 없으면 총합. 축은 큰 범위에서부터 인덱스가 0임.

입력이 1차원이면 축은 의미없음. axis=0이 됨.
입력이 2차원이면
axis=0 세로방향으로 합.  (테이블 input이 있으면, 아래에 답을 쓴 것)
axis=1 가로방향으로 합. (테이블 input에서 오른쪽에 답을 단 것)
axis=-1 이면 가장 마지막 축. 2차원에서는 1이됨. 3차원에서는 2가 됨.
axis가 없으면 성분들 총합.


-reduce_mean( tensor, axis )
평균
tf.reduce_mean(x, axis=0)

-argmax  ; 최대값의 인덱스
tf.argmax(x, axis=1)

-reshape ; 텐서 재구성
t=np.array( [[[0,1,2], [3,4,5]],    [[6,7,8],[9,10,11]] ] )
tf.reshape(t, shape=[-1,3])  ; -1은 알아서 다른 성분크기에 맞게 자동조정.
[[0,1,2], [3,4,5], [6,7,8], [9,10,11]]

비슷한 함수. squeeze, expand

-onehot encoding
t=tf.one_hot(  [[0], [1], [2], [0]],  depth=3)
[ [[1, 0, 0]] , [[0,1,0]], [[0,0,1]], [[1,0,0]] ]          #주의 rank가 올라감!!!
원래의 차수로 내리려면
tf.reshape ( t, [-1, 3] )
[ [1,0,0], [0,1,0], [0,0,1], [1,0,0] ]


-타입 캐스팅
tf.cast( [1.8, 2.2], tf.int32)
tf.cast(  [True, False, 1==1, 1==0], tf.int32 )
     [1, 0, 1, 0]

-스택
x=[1,2], y=[3,4], z=[5,6]
np.stack( [x,y,z] )
          =>   [[1,2], [3,4], [5,6]]
np.stack( [x,y,z], axis=1)
          =>  [[1, 3, 5], [2,4,6]]

-ones and zeros like
tf.ones_like(x).eval()          # .eval()은 값과 타입을 출력해준다.
x의 shape과 같은데 값을 모두 1로 채움.
tf.zeros_like(x)

-Zip ; 묶어준다.
for x, y, z in zip( [1,2,3], [4,5,6], [7,8,9] ):
     print (x, y, z)   
1 4 7 
2 5 8
3 6 9
zip을 하지 않고 출력하면?
for x, y, z in ( [1,2,3], [4,5,6], [7,8,9] ):          # 또는 [[1,2,3],[4,5,6],[7,8,9]]
     print (x, y, z)   
1 2 3
4 5 6
7 8 9



+ Recent posts