epoch 1부터 loss가 너무 낮게 나와 학습이 안되네요

23.08.17 13:33 작성 조회수 133

0


ratio = 0.2
x_train = tf.random.normal(shape = (300,), dtype = tf.float32)
y_train = 3 * x_train + 1 + ratio * tf.random.normal(shape = (300, ), dtype = tf.float32)

x_test = tf.random.normal(shape = (30,), dtype = tf.float32)
y_test = 3 * x_test + 1 + ratio * tf.random.normal(shape = (30, ), dtype = tf.float32)

class LinearPredictor(Model):
    def __init__(self):
        super(LinearPredictor, self).__init__()

        self.d1 = Dense(1, activation = "linear")

    def call(self, x):
        x = self.d1(x)
        return x

model = LinearPredictor()

loss_object = tf.keras.losses.MeanSquaredError()
optimizer = SGD(learning_rate=0.01)

for epoch in range(5):
    for x, y in zip(x_train, y_train):
        x = tf.reshape(x, (1, 1))
        with tf.GradientTape() as tape:
            predictions = model(x)
            loss = loss_object(y, predictions)
        gradients = tape.gradient(loss, model.trainable_variables)
        optimizer.apply_gradients(zip(gradients, model.trainable_variables))
    print(f"Epoch: {epoch + 1}")
    print(f"Train Loss: {loss:.4f}")
    

 

강사님이랑 똑같이 코드를 짠것 같은데 train loss가 너무 낮게 나와 학습이 안되네요. 틀린곳이 있는건지 데이터가 너무 심플하게 생성되서 그런건지 잘 모르겠습니다.

 

답변 1

답변을 작성해보세요.

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.08.18

안녕하세요, 인프런 AI 인턴이에요.

먼저 코드를 확인해보면, 생성된 데이터(x_train, y_train)가 비교적 간단한 형태인 것 같습니다. 입력 데이터인 x_train은 무작위로 생성된 정규 분포를 따르는 값이고, 이를 기반으로 y_train은 일정한 기울기와 절편을 가진 선형 모델에 노이즈(ratio * tf.random.normal)를 추가한 값으로 생성되어 있습니다.

만약 데이터가 너무 심플하다면, 학습이 제대로 이루어지지 않을 수 있습니다. 모델이 학습할 패턴이 부족하여 일정 수준 이상의 정확도를 달성할 수 없습니다.

또한, 학습 횟수인 epoch도 5로 상대적으로 낮게 설정되어 있습니다. 실제로 학습 횟수(epoch)를 늘릴수록 모델의 성능이 향상될 가능성이 있습니다. epoch를 5에서 10, 20 등 더 큰 수로 늘려보고 결과를 확인해보는 것을 추천드립니다.

데이터의 복잡도를 높이거나, 학습 횟수를 늘려본 후에도 문제가 지속된다면 다른 요인들(예: 학습률, 다른 optimizer 등)을 조정하여 성능을 향상시킬 수 있습니다.
성능 향상에는 여러 가지 요인이 작용할 수 있으므로, 여러 가지 시도를 통해 최적의 결과를 찾아보시기 바랍니다.

더 도움이 필요하시다면 언제든지 질문해주세요.

임해빈님의 프로필

임해빈

질문자

2023.08.21

혹시 다른 코드 이상은 없나요?