[파이썬] Keras 이미지와 텍스트의 멀티모달 학습

멀티모달 학습은 이미지와 텍스트와 같은 다양한 형태의 데이터를 동시에 사용하여 모델을 학습하는 기술입니다. 이는 실제 세계의 복잡한 데이터를 모델에 적용할 수 있도록 도와줍니다. Keras는 멀티모달 학습을 위한 다양한 기능을 제공하며, 이미지와 텍스트 데이터를 함께 처리하기 위한 강력한 도구입니다.

멀티모달 학습을 위한 데이터 준비

멀티모달 학습을 위해서는 이미지 데이터와 텍스트 데이터를 모두 포함하는 데이터셋을 사용해야 합니다. 예를 들어, 이미지 데이터는 이미지 파일의 경로로 구성된 리스트로 표현할 수 있고, 텍스트 데이터는 문자열로 표현할 수 있습니다. 이러한 데이터를 적절히 정리하여 모델에 입력으로 제공해야 합니다.

import numpy as np
from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences
from keras.preprocessing.image import load_img, img_to_array

# 이미지 데이터 로드
image_paths = [...]  # 이미지 파일 경로 리스트
images = []
for path in image_paths:
    image = load_img(path, target_size=(224, 224))
    image = img_to_array(image)
    images.append(image)
images = np.array(images)

# 텍스트 데이터 로드
texts = [...]  # 텍스트 데이터 리스트
tokenizer = Tokenizer()
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
word_index = tokenizer.word_index
max_sequence_length = max([len(seq) for seq in sequences])
texts = pad_sequences(sequences, maxlen=max_sequence_length)

# 데이터셋 준비
X_image = images
X_text = texts
y = [...]  # 레이블 데이터

위 코드는 이미지 데이터와 텍스트 데이터를 로드하고, 텍스트 데이터에 대해 토큰화 및 패딩을 수행하여 모델에 입력 가능한 형식으로 변환하는 예시입니다.

멀티모달 학습 모델 정의

멀티모달 학습을 위한 모델은 이미지와 텍스트 데이터의 특징을 모두 고려하여 예측을 수행해야 합니다. Keras는 멀티모달 학습 모델을 쉽게 구성할 수 있는 함수형 API를 제공합니다.

from keras.models import Model
from keras.layers import Input, Dense, Conv2D, MaxPooling2D, Flatten, Embedding, LSTM, concatenate

# 이미지 입력 레이어 정의
input_image = Input(shape=(224, 224, 3))
conv1 = Conv2D(32, (3, 3), activation='relu')(input_image)
pool1 = MaxPooling2D(2, 2)(conv1)
conv2 = Conv2D(64, (3, 3), activation='relu')(pool1)
pool2 = MaxPooling2D(2, 2)(conv2)
flatten = Flatten()(pool2)

# 텍스트 입력 레이어 정의
input_text = Input(shape=(max_sequence_length,))
embedding = Embedding(len(word_index) + 1, 100, input_length=max_sequence_length)(input_text)
lstm = LSTM(256)(embedding)

# 이미지와 텍스트를 결합한 피처 레이어 정의
concat = concatenate([flatten, lstm])

# 출력 레이어 정의
output = Dense(1, activation='sigmoid')(concat)

# 모델 정의
model = Model(inputs=[input_image, input_text], outputs=output)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

위의 코드는 Convolutional Neural Network (CNN)을 사용하여 이미지 데이터를 처리하고, Long Short-Term Memory (LSTM)을 사용하여 텍스트 데이터를 처리하는 멀티모달 모델의 예시입니다. 이미지와 텍스트 데이터를 결합하는 과정은 concatenate 레이어를 사용하여 이루어집니다.

멀티모달 학습 모델 학습 및 평가

위에서 정의한 멀티모달 학습 모델을 사용하여 데이터를 학습하고 평가할 수 있습니다.

model.fit([X_image, X_text], y, batch_size=32, epochs=10, validation_split=0.2)

...
# 모델 평가
model.evaluate([X_image, X_text], y)

위의 코드에서 X_image, X_text, y는 위에서 준비한 데이터셋입니다. 모델의 fit 메서드를 사용하여 학습을 수행하고, evaluate 메서드를 사용하여 모델을 평가할 수 있습니다.

결론

Keras를 사용하면 이미지와 텍스트와 같은 다양한 유형의 데이터를 함께 처리하는 멀티모달 학습 모델을 쉽게 구성할 수 있습니다. 이를 통해 다양한 형태의 데이터를 이용하여 모델을 훈련하고 예측하는 것이 가능해집니다. 멀티모달 학습은 실제 세계의 복잡한 데이터를 다룰 때 많은 도움이 되며, 다양한 분야에서 응용될 수 있는 강력한 기술입니다.