【掩码机制】解决LSTM中特征长度不一致问题

在训练Lstm模型的时候可能会遇到这样的一个问题:特征的长度是不一样的,有的特征长度长,有的特征短,这可能会对我们训练模型造成困扰,本次分享如何解决这一问题:

如题所示,使用的正是 Mask 机制,所谓 Mask 机制就是我们在使用不等长特征的时候先将其补齐,在训练模型的时候再将这些参与补齐的数去掉,从而实现不等长特征的训练问题。

补齐的话使用 sequence 中的方法:

from keras_preprocessing import sequence
MaxLen=15
x = [[1], [2,5], [3,9,9,4,8]]  # 特征
y = [2, 4, 6]  # 标签
x=sequence.pad_sequences(x,maxlen=MaxLen,value=0)
print(x)

补齐的结果:
在这里插入图片描述

可以看到使用 sequence 的 pad_sequences() 方法后不等长的特征补齐了,补齐方式为不足我们所需要的特征长度的话将前面的值用我们给定的值补齐(我们需要的特征长度为“ MaxLen=15 ”,补齐的值为 0 )。

补齐之后,我们在训练的时候只要加上Mask机制将补齐的值过滤掉就可以了,整个过程如下:

import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense, Activation, Dropout, Masking
from keras.layers.recurrent import LSTM
from keras_preprocessing import sequence
MaxLen=15
x = [[1], [2,5], [3,9,9,4,8]]  # 特征
y = [2, 4, 6]  # 标签
x=sequence.pad_sequences(x,maxlen=MaxLen,value=0)
x = np.array( x )
y_train = np.array( y )
x_train = np.reshape( x, (x.shape[0], x.shape[1], 1) )  # Lstm调用库函数必须要进行维度转换
model = Sequential()
model.add( Masking( mask_value=0, input_shape=(MaxLen,1) ) ) # Mask机制的使用
model.add( LSTM( 100, input_shape=(x_train.shape[1], x_train.shape[2]), return_sequences=True ) )
model.add( LSTM( 20, return_sequences=False ) )
model.add( Dropout( 0.2 ) ) 
model.add( Dense( 1 ) )
model.add( Activation( 'linear' ) )
model.compile( loss="mse", optimizer="rmsprop" )
model.fit( x_train, y_train, epochs=100, batch_size=1)  # 参数依次为特征,标签,训练循环次数,小批量(一次放入训练的数据个数)
test=sequence.pad_sequences([[1.5]],maxlen=MaxLen,value=0)
test = np.reshape( test, (test.shape[0], test.shape[1], 1) )#维度转换
res = model.predict( test )
print(res)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值