最近发生了很多事情,从上个周开始,身体不适难以启齿的原因跑了几次校医院,还跑了一趟北三院。昨天跑步的时候把脚崴了,今天去校医院检查居然骨折了( ▼-▼ ),难受。昨天还活蹦乱跳,今天就一瘸一拐。所以这两天都没有写leetcode,机器学习也没有进展。明天开始回归正常!
循环神经网络
RNN:借助循环核(Cell )提取特征后,送入全连接网(Dense)
提取时间信息,循环核参数时间共享
RNN是在单个神经元上,除输入输出外, 添加一条自循环回路表征当前状态,当前状态会影响其未来状态。ht=f(ht-1 ,xt)
使得某一时刻神经元状态ht ,记忆力之前各时刻的状态h1,h2,…,ht-1
可以看到,存在两个参数wxh,whh,why。可以看到第一个参数代表是和x或者h的同维向量,第二个参数是对应的是h还是y
又因为xt,ht-1都是一维向量准确的说为相同一维的,所以可以拼接成一维向量作为循环体的全连接层神经网络的输入。
具体数值运算:
代码
tf.keras.layers.Embedding( 总词汇量,编码的维度,输入长度)
[[4], [20]] embedding为 [[0.25, 0.1, 0.11], [0.6, 0.1, -0.2]]
例 :tf.keras.layers.Embedding(100, 3,input_length=2)
总词汇量:指的是数字输入大小不超过100
举个例子:
model = Sequential()
model.add(Embedding(1000, 64, input_length=10))
#模型将输入一个大小为 (batch, input_length) 的整数矩阵。
#输入中最大的整数(即词索引)不应该大于 999 (词汇表大小)
#现在 model.output_shape == (None, 10, 64),其中 None 是 batch 的维度。
input_array = np.random.randint(1000, size=(32, 10))
#产生一个不大于1000的(32,10)的矩阵
model.compile(‘rmsprop’, ‘mse’)
output_array = model.predict(input_array)
assert output_array.shape == (32, 10, 64)
tf.keras.layers.SimpleRNN( 神经元个数,return_sequences= 是否返回输出,
unroll= 是否加速)
return_sequences=True 推送各时刻状态ht 到下一层,用于末层,推向Dense层 层
return_sequences=False 仅推送最后时刻ht到下一层,用于中间层 到下一层,用于中间层
例:SimpleRNN(3, return_sequences=True, unroll=True)
注意点一:
RNN有三个超参数:
kernel:相当于wxh
recurrent_kernel:相当于whh
bias:相当于why
注意点二:
输入为x_train(batch_size,time_step,length)
其中time_step表示该RNN有多少轮循环,比如说time_step=6,就代表要计算ht(ht-1.xt) yt(ht)6次
每一次的输入为我的理解:(batch_size,1,length),就比如有三句话
{“天空好蓝”,“湖水好蓝”,“空气好清新”}此时经过one-hot或者Embedding后变成(3,5,length)的矩阵,而输入时(3,1,length),相当于每一次带入每一句话的第i个字进行训练
注意点三:SimpleRNN( 神经元个数)
指的是获得输出的维度。
比如输入的是(4,1,5)SimpleRNN(3),则wxh为(5,3)
再比如,在我们的具体数值计算的那张图中,SimpleRNN(2)