Keras 是一个兼容 Theano 和 Tensorflow 的神经网络高级包, 用他来组件一个神经网络更加快速, 几条语句就搞定了. 而且广泛的兼容性能使 Keras 在 Windows 和 MacOS 或者 Linux 上运行无阻碍.
今天来对比学习一下用 Keras 搭建下面几个常用神经网络:
它们的步骤差不多是一样的:
为了对比学习,用到的数据也差不多是一样的, 所以本文只把注意力放在 2. [建立模型] 上面,其它步骤大同小异,可以去参考里提到的教学网站观看或者直接看源代码。
获取方式:
关注微信公众号 datayx 然后回复 keras 即可获取。
目的是对一组数据进行拟合。
1. 用 Sequential 建立 model 2. 再用 model.add 添加神经层,添加的是 Dense 全连接神经层。
参数有两个,一个是输入数据和输出数据的维度,本代码的例子中 x 和 y 是一维的。
如果需要添加下一个神经层的时候,不用再定义输入的纬度,因为它默认就把前一层的输出作为当前层的输入。在这个例子里,只需要一层就够了。
我们要用 sin 函数预测 cos 数据,会用到 LSTM 这个网络。
1. 搭建模型,仍然用 Sequential。 2. 然后加入 LSTM 神经层。
3. 有个不同点是 TimeDistributed。
在上一个回归问题中,我们是直接加 Dense 层,因为只在最后一个输出层把它变成一个全连接层。 今天这个问题是每个时间点都有一个 output,那需要 dense 对每一个 output 都进行一次全连接的计算。
数据用的是 Keras 自带 MNIST 这个数据包,再分成训练集和测试集。x 是一张张图片,y 是每张图片对应的标签,即它是哪个数字。
简单介绍一下相关模块:
在回归网络中用到的是 model.add 一层一层添加神经层,今天的方法是直接在模型的里面加多个神经层。好比一个水管,一段一段的,数据是从上面一段掉到下面一段,再掉到下面一段。
数据仍然是用 mnist。
1. 建立网络第一层,建立一个 Convolution2D,参数有 filter 的数量。
2. Pooling 是一个向下取样的过程. 它可以缩小生成出来的长和宽,高度不需要被压缩。
3. 接下来建立第二个神经层
4. 接下来进入全联接层
5. 在第二个全连接层,输出 10 个 unit, 用 softmax 作为分类。
RNN 是一个序列化的神经网,我们处理图片数据的时候,也要以序列化的方式去考虑。 图片是由一行一行的像素组成,我们就一行一行地去序列化地读取数据。最后再进行一个总结,来决定它到底是被分辨成哪一类。
用到的参数含义:
1. 用 Sequential 建立模型,就是一层一层地加上神经层。
2. 加上 SimpleRNN。 batch_input_shape 就是在后面处理批量的训练数据时它的大小是多少,有多少个时间点,每个时间点有多少个像素。
3. 加 Dense 输出层。 输出 output 长度为 10,接着用 softmax 激活函数用于分类。
4. 在训练的时候有一个小技巧,就是怎么去处理批量。 输出结果时每 500 步输出一下测试集的准确率和损失。
需要用到 BATCH_INDEX,一批批地截取数据,下一批的时候,这个 BATCH_INDEX 就需要累加,后面的时间点和步长没有变化都是28。 y 的批量和 x 的处理是一样的,只不过 y 只有二维,所以它只有两个参数。
后面有一个判断语句,如果这个 index 大于训练数据的总数,index 就变为 0,再从头开始一批批处理。
自编码,简单来说就是把输入数据进行一个压缩和解压缩的过程。 原来有很多 Feature,压缩成几个来代表原来的数据,解压之后恢复成原来的维度,再和原数据进行比较。
做的事情是把 datasets.mnist
数据的 28×28=784 维的数据,压缩成 2 维的数据,然后在一个二维空间中可视化出分类的效果。
模型结构:
encoding_dim
,要压缩成的维度。
建立 encoded
层和 decoded
层,再用 autoencoder
把二者组建在一起。训练时用 autoencoder
层。
1. encoded
用4层 Dense
全联接层
激活函数用 relu
,输入的维度就是前一步定义的 input_img
。
接下来定义下一层,它的输出维度是64,输入是上一层的输出结果。
在最后一层,我们定义它的输出维度就是想要的 encoding_dim=2
。
2. 解压的环节,它的过程和压缩的过程是正好相反的。
相对应层的激活函数也是一样的,不过在解压的最后一层用到的激活函数是 tanh
。因为输入值是由 -0.5 到 0.5 这个范围,在最后一层用这个激活函数的时候,它的输出是 -1 到 1,可以是作为一个很好的对应。
接下来直接用 Model
这个模块来组建模型
输入就是图片,输出是解压的最后的结果。
当我们想要看由 784 压缩到 2维后,这个结果是什么样的时候,也可以只单独组建压缩的板块,此时它的输入是图片,输出是压缩环节的最后结果。
最后分类的可视化结果: