import numpy as np
import tensorflow as tf
from tensorflow import keras
from keras import layers
import matplotlib.pyplot as plt
x = np.array(range(1,7))
y = np.array([10,98,8,2,3,4])
input_layer = layers.InputLayer(input_shape=(1,)) # 가장 상단으로 입력되는 독립변수의 개수(독립변수, 특징값 개수)
output_layer = layers.Dense(units=1) # 출력값은 하나인 이항분류 | activation이 없으면 wx+b(선형회귀)로 동작
# input과 output layer는 최소필요조건
# tf.random.set_seed(1)
model = keras.Sequential([ # 순차처리구조
    input_layer,
    output_layer
])

히든레이어의 유닛을 4로 설정한다면, 각각의 w,b 쌍이 4개(총 파라미터8개)로 각각 계산된 y값이 나오게 되는데,

이 각각의 y값 4개를 독립변수로 치환하여 다음 레이어에서 하나의 b와 4개의 w로 다시 계산하게 된다.

model.summary()
Model: "sequential_14"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_30 (Dense)            (None, 1)                 2         
                                                                 
=================================================================
Total params: 2
Trainable params: 2
Non-trainable params: 0
_________________________________________________________________
model.get_weights()
[array([[-0.8584039]], dtype=float32), array([0.], dtype=float32)]

첫번쨰는 w, 두번째는 b

model.compile(loss='mse', metrics='acc')    # 예측값과 실제 y값과 비교하는 공식(loss_function|오차함수) | model.filt 할 때 화면에 출력될 사항 선택(metrics)
# model.fit할 때 오차역전파하는 방법론(최적화함수|optimizer)
history = model.fit(x,y, epochs=10, verbose=0) # epochs 옵션 사용 가능 | 변수로 저장하면 history()가 사용 가능한데, 에폭을 돌면서 나온 loss와 acc값들이 list로 들어있다.
plt.figure(figsize=(10,3))
plt.subplot(1,2,1)
plt.plot(history.history['loss'],label='loss')
plt.title('loss')

plt.subplot(1,2,2)
plt.plot(history.history['acc'], 'r',label='acc')
plt.title('acc')
#plt.legend(loc='lower right')
Text(0.5, 1.0, 'acc')

model.predict(x) # 예측값
array([[-0.8237646],
       [-1.6648521],
       [-2.5059395],
       [-3.347027 ],
       [-4.1881146],
       [-5.029202 ]], dtype=float32)
model.get_weights()
[array([[-0.8410875]], dtype=float32), array([0.01732292], dtype=float32)]

머신러닝은 공식을 주어주기 떄문에 w,b가 몇번을 돌려도 고정되어 있지만 딥러닝은 w가 랜덤으로 생성되기 때문에 매번 예측값이 바뀌게 된다.

이는 초기에 어떤 w를 받느냐에 따라 성공률이 달라질 수 있다. => 정답이 없다.

초기 w를 고정하고 싶다면 model잡기 전에 seednumber randomseed 옵션을 사용할 수 있다.
input_layer = layers.InputLayer(input_shape=(1,))
output_layer = layers.Dense(units=1)
h_layer1 = layers.Dense(units=4, activation='relu') # 히든레이어
h_layer2 = layers.Dense(units=2, activation='relu') # 히든레이어2
model = keras.Sequential([
    input_layer,
    h_layer1,
    h_layer2,
    output_layer
])
model.compile(loss='mse', metrics='acc')
print(model.fit(x,y))
1/1 [==============================] - 0s 410ms/step - loss: 1650.3927 - acc: 0.0000e+00
<keras.callbacks.History object at 0x000001499BBC66D0>
model.summary()
Model: "sequential_15"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense_32 (Dense)            (None, 4)                 8         
                                                                 
 dense_33 (Dense)            (None, 2)                 10        
                                                                 
 dense_31 (Dense)            (None, 1)                 3         
                                                                 
=================================================================
Total params: 21
Trainable params: 21
Non-trainable params: 0
_________________________________________________________________

순서대로 히든레이어1 히든레이어2 아웃풋을 의미한다.

0번 레이어(inputlayer와 hlayer1)는 inputlayer에서 inputshape가 1개여서 w,b를 1개씩 갖으므로 유닛 하나당 2개의 파라미터가 필요하다.

만약 inputshape가 8개였다면 8개의 w와 1개의 b를 가졌을 것이다. 그렇다면 $(8+1)*4$개의 파라미터를 가졌을 것.

렐루함수 처리된 0번레이어의 유닛(w,b쌍)갯수가 1번레이어의 input이 된다. (여기선 1번레이어의 독립변수가 4개라는 뜻)

1번 레이어는 출력유닛이 2개로 설정되어 있다. 유닛 1개당 독립변수4개의 w값과 하나의 b를 필요로하므로 5개의 파라미터가 필요하다.

$w1x1+w2x2+w3x3+w4x4+b$를 수행하는 중간값을 2개 생성하는 것이다.

2번 레이어는 유닛갯수가 1이고 하나당 w 2개와 b 1개가 필요하다. activation이 없으므로 $wx+b$를 수행한다.

model.get_weights()
[array([[-0.3878749 , -0.6135069 ,  0.87405694,  0.09965609]],
       dtype=float32),
 array([ 0.        ,  0.        , -0.00316228, -0.00316228], dtype=float32),
 array([[-0.01561165,  0.8366902 ],
        [ 0.00601244,  0.6017356 ],
        [ 0.1309055 , -0.6168997 ],
        [ 0.4636773 ,  0.1700325 ]], dtype=float32),
 array([-0.00316228,  0.        ], dtype=float32),
 array([[-1.1113869],
        [ 0.5639157]], dtype=float32),
 array([0.00316228], dtype=float32)]
  • 0,1번 array : 0번레이어의 w와 b 각각의 쌍

  • 2,3번 array : 0번레이어의 유닛(로우,4개)들로 이루어져 있고, 1번레이어의 유닛이 2개이므로 2개의 열을 가지며 하나의 열당 w1~4 값들을 갖고있다고 볼 수 있다.

    • 즉 5개의 파라미터로 이루어진 2개의 열
  • 4,5번 array : 2번레이어의 파라미터들

print(model.predict(x))
WARNING:tensorflow:5 out of the last 5 calls to <function Model.make_predict_function..predict_function at 0x0000014992C68700> triggered tf.function retracing. Tracing is expensive and the excessive number of tracings could be due to (1) creating @tf.function repeatedly in a loop, (2) passing tensors with different shapes, (3) passing Python objects instead of tensors. For (1), please define your @tf.function outside of the loop. For (2), @tf.function has experimental_relax_shapes=True option that relaxes argument shapes that can avoid unnecessary retracing. For (3), please refer to https://www.tensorflow.org/guide/function#controlling_retracing and https://www.tensorflow.org/api_docs/python/tf/function for  more details.
[[-0.1697524 ]
 [-0.34827134]
 [-0.5267902 ]
 [-0.70530903]
 [-0.8838279 ]
 [-1.0623468 ]]
</pre>

```python
print(model.evaluate(x,y))
```

1/1 [==============================] - 0s 62ms/step - loss: 1649.4238 - acc: 0.0000e+00
[1649.423828125, 0.0]
```python intermediate_layer_model = tf.keras.Model(inputs=model.input, outputs=model.layers[0].output) intermedate_output = intermediate_layer_model(x) intermedate_output ```
<tf.Tensor: shape=(6, 4), dtype=float32, numpy=
array([[0.        , 0.        , 0.8708947 , 0.09649381],
       [0.        , 0.        , 1.7449516 , 0.1961499 ],
       [0.        , 0.        , 2.6190085 , 0.295806  ],
       [0.        , 0.        , 3.4930654 , 0.3954621 ],
       [0.        , 0.        , 4.367122  , 0.4951182 ],
       [0.        , 0.        , 5.2411795 , 0.59477425]], dtype=float32)>

댓글남기기