如何将注意力层应用于 LSTM 模型
How to apply Attention layer to LSTM model
我正在做语音情感识别机器训练。
我想对模型应用注意力层。指令page很难理解。
def bi_duo_LSTM_model(X_train, y_train, X_test,y_test,num_classes,batch_size=68,units=128, learning_rate=0.005, epochs=20, dropout=0.2, recurrent_dropout=0.2):
class myCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs={}):
if (logs.get('acc') > 0.95):
print("\nReached 99% accuracy so cancelling training!")
self.model.stop_training = True
callbacks = myCallback()
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Masking(mask_value=0.0, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(tf.keras.layers.Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout,return_sequences=True)))
model.add(tf.keras.layers.Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout)))
# model.add(tf.keras.layers.Bidirectional(LSTM(32)))
model.add(Dense(num_classes, activation='softmax'))
adamopt = tf.keras.optimizers.Adam(lr=learning_rate, beta_1=0.9, beta_2=0.999, epsilon=1e-8)
RMSopt = tf.keras.optimizers.RMSprop(lr=learning_rate, rho=0.9, epsilon=1e-6)
SGDopt = tf.keras.optimizers.SGD(lr=learning_rate, momentum=0.9, decay=0.1, nesterov=False)
model.compile(loss='binary_crossentropy',
optimizer=adamopt,
metrics=['accuracy'])
history = model.fit(X_train, y_train,
batch_size=batch_size,
epochs=epochs,
validation_data=(X_test, y_test),
verbose=1,
callbacks=[callbacks])
score, acc = model.evaluate(X_test, y_test,
batch_size=batch_size)
yhat = model.predict(X_test)
return history, yhat
如何应用它以适合我的模型?
use_scale
、causal
和 dropout
都是参数吗?
如果attention layer
中有dropout
,LSTM层中有dropout
,我们如何处理?
注意力可以理解为软向量检索。
您有一些查询向量。对于每个查询,您想检索一些
值,以便您计算它们的权重,
其中权重是通过将查询与 keys 进行比较获得的(键的数量必须与值的数量相同,并且通常它们是相同的向量)。
在 sequence-to-sequence 模型中,查询是解码器状态,键和值是解码器状态。
在分类任务中,您没有这样的显式查询。解决这个问题的最简单方法是训练一个“通用”查询,该查询用于从隐藏状态中收集相关信息(类似于最初描述的 in this paper)。
如果您将问题作为序列标签来处理,而不是将标签分配给整个序列,而是分配给各个时间步长,您可能需要改用 self-attentive 层。
我正在做语音情感识别机器训练。
我想对模型应用注意力层。指令page很难理解。
def bi_duo_LSTM_model(X_train, y_train, X_test,y_test,num_classes,batch_size=68,units=128, learning_rate=0.005, epochs=20, dropout=0.2, recurrent_dropout=0.2):
class myCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs={}):
if (logs.get('acc') > 0.95):
print("\nReached 99% accuracy so cancelling training!")
self.model.stop_training = True
callbacks = myCallback()
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Masking(mask_value=0.0, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(tf.keras.layers.Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout,return_sequences=True)))
model.add(tf.keras.layers.Bidirectional(LSTM(units, dropout=dropout, recurrent_dropout=recurrent_dropout)))
# model.add(tf.keras.layers.Bidirectional(LSTM(32)))
model.add(Dense(num_classes, activation='softmax'))
adamopt = tf.keras.optimizers.Adam(lr=learning_rate, beta_1=0.9, beta_2=0.999, epsilon=1e-8)
RMSopt = tf.keras.optimizers.RMSprop(lr=learning_rate, rho=0.9, epsilon=1e-6)
SGDopt = tf.keras.optimizers.SGD(lr=learning_rate, momentum=0.9, decay=0.1, nesterov=False)
model.compile(loss='binary_crossentropy',
optimizer=adamopt,
metrics=['accuracy'])
history = model.fit(X_train, y_train,
batch_size=batch_size,
epochs=epochs,
validation_data=(X_test, y_test),
verbose=1,
callbacks=[callbacks])
score, acc = model.evaluate(X_test, y_test,
batch_size=batch_size)
yhat = model.predict(X_test)
return history, yhat
如何应用它以适合我的模型?
use_scale
、causal
和 dropout
都是参数吗?
如果attention layer
中有dropout
,LSTM层中有dropout
,我们如何处理?
注意力可以理解为软向量检索。
您有一些查询向量。对于每个查询,您想检索一些
值,以便您计算它们的权重,
其中权重是通过将查询与 keys 进行比较获得的(键的数量必须与值的数量相同,并且通常它们是相同的向量)。
在 sequence-to-sequence 模型中,查询是解码器状态,键和值是解码器状态。
在分类任务中,您没有这样的显式查询。解决这个问题的最简单方法是训练一个“通用”查询,该查询用于从隐藏状态中收集相关信息(类似于最初描述的 in this paper)。
如果您将问题作为序列标签来处理,而不是将标签分配给整个序列,而是分配给各个时间步长,您可能需要改用 self-attentive 层。