Thắc mắc mô hình CNN cho phân loại văn bản

classification
deep-learning
nlp

#1

Em chào mọi người, Em có một số thắc mắc mạng CNN trong phân loại bài viết, em có tìm đọc trên mạng mà em không chắc chắn lắm. Em có mô hình CNN đơn giản như sau: input_layer = Input(shape=(500,)) # gia tri dieu chinh layer = Reshape((10,50))(input_layer)
conv2 = Conv1D(128,5, activation=“relu”)(layer) pool2 = MaxPooling1D(pool_size=2)(conv2) layer = Flatten()(pool2) layer = Dense(128, activation=‘relu’)(layer) Conv1D(128,5, activation=“relu”)(layer)

1: Khi em chọn Reshape(10,50) , Reshape(20,25) thì mô hình chạy, nhưng khi em chọn reshape(5,100) mô hình lại báo lỗi )

2: trong lớp này cần đến 128 bộ lọc, em thắc mắc tại sao lại cần nhiều bộ lọc như vậy? 1 bộ lọc thôi không đủ sao? Vậy keras hỗ trợ tối đa bao nhiêu loại bộ lọc? 3 : Để chọn ra đặc trưng của văn bản, tại sao không maxpooling luôn mà lại phải qua bước tích chập Conv1D? 4:

Theo như hình trên kết quả của Conv1D là mảng có 1 cột ví dụ [1,2,2,4] vậy lớp maxpooling1d chọn pool_size=2 thì sẽ trả về [2,4] đúng không ạ?


#2

Hi bạn, đầu tiên mình muốn nói là giờ rất ít khi người ta dùng mạng CNN cho các dữ liệu dạng sequence, ưu tiên hàng đầu sẽ là mạng RNN (các dạng như LSTM, GRU…).

OK, đến với câu hỏi của bạn.

  1. Bạn có thể chụp ảnh màn hình lỗi đó được không.
  2. Số lượng bộ lọc (filter) là do bạn quyết định. Mỗi filter sẽ tự học để lấy được một số đặc điểm của input. Bạn hoàn toàn có thể dùng 10, 20, 100 filter tùy ý. Tất nhiên, càng nhiều bộ lọc thì mô hình càng phức tạp, có thể dẫn tới overfitting. Do đó, cần thử nghiệm để chọn số filter phù hợp. Thường số lượng filter sẽ được chọn bằng 2^x (32, 64, 128, 256…).
  3. Như nói ở trên, số lượng filter là tùy ý bạn chọn, không có giới hạn nào cả.
  4. MaxPooling chỉ có tác dụng giảm kích thước feature map (thường là 1/2 mỗi chiều) chứ nó không học để lấy đặc trưng gì cả. Tác dụng chính của nó là giảm tính toán, trong khi vẫn giữ lại được những đặc trưng tốt.

#3

Em cảm ơn anh giải đáp ạ. Em tìm hiểu mô hình CNN cho phân loại văn bản do thầy yêu cầu ấy ạ, nên em không tự chọn mô hình được :smile:

Dạ, lỗi khi chọn reshape(5,100) như này ạ. Anh xem giúp em với


#4

Nó báo lỗi là input của layer maxpooling là [?, 1, 1, 128] nên không thể nào chia đôi được nữa. Bạn in ra shape layer trước đó để kiểm tra lại nhé.

Tiện thể, viết luôn giúp bạn mô hình như trong hình (mình thấy mô hình này ý tưởng ổn).

from keras import Model
from keras import layers

inputs = layers.Input(shape=(maxlen,))
conv1 = layers.Conv1D(32, 5, activation='relu')(inputs)
pool1 = layers.MaxPooling1D(2)(conv1)

conv2 = layers.Conv1D(32, 3, activation='relu')(inputs)
pool2 = layers.MaxPooling1D(2)(conv2)

conv3 = layers.Conv1D(32, 2, activation='relu')(inputs)
pool3 = layers.MaxPooling1D(2)(conv3)

concat = layers.Concatenate()([pool1, pool2, pool3])
output = layers.Dense(2, activation='sigmoid')(concat)

model = Model(inputs, output)

#5

Ui, em cảm ơn anh nhiều ạ! :blush:


#6

Anh ơi, khi em chạy code phần input báo lỗi như sau ạ! Anh xem giúp em với ạ!


#7

Hi bạn, sorry vì phản hồi muộn. Bạn thử như này xem sao. Tất nhiên cần chỉnh sửa lại cho phù hợp với bài toán của bạn.


from keras import Model
from keras import layers

emb_size = 128
maxlen = 20
inputs = layers.Input(shape=(maxlen, emb_size))
conv1 = layers.Conv1D(32, 5, padding='same', activation='relu')(inputs)
pool1 = layers.MaxPooling1D(2)(conv1)

conv2 = layers.Conv1D(32, 3, padding='same', activation='relu')(inputs)
pool2 = layers.MaxPooling1D(2)(conv2)

conv3 = layers.Conv1D(32, 2, padding='same', activation='relu')(inputs)
pool3 = layers.MaxPooling1D(2)(conv3)

concat = layers.Concatenate()([pool1, pool2, pool3])
flatten = layers.Flatten()(concat)
output = layers.Dense(2, activation='sigmoid')(flatten)

model = Model(inputs, output)
model.summary()

#8

Dạ vâng, em cảm ơn anh. Anh cho em hỏi thêm tại sao chỉ dùng Conv1D mà không dùng Conv2D ạ?


#9

Do input đầu vào là 2 chiều nên chỉ cần convolution 1D (di chuyển theo 1 chiều)


#10

Vâng, em hiểu rồi, em cảm ơn ạ


#11

Cảm ơn bạn vì câu trả lời rất chi tiết, mặc dù vậy xin phép được đính chính là CNN vẫn là một trong những lựa chọn tốt khi giải quyết bài toán dạng chuỗi, đăc biệt là trong kiến trúc của Transformer. Bạn có thể tham khảo thêm tại đây: https://trituenhantao.io/kien-thuc/transformer-hoat-dong-nhu-the-nao/

Rất mong được thảo luận sâu hơn cùng bạn!

.