반응형

TensorFlow/Keras에서 Sequential 모델을 정의할 때 발생할 수 있는 경고 메시지와 이를 해결하는 방법에 대해 알아볼게요. 특히, keras.Input()을 사용한 올바른 모델 정의 방식과 왜 이를 권장하는지 설명하겠습니다.


1️⃣ 경고 메시지의 원인

아래와 같은 코드를 실행할 때, 경고 메시지가 출력될 수 있습니다:

from tensorflow import keras

# 모델 정의
model = keras.Sequential()
model.add(keras.layers.Conv2D(32, kernel_size=3, activation='relu', padding='same', input_shape=(28, 28, 1)))​

출력되는 경고 메시지

/usr/local/lib/python3.10/dist-packages/keras/src/layers/convolutional/base_conv.py:107: 
UserWarning: Do not pass an input_shape/input_dim argument to a layer. 
When using Sequential models, prefer using an Input(shape) object as the first layer in the model instead.​

이 메시지는 Keras의 최신 버전에서 권장하는 모델 정의 방식과 관련이 있어요.

경고 발생 이유

  1. Sequential 모델에서 첫 번째 레이어에 **input_shape**을 전달하는 방식은 여전히 작동하지만, 이제는 **keras.Input()**을 사용하는 것이 권장됩니다.
  2. 최신 Keras에서는 입력 크기를 명시적으로 정의할 수 있는 Input() 객체를 사용하는 것이 더 명확하고 유지보수에 유리하다고 보고 있어요.

2️⃣ 해결 방법: keras.Input() 사용

경고를 제거하고, Keras에서 권장하는 방식을 따르려면 keras.Input() 객체를 사용하여 입력 크기를 명확히 정의하세요.
수정된 코드는 아래와 같아요:

수정된 코드

from tensorflow import keras

# 모델 정의
model = keras.Sequential([
    keras.Input(shape=(28, 28, 1)),  # 입력 크기 명시
    keras.layers.Conv2D(32, kernel_size=3, activation='relu', padding='same')
])​

수정 코드의 특징

  1. keras.Input(shape=(28, 28, 1)):
    • 모델의 입력 크기를 명시적으로 정의합니다.
    • 이후 레이어는 입력 크기를 자동으로 상속받으므로 첫 번째 레이어에 input_shape를 전달할 필요가 없어요.
  2. 코드가 더 간결해지고 유지보수가 쉬워집니다.

3️⃣ 기존 방식과의 비교

기존 방식

model = keras.Sequential()
model.add(keras.layers.Conv2D(32, kernel_size=3, activation='relu', padding='same', input_shape=(28, 28, 1)))​
  • 여전히 작동하지만 경고 메시지가 출력됩니다.
  • 입력 크기를 레이어에 전달하는 방식으로, 입력 정의가 덜 명확합니다.

수정된 방식

model = keras.Sequential([
    keras.Input(shape=(28, 28, 1)),  # 명시적 입력 정의
    keras.layers.Conv2D(32, kernel_size=3, activation='relu', padding='same')
])​
  • 경고 메시지가 제거됩니다.
  • 입력 크기가 명확히 드러나며, 모델 구조의 가독성이 개선됩니다.

4️⃣ 왜 keras.Input()이 권장될까?

1. 코드의 명확성

  • 입력 크기를 레이어 속성이 아닌 별도의 Input() 객체로 정의하므로,
    모델 구조에서 입력 크기를 명확히 볼 수 있어요.

2. 유지보수성 향상

  • 입력 크기를 모델 정의와 분리해 관리할 수 있으므로,
    입력 크기를 변경하거나 다양한 입력 구조를 사용할 때 유리합니다.

3. 확장성

  • keras.Input()은 다중 입력이나 복잡한 네트워크 구조에서도 유연하게 사용할 수 있어요.
    Sequential 모델뿐만 아니라 Functional API나 Subclassing API에서도 활용됩니다.

5️⃣ 전체 코드 예시

아래는 수정된 방식으로 Sequential 모델을 정의한 전체 코드입니다:

from tensorflow import keras

# 모델 정의
model = keras.Sequential([
    keras.Input(shape=(28, 28, 1)),  # 입력 크기 명시
    keras.layers.Conv2D(32, kernel_size=3, activation='relu', padding='same'),
    keras.layers.MaxPooling2D(pool_size=2),
    keras.layers.Flatten(),
    keras.layers.Dense(10, activation='softmax')
])

# 모델 요약
model.summary()​

model.add()로 은닉층과, 출력층을 추가해도 됩니다.


6️⃣ 경고를 무시하고 기존 방식 사용하기

만약 기존 방식으로 작성하고 경고를 무시하고 싶다면, 아래 코드처럼 작성해도 정상적으로 작동합니다.

코드

model = keras.Sequential()
model.add(keras.layers.Conv2D(32, kernel_size=3, activation='relu', padding='same', input_shape=(28, 28, 1)))​

⚠️ 하지만 이는 경고 메시지가 출력되며, 장기적으로는 권장되지 않는 방식입니다.


결론

  • Keras의 최신 방식에서는 Sequential 모델을 정의할 때 keras.Input()을 사용하는 것이 권장됩니다.
  • 이를 통해 경고 메시지를 제거할 뿐만 아니라, 코드의 가독성과 유지보수성을 높일 수 있어요.
  • 특히 복잡한 모델을 다룰 때 유용하며, 모델 정의의 확장성도 개선됩니다.

해시태그
#Keras #딥러닝 #TensorFlow #Sequential모델 #Input #모델정의 #코딩팁 #머신러닝

728x90
반응형

+ Recent posts