Keras中用于masking以及padding的两个函数分别是keras.preprocessing.sequence.pad_sequences(sequences, maxlen=None, dtype='int32', padding='pre', truncating='pre', value=0.0)以及keras.layers.Masking(mask_value=0.0)。
pad_sequences用于将序列填充到相同的长度。可以将一个由num_samples个序列(每个序列又是一个整数的列表,每个数字对应词典中的词的ID)构成的列表转化为一个形状为(num_samples, num_timesteps)的二维numpy数组。num_timesteps这个量可以由参数maxlen来控制;如果maxlen为None,那么num_timesteps默认为原来的序列当中最长那个序列的长度。相应的,如果序列长度小于num_timesteps,那么就在其后填充0直到长度为num_timesteps。如果序列长于num_timesteps,将会被削短。填充或者是削短的位置由参数padding和truncating的值来控制,默认填充位置在序列开始位置之前。
几个传入参数的说明:
sequences: List of lists, where each element is a sequence.
maxlen: Int, maximum length of all sequences.
dtype: Type of the output sequences. To pad sequences with variable length strings, you can use object.
padding: String, 'pre' or 'post': pad either before or after each sequence.
truncating: String, 'pre' or 'post': remove values from sequences larger than maxlen, either at the beginning or at the end of the sequences.
value: Float or String, padding value.
举一个简单的例子:
input:
seqs = [[1,2,3,4],[2,3,4,5,6,6,6]] # list of integar lists
op:
K.preprocessing.sequence.pad_sequences(a, maxlen=10, dtype='int32', padding='pre', truncating='pre', value=0.0)
output:
array([[0, 0, 0, 0, 0, 0, 1, 2, 3, 4],[0, 0, 0, 2, 3, 4, 5, 6, 6, 6]])
keras.layers.Masking(mask_value=0.0)是用于对值为指定值的位置进行掩蔽的操作,以忽略对应的timestep。在输入张量的每个时刻(即输入张量的第一个维度),如果输入张量在这一时刻的所有值都等于指定的mask_value,那么这一时刻将会在接下来的下游层都会被跳过(只要其支持masking操作)。如果下游层不支持masking操作,那么就会报错。
举例如下:考虑一个numpy数据x,其具有(samples, timesteps, features)的形状。这组数据将会被送入到LSTM层中。由于数据缺乏,想要掩蔽第三个和第五个时刻,首先应当将数据操作如下:
x[:, 3, :] = 0.
x[:, 5, :] = 0.
然后,在原来的基础上添加掩蔽层:
model = Sequential()
model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
model.add(LSTM(32))