작성
·
256
0
안녕하세요 강사님! 강의 매우 잘듣고 있는 학생입니다.
제가 텐서플로우에 다른 스타일로 모델을 구현하는 법이 있길래 본 강의에서 초반에 regression하는 부분을 작성해보앗습니다.
이렇게 작성하였는데 예측을 해보면 예측 값 정확도가 매우 떨어집니다.
제가 보기에는 두 모델 코드를 작성한 스타일만 다르고 모두 같다고 생각되는데 왜 예측값이 많이 다른지 모르겠습니다..
혹시 이부분이 왜 그런지 알 수 있을까요..??
답변 1
0
음, 이유는 잘 모르겠지만, loss가 epoch 3000번 이상이 될 때까지, 잘 안줄어 드는 군요.
아래는 코드입니다.
optimizer = tf.optimizers.Adam(0.01)
def mse_loss(y_pred, y):
return tf.reduce_mean(tf.square(y_pred-y))
def train_step(model, x, y):
with tf.GradientTape() as tape:
y_pred = model(x)
loss = mse_loss(y_pred, y)
tf.print("loss:", loss)
#GD가 계산되는 시점, model.trainable_variable은 자동으로 갱신이 요구되는 변수값을 할당해줌.
gradients = tape.gradient(loss, model.trainable_variables)
#Optimizer를 통해서 갱신이 이루어지는 시점
optimizer.apply_gradients(zip(gradients,model.trainable_variables))
Regression_model = Regression()
for i in range(4000):
print('epoch:', i)
train_step(Regression_model, scaled_features.astype("float32"),bostonDF["PRICE"].values.astype("float32") )
print("end")
GradientTape을 적용하지 않으면 성능이 나아집니다. 왜 GradientTape시 성능이 떨어지는지 이유를 좀 더 찾아 봐야 할 것 같습니다.
model = Regression()
# Adam optimizer를 이용하고 Loss 함수는 Mean Squared Error, 성능 측정 역시 MSE를 이용하여 학습 수행.
model.compile(optimizer=Adam(learning_rate=0.01), loss='mse', metrics=['mse'])
model.fit(scaled_features, bostonDF['PRICE'].values, epochs=1000)
이렇게 하였습니다!
#데이터 받기
from sklearn.datasets import load_boston
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
boston = load_boston()
bostonDF = pd.DataFrame(boston.data, columns=boston.feature_names)
bostonDF['PRICE'] = boston.target
scaler = MinMaxScaler()
scaled_features = scaler.fit_transform(bostonDF[['RM', 'LSTAT']])
#모델 구조 구현
class Regression(tf.keras.Model):
def __init__(self):
super(Regression, self).__init__()
self.regression_layer = tf.keras.layers.Dense(1,
activation = None,
#W값
kernel_initializer = "zeros",
#B값
bias_initializer="zeros")
def call(self, x):
#인자를 넣어서 softmax_layer연산 수행
logits = self.regression_layer(x)
#Dense를 지난 결과에 softmax 씌워서 반환
return logits
#손실함수 정의
@tf.function
def mse_loss(y_pred, y):
return tf.reduce_mean(tf.square(y_pred-y))
#Optimizer
optimizer = tf.optimizers.Adam(0.01)
#GD정의
@tf.function
def train_step(model, x, y):
with tf.GradientTape() as tape:
y_pred = model(x)
loss = mse_loss(y_pred, y)
#GD가 계산되는 시점, model.trainable_variable은 자동으로 갱신이 요구되는 변수값을 할당해줌.
gradients = tape.gradient(loss, model.trainable_variables)
#Optimizer를 통해서 갱신이 이루어지는 시점
optimizer.apply_gradients(zip(gradients,model.trainable_variables))
#학습 시행
Regression_model = Regression()
for i in range(1000):
train_step(Regression_model, scaled_features.astype("float32"),bostonDF["PRICE"].values.astype("float32") )
print("end")
#첫번째 price 예측
predicted = Regression_model.predict(scaled_features)
predicted[0]
감사드립니다!