这么显著的地方我要说几句话:
我是一刚接触机器学习、深度学习的人,之前也不是搞这些的。这是我在不太
了解原理和没有多少经验的情况下,如何做到短时间内动手改动一些模型的总结。
大佬们,可以自觉离开了,
LSTM:
keras.layers.LSTM(units, activation='tanh', recurrent_activation='hard_sigmoid', use_bias=True, kernel_initializer='glorot_uniform', recurrent_initializer='orthogonal', bias_initializer='zeros', unit_forget_bias=True, kernel_regularizer=None, recurrent_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, recurrent_constraint=None, bias_constraint=None, dropout=0.0, recurrent_dropout=0.0, implementation=1, return_sequences=False, return_state=False, go_backwards=False, stateful=False, unroll=False)
还是先说一下LSTM需要的输入格式(batch_size, time_stpes, input_size)
batch_size:就是多少个样本
time_stpes:是总步长的意思,看好是总的步长
input_size:是LSTM需要输入的一个向量的长度。
(5,10,20)放在应用当中就是一句话有10个单词,每个单词被展开为20维度的向量,那么就一共有10个这样的20维度的向量,每个20维度的向量作为LSTM的输入在LSTM里面进行各种Dense、激活、组合等操作,最后输出units个值,这就是LSTM唯一参数的作用。当第一个单词20维度计算完成之后,紧接着第二个单词20维度输入进来,这样循环十次。其中要注意的点就是这个cell就一个,那些图只是为了演示怎么回事所以一般画了三个,其实就一个。然后这个units是cell里面的神经元个数。
当我们预测的时候就可以拿这样的数据(1,1,20)、(1,10,20)去预测,第一个意思就是一个单词预测输出是多少,后面那个就是输入十个单词预测下一个是多少,我没试过,但我觉着肯定这么行。
当我们看到这个keras的LSTM网络时,一般我们只要关注这个units参数即可,其他的参数默认即可,就算有改动的,当下对我来说也无关紧要,不会有太大的影响,毕竟我的目的是做到模型可以训练可以跑,跑的怎么样当下不是主要矛盾。
Conv1D:
还是说输入,(batch_size,seqlen,dim)。放在应用当中,拿信号举个例子,(5,20,100),我们有20个样本,每个样本由100个采集的点组成,一维卷积就在这最后一个维度为100的维度上做卷积计算,然后卷积核在20个样本上跳动、移动,这样就做到了用1维卷积对电信号进行特征提取。
其实对每个tensor,我们应该关注的都是最后一个维度。刚开始接触时学的2D卷积,那是最直观和理解的卷积方式,其实把H和W作为一个东西,他也是在最后一个维度上进行的卷积。
最后一个维度为100,也就是100个值,我们的计算操作都是对这个100个值进行计算的,有20个这样的值,那么可以一个一个计算也可以跳着计算,那就是kernel_size=2,stride=X的情况了
2D卷积+attention
我们知道attention可以在feature_maps上加一个权重。他其实就在channel上进行Dense操作,有几个channel Dense就有几个神经元,然后把输出值在乘以原来的input输入,做到input的每个channel能乘以一个权重值。