【发布时间】:2023-12-12 00:55:02
【问题描述】:
我正在使用 MOSI 数据集进行多模态情感分析,目前我只为文本数据集训练模型。对于文本,我使用 300 尺寸的手套嵌入来处理文本。我的总词汇量为 2173,填充序列长度为 30。我的目标数组是 [0,0,0,0,0,0,1],其中最左边是高度 -ve,最右边是高度 +ve。
我正在像这样拆分数据集
X_train, X_test, y_train, y_test = train_test_split(WDatasetX, y7, test_size=0.20, random_state=42)
我的标记化过程是
MAX_NB_WORDS = 3000
tokenizer = Tokenizer(num_words=MAX_NB_WORDS,oov_token = "OOV")
tokenizer.fit_on_texts(Text_X_Train)
tokenized_X_train = tokenizer.texts_to_sequences(Text_X_Train)
tokenized_X_test = tokenizer.texts_to_sequences(Text_X_Test)
我的嵌入矩阵:
vocab_size = len(tokenizer.word_index)+1
emb_mean=0
def embedding_matrix_filteration():
all_embs = np.stack(list(embeddings_index.values()))
print(all_embs.shape)
emb_mean, emb_std = np.mean(all_embs), np.std(all_embs)
print(emb_mean)
embedding_matrix = np.random.normal(emb_mean, emb_std, (vocab_size, embed_dim)) gives the matrix of specified
size filled with values from gauss distribution
print(embedding_matrix.shape)
print("length of word2id:",len(word2id))
embeddedCount = 0
not_found = []
for word, idx in tokenizer.word_index.items():
embedding_vector = embeddings_index.get(word.lower())
if word == ' ':
embedding_vector = np.zeros_like(emb_mean)
if embedding_vector is not None:
embedding_matrix[idx] = embedding_vector
embeddedCount += 1
else:
print(word)
print("$$$")
print('total embedded:',embeddedCount,'common words')# words common between glove vector and wordset
print("length of word2id:",len(word2id))
print(len(embedding_matrix))
return embedding_matrix
emb = embedding_matrix_filteration()
模型架构:
嵌入层:
embedding_layer = Embedding(
vocab_size,
300,
weights=[emb],
trainable=False,
input_length=sequence_length
)
我的模特:
from keras import regularizers,layers
model = Sequential()
model.add(embedding_layer)
model.add(Bidirectional(layers.LSTM(512,return_sequences=True)))
model.add(Bidirectional(layers.LSTM(512,return_sequences=True)))
model.add(Bidirectional(layers.LSTM(256,return_sequences=True)))
model.add(Bidirectional(layers.LSTM(256)))#kernel_regularizer=regularizers.l2(0.001)
model.add(Dense(128, activation='relu'))
# model.add(Dropout(0.2))
model.add(Dense(128, activation='relu'))
# model.add(Dropout(0.2))
model.add(Dense(7, activation='softmax'))
由于某种原因,当我的训练准确率达到 80% 时,val。准确率仍然很低。我尝试了不同的正则化技术、优化器、损失函数,但结果是一样的。我不知道为什么。
请帮忙!!
编辑:总数。代币数量为 2719 枚,总数为 2719 枚。句子(包括测试和训练数据集)是 2183。
Compiler: model.compile(optimizer='adam',
loss='mean-squred-error',
metrics=['accuracy']
)
更新数据:
我已将标签大小从 7 减小到 3,即 [0,1,0] -> +ve、neutral ,-ve。
model = Sequential()
model.add(embedding_layer)
model.add(Bidirectional(layers.LSTM(16,activation='relu')))
model.add(Dropout(0.2))
model.add(Dense(3, activation='softmax'))
编译:
model.compile(
optimizer=keras.optimizers.Adam(learning_rate=0.00005),
loss='categorical_crossentropy',
metrics = ['accuracy'])
但是损失仍然很高,而且我已经对数据集进行了分层。
【问题讨论】:
-
分享你的
model.compile。 -
这是什么意思:
My target array is [0,0,0,0,0,0,1]?这代表 7 个具有 0/1 二进制标签的训练实例,还是代表一个具有 7 个输出的训练实例?如果是后者,每个值的可能范围是多少?二进制 0/1 还是浮点数? -
我对输出进行了热编码,就像是情感分析一样,[1,0,0,0,0,0,0] 表示高度-ve,[0,0,0,1, 0,0,0] 表示中性,[0,0,0,0,1,0,0] 表示略微+ve。我已将整个数据集标签更改为这种形式,即大小为 (1,7) 的向量。 “我的目标数组是 [0,0,0,0,0,0,1]”我用这一行来讲述我的标签结构。因此,我的标签/输出是大小为(1,7)的向量的形式。
-
你试过用基本的 DNN 代替 RNN 吗?
-
不,我认为 RNN 比 DNN 更擅长 NLP 的任务。特别是双向更好。不是吗?
标签: python tensorflow machine-learning keras lstm