簡體   English   中英

如何使用 Glove 和 CNN 配置和訓練模型進行文本分類?

[英]How to configure and train the model using Glove and CNN for text classification?

我曾使用 Glove 和 CNN 進行文本分類,並發現以下問題:

File "c:\programfiles_anaconda\anaconda3\envs\math_stat_class\lib\site-packages\tensorflow\python\framework\ops.py", line 1657, in _create_c_op
    raise ValueError(str(e))

ValueError: Negative dimension size caused by subtracting 5 from 1 for '{{node max_pooling1d_9/MaxPool}} = MaxPool[T=DT_FLOAT, data_format="NHWC", ksize=[1, 5, 1, 1], padding="VALID", strides=[1, 5, 1, 1]](max_pooling1d_9/ExpandDims)' with input shapes: [?,1,1,128].

手套輸入

EMBEDDING_DIM = 100
    
embeddings_index = {}
    
f = open(glove_path, encoding='utf-8')  
for line in f:    
    values = line.split()
    word = values[0]
    coefs = np.asarray(values[1:], dtype='float32')
    embeddings_index[word] = coefs
    f.close()
    
print('Found %s word vectors.' % len(embeddings_index))
    
embedding_matrix = np.zeros((len(word_index) + 1, EMBEDDING_DIM))
    
for word, i in word_index.items():
    embedding_vector = embeddings_index.get(word)
    if embedding_vector is not None:
        # words not found in embedding index will be all-zeros.
        embedding_matrix[i] = embedding_vector

CNN的層輸入

# apply embedding matrix into an Embedding layer
# trainable=False to prevent the weights from being updated during training
embedding_layer = Embedding(len(word_index) + 1,
                            EMBEDDING_DIM,
                            weights=[embedding_matrix],
                            input_length=MAX_SEQUENCE_LENGTH,
                            trainable=False)

訓練一維CNN

sequence_input = Input(shape=(MAX_SEQUENCE_LENGTH,), dtype='int32')
embedded_sequences = embedding_layer(sequence_input)

x = Conv1D(128, 5, activation='relu')(embedded_sequences)   
print("x shape = ", x)

x = MaxPooling1D(5)(x)  
print("x shape = ", x)
        
x = Conv1D(128, 5, activation='relu')(x)
print("x shape = ", x)
    
#-----This line below produced error-----
x = MaxPooling1D(5)(x) #Error this line
#-----This line above produced error-----
        
print("x shape = ", x)

x = Conv1D(128, 5, activation='relu')(x)
print("x shape = ", x)
    
x = MaxPooling1D(35)(x)  # global max pooling
print("x shape = ", x)
    
x = Flatten()(x)
x = Dense(128, activation='relu')(x)
    
preds = Dense(len(labels_index), activation='softmax')(x)
model = Model(sequence_input, preds)
model.compile(loss='categorical_crossentropy',
              optimizer='rmsprop',
              metrics=['acc'])
    
# Learning
model.fit(X_train, y_train, validation_data=(X_val, y_val),
          epochs=2, batch_size=128)

我的想法

1) 手套輸入是否存在一些問題/問題?

2)Conv1D:

  • 將“kernel_size”從 5 更改為新值。

3)MaxPooling1D:

  • 將 pool_size 從 5 更改為新值。
  • 指定其他參數:步幅、填充等。

4) 我目前在 tensorflow 2.20 和 python 3.6 上使用 keras

  • 我需要升級 tensorflow 和 python 嗎?

但是,我想不出更好的方法。 我可以有你的建議嗎?

我想到了兩件事:你的最大池化層每次都在減少下一個卷積層的輸入大小,最終大小太小而無法運行另一個最大池化操作。 嘗試跑步

 tf.print(model.summary) 

在每次最大池化操作之后,你會很快發現你的張量不能進一步減少。 然后,您可以考慮在最大池化層中使用不同的pool_size

我注意到的第二件事(我不確定它是否是故意的),但是MaxPooling1D != Global Max Pooling Keras 支持這兩種操作 看看文檔。

附帶說明一下,使用 CNN 進行句子分類在 Yoon Kim 的工作中得到了廣泛推廣。 在他的工作中,他表明全局最大池化操作比句子分類中的跨步最大池化操作執行得更好(當使用詞嵌入時,就像你正在做的那樣)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM