• 카테고리

    질문 & 답변
  • 세부 분야

    자연어 처리

  • 해결 여부

    해결됨

BERT를 이용한 텍스트 분류에서 다중분류라면 어떻게 해야할까요?

23.04.06 10:31 작성 조회수 1.1k

1

보여주신 두 개의 예가 모두 이진 분류 문제라서 질문드려 봅니다.

AUTOTUNE = tf.data.AUTOTUNE
batch_size = 32

class_names = ['neg', 'pos']

# train 데이터셋 준비
df_train_target = df_train.pop('labels')
train_dataset = tf.data.Dataset.from_tensor_slices((df_train.values, df_train_target.values))
raw_train_ds = train_dataset.shuffle(len(df_train)).batch(batch_size)
train_ds = raw_train_ds.cache().prefetch(buffer_size=AUTOTUNE)

# validation 데이터셋 준비
df_valid_target = df_valid.pop('labels')
valid_dataset = tf.data.Dataset.from_tensor_slices((df_valid.values, df_valid_target.values))
valid_ds = valid_dataset.shuffle(len(df_valid)).batch(batch_size)
valid_ds = valid_ds.cache().prefetch(buffer_size=AUTOTUNE)

# test 데이터셋
df_test_target = df_test.pop('labels')
test_dataset = tf.data.Dataset.from_tensor_slices((df_test.values, df_test_target.values))
test_ds = test_dataset.shuffle(len(df_test)).batch(batch_size)
test_ds = test_ds.cache().prefetch(buffer_size=AUTOTUNE)

여기서 class_names를 class수 에 맞게 변경하고

 

  net = tf.keras.layers.Dense(1, activation=None, name='classifier')(net)

Fine Tuning시 Dense Layer를 class수에 맞게 변경 하고...

< 여기서 activation은 이진 분류 문제임에도 sigmoid가 아니라 None인데, 그럴경우 linear로 되는 것으로 알고있습니다. 다중분류 문제 분류를 할 때도 None으로 설정하면 될까요? >

 

def print_my_examples(inputs, results):
  result_for_printing = \
    [f'input: {inputs[i]:<30} : score: {results[i][0]:.6f}'
                         for i in range(len(inputs))]
  print(*result_for_printing, sep='\n')
  print()


examples = [
    'this is such an amazing movie!',  # this is the same sentence tried earlier
    'The movie was great!',
    'The movie was meh.',
    'The movie was okish.',
    'The movie was terrible...'
]

reloaded_results = tf.sigmoid(reloaded_model(tf.constant(examples)))
original_results = tf.sigmoid(classifier_model(tf.constant(examples)))

print('Results from the saved model:')
print_my_examples(examples, reloaded_results)
print('Results from the model in memory:')
print_my_examples(examples, original_results)

마지막으로 다중분류를 할 때,

reloaded_results = tf.sigmoid(reloaded_model(tf.constant(examples)))
original_results = tf.sigmoid(classifier_model(tf.constant(examples)))

여기서 tf.softmax로 바꿔주면 되나요?

답변 1

답변을 작성해보세요.

0

안녕하세요~. 반갑습니다.

다중 분류로 진행하시려면

  1. 여기서 class_names를 class수 에 맞게 변경하고

  2. Fine Tuning시 Dense Layer를 class수에 맞게 변경 하고...

  3. Loss Function을 BinaryCrossentropy 대신 CategoricalCrossentropy나 SparseCategoricalCrossentropy로 바꿔주시고 (데이터를 어떻게 구성하느냐에 따라 둘중에 어떤 Loss를 사용하는지가 달라집니다.)

  4. 학습한뒤에 prediction 결과에서 argmax로 확률값이 가장 높은 요소를 뽑아주시면 됩니다.

말씀해주신 부분들에서 LossFunction을 변경하는 것만 추가해서 고려해주시면 될것 같습니다.

좋은 하루되세요~.

감사합니다.

 

구비연님의 프로필

구비연

질문자

2023.04.17

감사합니다!!