인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

seook6853님의 프로필 이미지
seook6853

작성한 질문수

딥러닝 CNN 완벽 가이드 - Fundamental 편

모델 구현 질문

작성

·

256

0

안녕하세요 강사님! 강의 매우 잘듣고 있는 학생입니다.

제가 텐서플로우에 다른 스타일로 모델을 구현하는 법이 있길래 본 강의에서 초반에 regression하는 부분을 작성해보앗습니다.

이렇게 작성하였는데 예측을 해보면 예측 값 정확도가 매우 떨어집니다.

 

제가 보기에는 두 모델 코드를 작성한 스타일만 다르고 모두 같다고 생각되는데 왜 예측값이 많이 다른지 모르겠습니다..

혹시 이부분이 왜 그런지 알 수 있을까요..??

 

답변 1

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까, 

전체 소스코드를 텍스트로 올려 주시겠습니까, 제가 수행해 보고 말씀드리겠습니다. 

감사합니다. 

seook6853님의 프로필 이미지
seook6853
질문자

이렇게 하였습니다!

#데이터 받기

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]

 

 

감사드립니다!

권 철민님의 프로필 이미지
권 철민
지식공유자

음, 이유는 잘 모르겠지만, 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)

seook6853님의 프로필 이미지
seook6853

작성한 질문수

질문하기