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 → 특정 열을 가져와라
가 되어서 특정 열에 해당하는 모든 행을 가져오게 됨