👩‍💻LEARN : ML&Data/Lecture

[Advanced Learning Algorithms] #2. TensorFlow implementation & #3. Neural network implementation in Python

쟈니유 2023. 3. 27. 16:09
728x90

텐서플로우 ㅎ 잘 알지 ㅎ 라고 생각했지만 이번엔 또 얼마나 머리가 아플까 ^^...


#2. TensorFlow implementation

Inference in Code 

  • Forward propagation을 한다면 간단하게 아래와 같은 플로우로 진행된다 
#x를 먼저 세팅해준다. 200도에 17분 로스팅 하면 어떤 결과가 나올까

x = np.array([[200.0, 17.0]])

#레이어를 세팅해준다. 이 레이어는 3개의 뉴런유닛을 갖고 있으며 활성함수로는 시그모이드를 쓴다.(나중엔 relu쓰겠지..?)

layer_1 = Dense(3, activation = 'sigmoid')

#레이어1에서 나온 활성함수값을 a1에 할당한다 

a1 = layer_1(x)

#레이어2를 세팅한다. output레이어는 binary로 나오므로 유닛을 1로 설정한다 

layer_2 = Dense(1,activation='sigmoid')

#직전 레이어에서 인입된 a1을 x값으로 넣어준다 

a2 = layer_2(a1)

# a2 값에 따른 1,0 여부를 설정해준다 

if a2>= 0.5 : yhat=1

else : yhat=0

 

Data in TensorFlow

참고. numpy에서 행렬 나타내는 방식

  • np.array ( [행렬] )
  • 1*n매트릭스여도 [[]] 해줘야함 . np.array([[200,17]]) 로 해줘야 (1*2행렬) 
  • np.array([200,17]) → 1D array 가 반환됨 (1*1 벡터)  
  • 텐서는 행렬 형태로 인풋/아웃풋 나와야 함 
    • 만약 tensor를 통해 tf.Tensor([[행렬어쩌구]]) 가 나온것을 넘파이로 변경하고 싶으면 a1.numpy() 로 변경 

 

 

Building a neural network 

  • 모델 설정해주기 
  • 모델 컴파일 설정하기
  • 모델에 데이터 넣어서 학습시키기
  • 해당 모델에 실 데이터값 넣어서 결과 보기 

 

 

 

 

 

#데이터normalize하기 

#1.create a "Normalization Layer". Note, as applied here, this is not a layer in your model.
#2.'adapt' the data. This learns the mean and variance of the data set and saves the values internally.
#3. normalize the data.  

norm_l = tf.keras.layers.Normalization(axis=-1)
norm_l.adapt(X)  # learns mean, variance
Xn = norm_l(X)

#4. Tile/copy our data to increase the training set size and reduce the number of training epochs.

Xt = np.tile(Xn,(1000,1)) #Xn이 세팅한 shape 형태로 반복되어 쌓인 형태가 됨 
Yt= np.tile(Y,(1000,1))   
#result: Xn = (200,2)였으므로, 200개가 1000번만큼 아래로 쌓였다고 보면 됨 

#모델 
tf.random.set_seed(1234)  # applied to achieve consistent results
model = Sequential(
    [
        tf.keras.Input(shape=(2,)),
        Dense(3, activation='sigmoid', name = 'layer1'),
        Dense(1, activation='sigmoid', name = 'layer2')
     ]
)

#만약 파라미터들을 확인하고 싶다면 
W1, b1 = model.get_layer("layer1").get_weights()
W2, b2 = model.get_layer("layer2").get_weights()
print(f"W1{W1.shape}:\n", W1, f"\nb1{b1.shape}:", b1)
print(f"W2{W2.shape}:\n", W2, f"\nb2{b2.shape}:", b2)

#컴파일링과 피팅 
model.compile(
    loss = tf.keras.losses.BinaryCrossentropy(),
    optimizer = tf.keras.optimizers.Adam(learning_rate=0.01),
)

model.fit(
    Xt,Yt,            
    epochs=10,
)

#업데이트된 파라미터가 궁금하다면 
W1, b1 = model.get_layer("layer1").get_weights()
W2, b2 = model.get_layer("layer2").get_weights()
print("W1:\n", W1, "\nb1:", b1)
print("W2:\n", W2, "\nb2:", b2)

#결과값 도출
yhat = np.zeros_like(predictions)
for i in range(len(predictions)):
    if predictions[i] >= 0.5:
        yhat[i] = 1
    else:
        yhat[i] = 0

 


#3. Neural network implementation in Python

 

 

Forward prop in a single layer 

텐서에서 자동으로 한 레이어에서 계산해 주는 것을 파이썬으로 풀어보면 아래와 같음 

  • 각 뉴런유닛마다 파라미터를 계산해서 유닛별 activation결과값을 도출한다. 
  • 해당 activation vector를 다음 layer에 전달하고, 다음 layer의 파라미터값과 연산한다 
  • 마지막 레이어는 final activation vector를 받아 결과값을 도출한다.  

 

General Implementation of forward propagation 

 

※ 참고 

행렬에서 [: , N] 을 하면 

- :  → 모든 행을 가져와라 

- N → 특정 열을 가져와라 

가 되어서 특정 열에 해당하는 모든 행을 가져오게 됨