GAN生成对抗网络的Keras实现

原创文章,转载请注明: 转载自慢慢的回味

本文链接地址: GAN生成对抗网络的Keras实现

网络组成

GAN生成对抗网络包括2部分:
生成网络部分:它是一个多层神经网络结构,把一个高斯噪声通过网络生成一个图片数据,像是一个回归问题。
鉴别网络部分:它也是一个多层神经网络结构,把一个图片数据通过网络输出1或0,分辨出是不是真实图片,像是一个分类问题。
对抗的含义在于,生成网络总是想生成一个和真的一样的图片,鉴别网络部分总是想区分出谁是真实图片,谁是生成网络生成的。

理论推导网上很多,可以参考比如:GAN论文阅读——原始GAN(基本概念及理论推导)

程序分析

生成网络模型:
输入1X100的高斯分布向量 ->
256输出的全连接 -> 用ReLU进行分类 -> 正规化 ->
512输出的全连接 -> 用ReLU进行分类 -> 正规化 ->
1024输出的全连接 -> 用ReLU进行分类 -> 正规化 ->
图像大小(28X28X1)输出的全连接 -> 用tanh进行激活输出 -> 生成28X28X1的图片
返回的模型为:输入噪声,输出图片
继续阅读“GAN生成对抗网络的Keras实现”本作品采用知识共享署名 4.0 国际许可协议进行许可。

Tensorflow LSTM原理

原创文章,转载请注明: 转载自慢慢的回味

本文链接地址: Tensorflow LSTM原理

LSTM是RNN的一种cell实现。那么什么是RNN呢?RNN是一种特殊的神经网络结构, 它是根据“人的认知是基于过往的经验和记忆”这一观点而提出的,它使网络对前面的内容的一种“记忆”功能。隐藏层中,一个序列当前的输出与前面的输出也有关,具体的表现形式为网络会对前面的信息进行记忆并应用于当前输出的计算中,即隐藏层之间的节点不再无连接而是有连接的,并且隐藏层的输入不仅包括输入层的输出还包括上一时刻隐藏层的输出,所有前面的结果可以影响后面的输出。所以它广泛运用于文本生成,机器翻译,机器写小说,语音识别等。
RNN整个网络架构如下所示:

可以看李弘毅的视频:25.循环神经网络RNN(I)_高清了解更多的RNN原理

LSTM原理

本文只说明LSTM的原理和一个基于Tensorflow的简单测试,测试代码以下图为案例:

如下图所示,LSTM单元接受3个输入:当前输入x_t,上一Cell状态c_t-1,上一次输出h_t-1。
1 上一次输出h_t-1和当前输入x_t按y轴加在一起,和权值矩阵W相乘,然后按y轴均分成4组i,j(z_2),f,o。
2 上一次状态C_t-1和遗忘开关f_t相乘,完成遗忘的处理;和受输入控制的i_t相加(i_t*j_t)完成状态的更新(c_t=C_t-1*f_t+i_t*j_t)。
3 更新后的状态C_t和输出开关o_t相乘,输出h_t。

继续阅读“Tensorflow LSTM原理”本作品采用知识共享署名 4.0 国际许可协议进行许可。

Tensorflow 图像CNN分类解析

原创文章,转载请注明: 转载自慢慢的回味

本文链接地址: Tensorflow 图像CNN分类解析

自从Yann Lecun最早将CNN用于手写数字识别后,卷积神经网络在多个方向持续火爆:如语音识别、人脸识别、通用物体识别等。与普通神经网络的最大区别为:卷积神经网络包含了由卷积层和池化层构成的特征抽取器。卷积层由卷积核做卷积运算替代全连接神经网络的矩阵计算。卷积核表示一组共享的权值,位于不同地方的权值可以模拟人眼对图像识别的局部感受野:一般认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。共享的权值还可以大大降低权值参数量。所以卷积核的局部感受野可以解决全连接计算将图像展开为向量丢失的空间信息;共享权值减少的参数可以提高训练效率和避免网络过拟合。

CNN原理

下面的视频也详细介绍了CNN的原理:
10.卷积神经网络(CNN)_高清

测试程序

继续阅读“Tensorflow 图像CNN分类解析”本作品采用知识共享署名 4.0 国际许可协议进行许可。

Tensorflow Conv2D和MaxPool2D原理

原创文章,转载请注明: 转载自慢慢的回味

本文链接地址: Tensorflow Conv2D和MaxPool2D原理

卷积神经网络(CNN)是指在所有网络中,至少优一层使用了卷积运算运算的神经网络,因此命名为卷积神经网络。
那么什么是卷积呢?如果需要卷积一个二位图片,首先定义一个卷积核(kernel),即权重矩阵,它能表面每一次卷积那个方向的值更重要,然后逐步在二维输入数据上“扫描卷积”。当卷积核“滑动”的同时进行卷积:计算权重矩阵和扫描所得的数据矩阵的乘积,求和后得到一个像素输出。
步长(Stride)为每次卷积核移动格数,填充(Padding)为是否对元素数据进行边缘填充。当不填充的时候,即Tensorflow中的VALID选项,卷积后的数据会比输入数据小,而加入合适的填充后,即Tensorflow中的SAME选项,卷积后的数据可以保持和输入数据大小一致。如下图所示:

那么什么是池化呢?池化也称为欠采样或下采样。主要用于特征降维,在保持旋转、平移、伸缩等不变性的前提下,压缩数据和参数的数量,减小过拟合,同时提高模型的容错性。常用的有按均值池化(mean-pooling):更大地保留图像背景信息,按最大值池化(max-pooling):更多的保留纹理信息。如下图所示,池化大大压缩了数据:

原理

以下面的测试程序来讨论Conv2D(卷积)和MaxPool2D(池化)的具体实现原理:
首先定义一个具有1张图,大小为6X6,通道为1个,即输入数据img的shape为[1,6,6,1]。
然后定义过滤器filter,NHWC格式,即批次,高,宽,通道格式,和输入数据是同一个格式。
下图为不同的卷积核对同一图片处理的结果:

测试程序

如下程序和图片示例,一个 3X3 的filter(卷积核的特征是提取图片从左上到右下的特征)在 6X6 的图片上,按照步长 1X1 从左往右,从上往下计算蒙版区域输出结果。
卷积计算:
图例1的卷积计算为:1*1 + 0*-1 + 0*-1 + 0*-1 + 1*1 + 0*-1 + 0*-1 + 0*-1 + 1*1 = 3
图例2的卷积计算为:1*1 + 0*-1 + 0*-1 + 0*-1 + 1*1 + 1*-1 + 0*-1 + 0*-1 + 0*1 = 1

继续阅读“Tensorflow Conv2D和MaxPool2D原理”本作品采用知识共享署名 4.0 国际许可协议进行许可。