数据专栏

智能大数据搬运工,你想要的我们都有

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

「深度学习福利」大神带你进阶工程师,立即查看>>>
https://www.lfd.uci.edu/~gohlke/pythonlibs/
人工智能
2018-12-10 22:23:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
# Mac
pip install https://download.tensorflow.google.cn/mac/cpu/tensorflow-1.12.0-py3-none-any.whl
# Linux CPU
wget https://storage.googleapis.com/tensorflow/linux/cpu/tensorflow-1.12.0-cp36-cp36m-linux_x86_64.whl
mv tensorflow-1.12.0-cp36-cp36m-linux_x86_64.whl tensorflow-1.12.0-cp37-cp37m-linux_x86_64.whl
pip install tensorflow-1.12.0-cp37-cp37m-linux_x86_64.whl
# Linux GPU
wget https://storage.googleapis.com/tensorflow/linux/gpu/tensorflow_gpu-1.12.0-cp36-cp36m-linux_x86_64.whl
mv tensorflow_gpu-1.12.0-cp36-cp36m-linux_x86_64.whl tensorflow_gpu-1.12.0-cp37-cp37m-linux_x86_64.whl
pip install tensorflow_gpu-1.12.0-cp37-cp37m-linux_x86_64.whl
# Windows CPU
# 下载https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.12.0-cp36-cp36m-win_amd64.whl
# 重命名文件,将36改为37
pip install tensorflow-1.12.0-cp37-cp37m-win_amd64.whl
# Windows GPU
# 下载https://storage.googleapis.com/tensorflow/windows/gpu/tensorflow_gpu-1.12.0-cp36-cp36m-win_amd64.whl
# 重命名文件,将36改为37
pip install tensorflow_gpu-1.12.0-cp37-cp37m-win_amd64.whl

人工智能
2018-12-10 22:04:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
变分推断

分解概率分布


分解近似的性质



一元高斯分布

模型比较
人工智能
2018-12-10 22:33:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
EM的另一种观点


重新考察高斯混合模型

与K均值的关系

伯努利分布的混合


贝叶斯线性回归的EM算法

人工智能
2018-12-10 22:32:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
混合高斯

最大似然


用于高斯混合模型的EM




人工智能
2018-12-10 22:32:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
K均值聚类



图像分割与压缩
人工智能
2018-12-10 22:32:00
「深度学习福利」大神带你进阶工程师,立即查看>>>






因子树


加和-乘积算法








最大加和算法






一般图的精确推断
循环置信传播

学习图结构
人工智能
2018-12-10 22:32:00
「深度学习福利」大神带你进阶工程师,立即查看>>>

条件独立性质

分解性质



图像去噪



与有向图的关系

人工智能
2018-12-10 22:31:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
条件独立

例子





D-划分




人工智能
2018-12-10 22:31:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
贝叶斯网络


例子

生成式模型

离散变量



线性高斯模型

人工智能
2018-12-10 22:31:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
用于回归的RVM








RVM用于分类




人工智能
2018-12-10 22:31:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
最大边缘分类器





重叠类分布






与Logistic回归的关系

多类SVM






计算学习理论

人工智能
2018-12-10 22:30:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
重新考虑线性回归问题


用于回归的高斯过程




学习超参数

自动相关性确定

用于分类的高斯过程


拉普拉斯近似




与神经网络的联系
人工智能
2018-12-10 22:30:00
「深度学习福利」大神带你进阶工程师,立即查看>>>


Nadarayas-Watson模型


人工智能
2018-12-10 22:30:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
后验参数分布


超参数最优化

用于分类的贝叶斯神经网络



人工智能
2018-12-10 22:29:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
一维资源分配问题








二维资源分配问题



固定资金分配问题
人工智能
2018-12-09 22:20:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
逆推解法


顺推解法


动态规划的计算框图


人工智能
2018-12-09 22:20:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
外点法


内点法


人工智能
2018-12-09 22:19:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
摘要: 想不想将神经网络训练成一个“放大镜”?我们就训练了一个这样炫酷的神经网络,点击文章一起看下吧!
低分辨率蝴蝶的放大
当我们网购时,我们肯定希望有一个贴近现实的购物体验,也就是说能够全方位的看清楚产品的细节。而分辨率高的大图像能够对商品进行更加详细的介绍,这真的可以改变顾客的购物体验,让顾客有个特别棒的购物之旅。 idealo.de 是欧洲领先的比价网站,也是德国电子商务市场最大的门户网站之一,在此基础上,我们希望能够在此基础上为用户提供一个用户友好、有吸引力的购物平台。
在这里, 我们利用深度学习来评估数百万酒店图像的美学层次和技术质量 ,另外,那些没有任何信息的、特别难看的小的产品图像对我们来说是无效的,因此需要想办法解决。
购物网站上并不是所有的商店都能为顾客提供高质量的图像,相反,商家提供的图像特别小、分辨率特别低、质量也很低。为了向用户展示高质量的高分辨率图像,我们基于2018年的论文《 图像超分辨率的RDN网络 》,训练了一个特别先进的卷积神经网络。
我们的目标很简单:拍摄一些特别小的图像,然后就像使用放大镜一样,对图像进行放大,并且还要保持高分辨率。
本文对实现这一目标做了详细介绍,另外,具体实现的细节,请查看 GitHub 。
总概
与大多数深度学习项目一样,我们的深度学习项目主要有四个步骤:
1.回顾前人对该项目所做的贡献。
2.实施一个或多个解决方案,然后比较预先训练的版本。
3.获取数据,训练并测试模型。
4.针对训练和验证结果对模型进行改进和优化。
具体来说,本文主要有以下几方面的内容:
1.介绍模型训练的配置,如何评估模型的性能
2. 查看早期训练和测试结果,了解从哪方面进行改进。
3.指出后续需要探索的方向。
训练
与以往“标准”的监督深度学习任务不同,我们这个“放大镜”深度学习模型输出的不仅仅是类标签或一个分数,而是一整幅图像。这就意味着训练过程以及评估会跟以往略有不同,我们要输出的是原始高分辨率图像,为了更好的对模型进行评估,我们需要一种测量缩放输出图像“质量”的方法,该方法更详细的优缺点将在后面进一步做详细阐释。
损失函数
损失函数是用来评估神经网络的性能究竟如何,这个有很多方法可以评估。这个问题的本质为大家留下了创造力空间,如有些聪明的人会用 高级特征和对抗网络 。对于第一次迭代,我们使用标准方法:网络的超分辨率(SR)输出和高分辨率输出(HR)之间的像素均方差(MSE)。
评估
我们用峰值信噪比(PSNR)来评估输出图像的质量,峰值信噪比是基于两个图像之间的像素均方差(MSE)。由于峰值信噪比是最常用的评估输出图像质量的方法,因此我们也使用这一评估标准,以便将本文模型与其他模型作比较。
开始
我们在p2.xlarge AWS EC2实例上进行训练,直到验证损失函数收敛,训练结束,这大概需要90个周期(一个周期24小时),然后使用Tensorboard跟踪训练数据集及验证数据集的损失函数和PSNR值。
90个训练时期的Tensorboard图
如上图所示,左上角为在每个周期结束时,反向传播到神经网络上的训练损失函数。右上角为跟踪泛化性能的非训练数据及的损失。左下角为训练数据集的PSNR值。右下角为验证数据集的PSNR值。
结果
输出的结果如下所示,我们先看看模型的输出结果,再考虑如何对该模型进行改进。左侧是验证数据集中的整个图像,中间是卷积神经网络的输出提取图像块,右侧是使用标准过程将中间输出提取图像块按比例放大后的输出,这里使用了 GIMP 的图像缩放功能

LR图像(左),重建SR(中),GIMP基线缩放(右)。
这个结果肯定不是特别完美:蝴蝶的天线周围有些没必要的噪声,蝴蝶的颈部和背部的毛发及翅膀上有些斑点轮廓,神经网络的输出图像(中)看起来要比GIMP基线输出图像(右)更加清晰。
结果分析
为了进一步理解模型有哪些优缺点,我们需要从验证数据集中提取具有高PSNR值的图像块和具有低能量度值的图像块。
不出所料,性能最佳的图像块是具有较多平坦区域的图像块,而较为复杂的图像块难以准确再现。因此,我们重点关注这些较复杂的图像块,以便对结果进行训练和评估。
同样的,我们也可以使用热图(heatmap)突出显示原始HR图像和神经网络输出SR图像之间的误差,颜色较暗的部分对应于较高的像素均方误差(较差的结果),颜色较浅的部分对应于较低的像素均方误差(或较好的结果)

HR-SR像素误差热图。颜色越暗,误差越大。
我们可以看到,具有多种模式的区域的误差会更大,但是看起来“更简单”的过渡区域则是相当黑暗的(例如云、天空),这是可以改进的,因为它与idealo的目录用例相关。
浅谈深度学习任务中的非真实数据
与常见的分类问题或输出为一个分值的监督式深度学习任务不同,我们用于评估神经网络输出的真实数据是原始HR图像。
这既有好处,也有坏处。
坏处:像Keras这样的当前较为流行的深度学习框架没有预先制定训练解决方案,比如生成器。实际上,它们通常依赖于从一维数组中获取训练和验证标签或文件,或者是直接从文件结构中派生出来的,这会涉及到一些额外的编码算法。
好处:没有必要花太多时间来获得标签,给出一个HR图像池,我们可以对其进行简单的缩小,获得我们所需要的LR训练数据,并使用原始HR图像来评估损失函数
通常来说,使用图像数据对神经网络进行训练时,需要从训练数据集中随机的选择多个图像来创建训练批次。然后将这些尺寸重新缩小到一个较小的尺寸,一般来说,大小约为100*100像素。我们随时使用随机变换对图像进行增强,并反馈到神经网络中。在这种情况下,没有必要向神经网络反馈整张图像,并且这也非常不可取。这是因为,我们不能将图像重新缩放到100*100的小像素点。毕竟,我们想要对图像进行放大。同时,我们也无法用较大尺寸的图像进行训练,比如大小为500*600像素的图像,因为处理这种大图像需要很长的时间。相反,我们可以从整个图像中提取一个非常小的随机色块,比如大小为16*16像素块,这样一来,我们就有了更多的数据点,因为每个图像都可以提供数百个不同的色块。
我们之所以能够处理这种小色块,是因为我们不需要将一堆图像进行分类,比如:腿+尾巴+胡须+死老鼠=猫。因此,模型的末端就没有全连接层。我们只需要使用神经网络来构建这些模式的抽象表示,然后学习如何对其进行放大,除此以外,还要对块进行重新组合,使组合后的图像变得有意义。这种抽象表示由卷积层和放大层来完成,其中,卷积层是该网络中唯一的一种层类型。
我们还要说明的是,全卷积结构使该网络的输入大小相互独立。也就是说,这意味着它与普通的分类卷积神经网络有所不同,你可以向完全卷积神经网络中输入任何大小的图像:无论输入图像原始大小是什么,网络都会输入一个输入图像大小2倍的图像。
有关图像超分辨率的RDN网络更加详细的介绍,请查看文末链接。
另一方面,我们还需要思考如何从图像中提取这些块。思路如下:从数据集中提取出n个随机图像,然后从每个图像中提取p个随机快。我们尝试了几种方法,如下图所示:
提取块的不同方法
首先,从一个均匀的网格中提出块,并创建一个完整的块数据集。在训练的时候,我们随机的提取其batch_size,并对其进行放大,反馈给网络。这种方法的缺点是需要静态的存储非常大的数据集,如果要用云服务器进行训练,这种方法其实并不理想:移动和提取数据集是一项相当耗时的操作,并且具有确定性定义的数据集可能并不是最佳数据集。
另一种方法是随机选择batch_size大小的图像,并从中提取单个块。这种方法需要从磁盘中读取数据,这就大大降低了训练时间(我们设置的每个训练时间为15min-1h)。
最后,我们将原始数据集中随机提取的单个图像块进行融合,并从中提取动态的batch_size块,这不仅能存储原始数据集,同时,也能保持较快的训练速度。
拓展
这是放大idealo网站产品目录的第一步,我们已经完成了。
下面是我们将产品图像中低质量、低分辨率的图像进行放大,并输出。
凉鞋的低分辨率图像
凉鞋的放大图像
从上图中,我们可以看到,图像中较为平坦的地方会产生较为明显的噪声,文本也会略有失真。这就是我们计划要改进的地方。
在下一步的探索中,我们将在自己的产品图像数据集上对神经网络进行训练。
相关链接
Github: Image Super Resolution
Paper: Residual Dense Network for Image Super-Resolution (Zhang et al. 2018)
Dataset: DIVerse 2K resolution high quality images
原文链接
人工智能
2018-12-10 13:13:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
取数据 arr = np.arange(15).reshape(3,5) arr #array([[ 0, 1, 2, 3, 4], # [ 5, 6, 7, 8, 9], # [10, 11, 12, 13, 14]])
规则 下面的操作,都是沿第一维度。这里的第一个维度,就是上述reshape(3,5)中的“3”,如果是reshape(2,3,5),那么第一维度就是2。 下面的“:”,表示从“:”前开始,到“:”后结束。
[1,1] a[1,1] #6
[:] arr[0:1] 从第0行开始,取到第1行。 #array([[0, 1, 2, 3, 4]])
[:,:] a[1:,:] #array([[ 5, 6, 7, 8, 9], # [10, 11, 12, 13, 14]])
水平合并数组 import numpy as np a = [1,2,3] b = [4,5,6] np.hstack((a,b)) # array([1, 2, 3, 4, 5, 6]) c = [a,['a','b','c']] d = [b,['d','e','f']] np.hstack((c,d)) #array([['1', '2', '3', '4', '5', '6'], # ['a', 'b', 'c', 'd', 'e', 'f']], dtype='shuffle
沿第一个轴shuffle。 arr1 = np.arange(15).reshape(3,5) print(arr1) #array([[ 0, 1, 2, 3, 4], # [ 5, 6, 7, 8, 9], # [10, 11, 12, 13, 14]]) np.random.shuffle(arr1) arr1 #array([[10, 11, 12, 13, 14], # [ 5, 6, 7, 8, 9], # [ 0, 1, 2, 3, 4]])
人工智能
2018-12-10 12:06:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
Dropout正则化是最简单的神经网络正则化方法。其原理非常简单粗暴:任意丢弃神经网络层中的输入,该层可以是数据样本中的输入变量或来自先前层的激活。它能够模拟具有大量不同网络结构的神经网络,并且反过来使网络中的节点更具有鲁棒性。
阅读完本文,你就学会了在Keras框架中,如何将深度学习神经网络Dropout正则化添加到深度学习神经网络模型里,具体内容如下:如何使用Keras API创建Dropout层;如何使用Keras API将Dropout正则化添加到MLP、CNN和RNN层;在现有模型中,如何使用Dropout正则化减少过拟合。
Keras 中的 Dopout 正则化
在Keras深度学习框架中,我们可以使用Dopout正则化,其最简单的Dopout形式是Dropout核心层。
在创建Dopout正则化时,可以将 dropout rate的设为某一固定值,当dropout rate=0.8时,实际上,保留概率为0.2。下面的例子中,dropout rate=0.5。 layer = Dropout(0.5)
Dropout层
将Dropout层添加到模型的现有层和之前的输出层之间,神经网络将这些输出反馈到后续层中。用dense()方法指定两个全连接网络层: ... model.append(Dense(32)) model.append(Dense(32)) ...
在这两层中间插入一个dropout层,这样一来,第一层的输出将对第二层实现Dropout正则化,后续层与此类似。现在,我们对第二层实现了Dropout正则化。 ... model.append(Dense(32)) model.append(Dropout(0.5)) model.append(Dense(32)) ...
Dropout也可用于可见层,如神经网络的输入。在这种情况下,就要把Dropout层作为网络的第一层,并将input_shape参数添加到层中,来制定预期输入。 ... model.add(Dropout(0.5, input_shape=(2,))) ...
下面,我们来看看Dropout正则化如何与常见的网络类型一起使用。
MLP Dropout 正则化
在两个全连接层之间添加Dropout正则化,代码如下所示: # example of dropout between fully connected layers from keras.layers import Dense from keras.layers import Dropout ... model.add(Dense(32)) model.add(Dropout(0.5)) model.add(Dense(1)) ...
CNN Dropout正则化
我们可以在卷积层和池化层后使用Dropout正则化。一般来说,Dropout仅在池化层后使用。 # example of dropout for a CNN from keras.layers import Dense from keras.layers import Conv2D from keras.layers import MaxPooling2D from keras.layers import Dropout ... model.add(Conv2D(32, (3,3))) model.add(Conv2D(32, (3,3))) model.add(MaxPooling2D()) model.add(Dropout(0.5)) model.add(Dense(1)) ...

在这种情况下,我们要将Dropout应用于特征图的每个单元中。
在卷积神经网络中使用Dropout正则化的另一个方法是,将卷积层中的整个特征图都丢弃,然后在池化期间也不再使用。这种方法称为空间丢弃,即Spatial Dropout。
“我们创建了一个新的Dropout正则化方法,我们将其称为Spatial Dropout。在这个方法中,我们将Dropout值扩展到整个特征映射中。”
——《 使用卷积神经网络有效的进行对象本地化 ,2015》
在Keras中,通过SpatialDropout2D层提供Spatial Dropout正则化。 # example of spatial dropout for a CNN from keras.layers import Dense from keras.layers import Conv2D from keras.layers import MaxPooling2D from keras.layers import SpatialDropout2D ... model.add(Conv2D(32, (3,3))) model.add(Conv2D(32, (3,3))) model.add(SpatialDropout2D(0.5)) model.add(MaxPooling2D()) model.add(Dense(1)) ...
RNN Dropout正则化
我们在LSTM循环层和全连接层之间使用Dropout正则化,代码如下所示: # example of dropout between LSTM and fully connected layers from keras.layers import Dense from keras.layers import LSTM from keras.layers import Dropout ... model.add(LSTM(32)) model.add(Dropout(0.5)) model.add(Dense(1)) ...
在这里,将Dropout应用于LSTM层的32个输出中,这样,LSTM层就作为全连接层的输入。
还有一种方法可以将Dropout与LSTM之类的循环层一起使用。LSTM可以将相同的Dropout掩码用于所有的输入中。这个方法也可用于跨样本时间步长的循环输入连接。这种使用递归模型进行Dropout正则化则称为变分循环神经网络(Variational RNN)。
“变分循环神经网络在每个时间步长使用相同的Dropout掩码,包括循环层。这与在RNN中实现Dropout正则化一样,在每个时间步长丢弃相同的神经网络单元,并且随意的丢弃输入、输出和循环连接。这和现有的技术形成对比,在现有的技术中,不同的神经网络单元将在不同的时间步长被丢弃,并且不会对全连接层进行丢弃。”
——《 循环神经网络中Dropout的基础应用 ,2016》
Keras通过循环层上的两个参数来支持变分神经网络(输入和循环输入样本时间步长的一致性丢弃),这称为 输入“Dropout”和循环输入的“recurrent_dropout”。 # example of dropout between LSTM and fully connected layers from keras.layers import Dense from keras.layers import LSTM from keras.layers import Dropout ... model.add(LSTM(32)) model.add(Dropout(0.5)) model.add(Dense(1)) ...
Dropout正则化案例
在本节中,我们将演示如何使用Dropout正则化来减少MLP在简单二元分类问题上的过拟合。在这里,我们提供了一个在神经网络上应用Dropout正则化的模板,你也可以将其用于分类和回归问题。
二元分类问题
在这里,我们使用一个标准的二元分类问题,即定义两个二维同心圆,每个类为一个圆。
每个观测值都有两个输入变量,它们具有相同的比例,类输出值为0或1。这个数据集就是 “圆”数据集。
我们可以使用make_circles()方法生成观测结果。我们为数据添加噪声和随机数生成器,以防每次运行代码时使用相同的样本。 # generate 2d classification dataset X, y = make_circles(n_samples=100, noise=0.1, random_state=1)
我们可以用x和y坐标绘制一个数据集,并将观察到的颜色定义为类值。生成和绘制数据集的代码如下: # generate two circles dataset from sklearn.datasets import make_circles from matplotlib import pyplot from pandas import DataFrame # generate 2d classification dataset X, y = make_circles(n_samples=100, noise=0.1, random_state=1) # scatter plot, dots colored by class value df = DataFrame(dict(x=X[:,0], y=X[:,1], label=y)) colors = {0:'red', 1:'blue'} fig, ax = pyplot.subplots() grouped = df.groupby('label') for key, group in grouped: group.plot(ax=ax, kind='scatter', x='x', y='y', label=key, color=colors[key]) pyplot.show()
运行以上代码,会创建一个散点图,散点图展示每个类中观察到的同心圆形状。我们可以看到,因为噪声,圆圈并不明显。
这是一个特别好的测试问题,因为类不可能用一条直线表示,比如它不是线性可微分的,在这种情况下,就需要使用非线性方法来解决,比如神经网络。
在这里,我们只生成了100个样本,这对于神经网络来说,样本是相当少了。但是它提供了训练数据集的过拟合现象,并且在测试数据及上的误差更大:这是使用正则化的一个特别好的例子。除此之外,这个样本集中有噪声,这就使神经网络模型有机会学习不一致样本的各个方面。
多层感知器的过拟合
我们可以创建一个MLP模型来解决这个二元分类问题。
该模型将具有一个隐藏层,它的节点比解决该问题所需节点要多得多,从而产生过拟合。另外,我们训练模型的时间也大大超过正常训练模型所需要的时间。
在定义模型之前,我们将数据集拆分为训练集和测试集:30个训练数据来训练模型和70个测试数据来评估拟合模型性能。 # generate 2d classification dataset X, y = make_circles(n_samples=100, noise=0.1, random_state=1) # split into train and test n_train = 30 trainX, testX = X[:n_train, :], X[n_train:, :] trainy, testy = y[:n_train], y[n_train:]
接下来,我们可以定义模型。
在隐藏层中使用500个节点和矫正过得线性激活函数;在输出层中使用S型激活函数预测类的值(0或1)。
该模型使用二元交叉熵损失函数进行优化,这个函数适用于二元分类问题和梯度下降到有效Adam问题。 # define model model = Sequential() model.add(Dense(500, input_dim=2, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
将训练数据训练4000次,默认每次训练次数为32。 然后用测试数据集验证该模型性能,代码如下。 # fit model history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4000, verbose=0)
测试的方法如下。 # evaluate the model _, train_acc = model.evaluate(trainX, trainy, verbose=0) _, test_acc = model.evaluate(testX, testy, verbose=0) print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))

最后,在每次训练的时候绘制模型的性能。
如果模型在训练数据集时的确是过拟合,那么我们训练集上的准确度线图更加准确,并且准确度随着模型学习训练数据集中的统计噪声而再次下降。 # plot history pyplot.plot(history.history['acc'], label='train') pyplot.plot(history.history['val_acc'], label='test') pyplot.legend() pyplot.show()
将以上所有代码组合起来,如下所示。 # mlp overfit on the two circles dataset from sklearn.datasets import make_circles from keras.layers import Dense from keras.models import Sequential from matplotlib import pyplot # generate 2d classification dataset X, y = make_circles(n_samples=100, noise=0.1, random_state=1) # split into train and test n_train = 30 trainX, testX = X[:n_train, :], X[n_train:, :] trainy, testy = y[:n_train], y[n_train:] # define model model = Sequential() model.add(Dense(500, input_dim=2, activation='relu')) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # fit model history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4000, verbose=0) # evaluate the model _, train_acc = model.evaluate(trainX, trainy, verbose=0) _, test_acc = model.evaluate(testX, testy, verbose=0) print('Train: %.3f, Test: %.3f' % (train_acc, test_acc)) # plot history pyplot.plot(history.history['acc'], label='train') pyplot.plot(history.history['val_acc'], label='test') pyplot.legend() pyplot.show()
运行以上代码,我们可以看到模型在训练和测试数据集上的性能:模型在训练数据集上的性能优于测试数据集,这是过度拟合的一个可能标志。
鉴于神经网络和训练算法的随机性,模型的测试结果可能会有所不同。由于该模型严重过拟合,该模型在同一数据集上运行的结果差异并不会很大。 Train: 1.000, Test: 0.757
下图为模型在训练和测试集上的精度图,我们可以看到过拟合模型的预期性能,其中测试精度增加到一定值以后,再次开始减小。
使用Dropout正则化减少MLP过拟合
我们使用Dropout正则化更新这个示例,即在隐藏层和输出层之间插入一个新的Dropout层来实现。在这里,指定Dropout rate=0.4。 # define model model = Sequential() model.add(Dense(500, input_dim=2, activation='relu')) model.add(Dropout(0.4)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
下面列出了隐藏层后添加了dropout层的完整更新示例。 # mlp with dropout on the two circles dataset from sklearn.datasets import make_circles from keras.models import Sequential from keras.layers import Dense from keras.layers import Dropout from matplotlib import pyplot # generate 2d classification dataset X, y = make_circles(n_samples=100, noise=0.1, random_state=1) # split into train and test n_train = 30 trainX, testX = X[:n_train, :], X[n_train:, :] trainy, testy = y[:n_train], y[n_train:] # define model model = Sequential() model.add(Dense(500, input_dim=2, activation='relu')) model.add(Dropout(0.4)) model.add(Dense(1, activation='sigmoid')) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # fit model history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4000, verbose=0) # evaluate the model _, train_acc = model.evaluate(trainX, trainy, verbose=0) _, test_acc = model.evaluate(testX, testy, verbose=0) print('Train: %.3f, Test: %.3f' % (train_acc, test_acc)) # plot history pyplot.plot(history.history['acc'], label='train') pyplot.plot(history.history['val_acc'], label='test') pyplot.legend() pyplot.show()
运行以上代码,查看模型在训练和测试集上的性能。你所得到的结果可能会有所不同,在这种情况下,该模型具有较高的方差。在这里,我们可以看到,Dropout导致训练集的准确度有所下降,从100%降至96%,而测试集的准确度从75%提高到81%。 Train: 0.967, Test: 0.814
从这里我们可以看出,该模型已经不再适合训练数据集了。
尽管使用Dropout正则化时会产生很多噪音,训练数据集和测试数据集的模型精度持续增加。
在后续学习中,你可以进一步探索以下这些问题:
1.输入Dropout。在输入变量上使用Dropout正则化,更新示例,并比较结果。
2.权重约束。在隐藏层添加max-norm权重约束,更新示例,并比较结果。
3.反复评估。更新示例,重复评估过拟合和Dropout模型,总结并比较平均结果。
4.网格搜索率。创建Dropout概率的网格搜索,并报告Dropout rate和测试数据集准确度二者之间的关系。
拓展阅读
论文
1.《 使用卷积神经网络进行高效的对象本地化 ,2015》
2.《 递归神经网络中的理论Dropout应用 ,2016》
博文
1. 基于Keras深度学习模型中的Dropout正则化
2. 如何使用LSTM网络的Dropout进行时间序列预测
API
1. Keras Regularizers API
2. Keras Core Layers API
3. Keras Convolutional Layers API
4. Keras Recurrent Layers API
5. sklearn.datasets.make_circles API
总结
阅读完本文,你已经了解了如何将深度学习正则化添加到深度学习神经网络模型的API中。具体来说,有以下几个内容:
1.如何使用Keras API创建Dropout层。
2.如何使用Keras API将Dropout正则化添加到MLP、CNN和RNN层。
3.如何向现有模型中添加Dropout正则化,以此减少过拟合。
原文链接
人工智能
2018-12-10 11:08:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
HanLP的一个很大的好处是离线开源工具包,换而言之,它不仅提供免费的代码免费下载,而且将辛苦收集的词典也对外公开啦,此诚乃一大无私之举.我在安装的时候,主要参照这份博客:
blog.csdn.net/article/details?id=50938796
不过该博客主要介绍的是windows如何使用hanlp,而ubuntu是linux的,所以会有所区别.下面我主要介绍的是在unbuntu的安装使用.
安装eclipse
在终端输入 sudo get-apt install eclipse-platform实现一键安装,然后在应用程序找到eclipse
下载hanlp
 访问hanlp的官方网址:(http://方位是自行加上)hanlp.linrunsoft.com/services.html
分别下载hanlp.jar(程序包), data.zip(词典库),hanlp.properties(配置文件),而后面是说明文档,可以不下载
 在下载的data.zip的时候,下载链接有点隐晦,点击蓝色的data-for-1.2.11.zip,就会出现百度云链接啦
导入jar包
导入hanlp到eclipse之中,具体的流程可以参照网址:
jingyan.baidu.com/article/ca41422fc76c4a1eae99ed9f.html

导入配置文件
将hanlp.propertie复制至项目的bin目录中,修改词典的路径
将root的路径修改至data保存的路径(记得data要解压)
编程代码示范
运行结果:

作者: Quincy1994
人工智能
2018-12-10 09:52:00
「深度学习福利」大神带你进阶工程师,立即查看>>> CNN卷积神经网络原理讲解+图片识别应用(附源码) 笨方法学习CNN图像识别系列 深度学习图像识别项目(中):Keras和卷积神经网络(CNN) 卷积神经网络模型部署到移动设备 使用CNN神经网络进行图片识别分类 DeepLearning tutorial(5)CNN卷积神经网络应用于人脸识别(详细流程+代码实现) 使用RNN进行图像分类 如何利用CNN&RNN进行活动识别(附源码) RNN入门(二)识别验证码 计算机视觉中 RNN 应用于目标检测 深度学习之循环神经网络RNN概述,双向LSTM实现字符识别 RNN识别MNIST手写数据(TensorFlow)
NLP 语义识别
Word2vector: 机器学习必须熟悉的算法之word2vector(一)
[TF-IDF及其算法 ] ( https://blog.csdn.net/sofuzi/article/details/80340861 )
10分钟搞懂蚁群算法蚁群算法的应用——负载均衡调
人工智能
2018-12-09 23:43:05
「深度学习福利」大神带你进阶工程师,立即查看>>>
生产计划问题








不确定性的采购问题


人工智能
2018-12-09 22:21:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
def saveAsNewAPIHadoopFile(
path: String,
keyClass: Class[_],
valueClass: Class[_],
outputFormatClass: Class[_ <: NewOutputFormat[_, _]],
conf: Configuration = self.context.hadoopConfiguration): Unit = self.withScope {
// Rename this as hadoopConf internally to avoid shadowing (see SPARK-2038).
val hadoopConf = conf
val job = NewAPIHadoopJob.getInstance(hadoopConf)
job.setOutputKeyClass(keyClass)
job.setOutputValueClass(valueClass)
job.setOutputFormatClass(outputFormatClass)
val jobConfiguration = job.getConfiguration
jobConfiguration.set("mapreduce.output.fileoutputformat.outputdir", path)
saveAsNewAPIHadoopDataset(jobConfiguration)
}
人工智能
2018-12-08 12:36:00
「深度学习福利」大神带你进阶工程师,立即查看>>>

确定初始基可行解



最优解的判别




改进的方法———闭回路调整法

表上作业法计算中的问题

人工智能
2018-12-07 22:20:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
起作用约束和可行下降方向的概念

库恩 - 塔克条件

人工智能
2018-12-08 19:48:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
梯度法(最速下降法)




共轭梯度法








变尺度法





步长加速法


人工智能
2018-12-08 19:47:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
斐波那契(Fibonacci)法(分数法)




0 .618 法(黄金分割法)
人工智能
2018-12-08 19:47:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
引言



极值问题



凸函数和凹函数





凸规则

下降迭代算法


人工智能
2018-12-08 19:47:00
「深度学习福利」大神带你进阶工程师,立即查看>>>

0 - 1 型整数规划的解法


人工智能
2018-12-08 19:46:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
人工变量法




退化
检验数的几种表示形式
单纯形法小结
人工智能
2018-12-07 22:18:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
单纯形表

计算步骤


人工智能
2018-12-07 22:18:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
举例




初始基可行解的确定

最优性检验与解的判别


基变换


迭代(旋转运算)


人工智能
2018-12-07 22:15:05
「深度学习福利」大神带你进阶工程师,立即查看>>>
基本概念


几个定理


人工智能
2018-12-07 22:15:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
问题的提出


图解法

线性规划问题的标准型式



线性规划问题的解的概念
人工智能
2018-12-07 22:15:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
我们在上文 小白机器学习基础算法学习必经之路(上) 简述了线性回归 (Linear Regression) ,逻辑回归 (Logistic Regression) ,决策树 (Decision Tree) ,支持向量机(SVM) ,朴素贝叶斯 (Naive Bayes) 现在我们接着继续学习另五个算法:

K邻近算法(KNN)
k-NN算法是最简单的分类算法,主要的思想是计算待分类样本与训练样本之间的差异性,并将差异按照由小到大排序,选出前面K个差异最小的类别,并统计在K个中类别出现次数最多的类别为最相似的类,最终将待分类样本分到最相似的训练样本的类中。与投票(Vote)的机制类似。

k-近邻算法是基于实例的学习,使用算法时我们必须有接近实际数据的训练样本数据。 优点:精度高,对异常值不敏感,无数据输入假定 缺点:时间和空间复杂度高,无法获取样本特征 数据:数值型和标称型

k-均值算法(K-means)
KMeans算法是典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且**的簇作为最终目标。

K个初始聚类中心点的选取对聚类结果具有较大的影响,因为在该算法第一步中是随机地选取任意k个对象作为初始聚类中心,初始地代表一个簇。该算法在每次迭代中对数据集中剩余的每个对象,根据其与各个簇中心的距离赋给最近的簇。当考查完所有数据对象后,一次迭代运算完成,新的聚类中心被计算出来。

基本步骤 (1) 从 n个数据对象任意选择 k 个对象作为初始聚类中心;
(2) 根据每个聚类对象的均值(中心对象),计算每个对象与这些中心对象的距离;并根据最小距离重新对相应对象进行划分;
(3) 重新计算每个(有变化)聚类的均值(中心对象);
(4) 计算标准测度函数,当满足一定条件,如函数收敛时,则算法终止;如果条件不满足则回到步骤(2)。

随机森林 (Random Forest)
随机森林是指利用多棵决策树对样本进行训练并预测的一种算法。也就是说随机森林算法是一个包含多个决策树的算法,其输出的类别是由个别决策树输出的类别的众树来决定的。在Sklearn模块库中,与随机森林算法相关的函数都位于集成算法模块ensemble中,相关的算法函数包括随机森林算法(RandomForestClassifier)、袋装算法(BaggingClassifier)、完全随机树算法(ExtraTreesClassifier)、迭代算法(Adaboost)、GBT梯度Boosting树算法(GradientBoostingClassifier)、梯度回归算法(GradientBoostingRegressor)、投票算法(VotingClassifier)。
随机森林的特点 它有如下几个特点: 在当前所有算法中,具有极好的准确率 能够有效地运行在大数据集上 能够处理具有高维特征的输入样本,而且不需要降维 能够评估各个特征在分类问题上的重要性 在生成过程中,能够获取到内部生成误差的一种无偏估计 对于缺省值问题也能够获得很好得结果

实际上,随机森林的特点不只有这六点,它就相当于机器学习领域的Leatherman(多面手),你几乎可以把任何东西扔进去,它基本上都是可供使用的。在估计推断映射方面特别好用,以致都不需要像SVM那样做很多参数的调试。

GradientBoost和Adaboost算法
AdaBoost分类器就是一种元算法分类器,adaBoost分类器利用同一种基分类器(弱分类器),基于分类器的错误率分配不同的权重参数,最后累加加权的预测结果作为输出。

adaboost算法的一些实际可以使用的场景:
1)用于二分类或多分类的应用场景
2)用于做分类任务的baseline无脑化,简单,不会overfitting,不用调分类器
3)用于特征选择(feature selection)
4)Boosting框架用于对badcase的修正

只需要增加新的分类器,不需要变动原有分类器

由于adaboost算法是一种实现简单,应用也很简单的算法。Adaboost算法通过组合弱分类器而得到强分类器,同时具有分类错误率上界随着训练增加而稳定下降,不会过拟合等的性质,应该说是一种很适合于在各种分类场景下应用的算法。

GradientBoost算法
和Adaboost不同,Gradient Boosting 在迭代的时候选择梯度下降的方向来保证最后的结果最好。损失函数用来描述模型的“靠谱”程度,假设模型没有过拟合,损失函数越大,模型的错误率越高如果我们的模型能够让损失函数持续的下降,则说明我们的模型在不停的改进,而最好的方式就是让损失函数在其梯度方向上下降。

下面这个流程图是Gradient Boosting的经典图了,数学推导并不复杂,只要理解了Boosting的思想,不难看懂
这里是直接对模型的函数进行更新,利用了参数可加性推广到函数空间。训练F0-Fm一共m个基学习器,沿着梯度下降的方向不断更新ρm和am。
完.......
人工智能
2018-12-07 16:20:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
注:因为很喜欢一个博文,就把它部分翻译过来,原作者网名叫NSS。他的这篇博文的名字是: “An Intuitive Understanding of Word Embeddings: From Count Vectors to Word2Vec”. 原网址如下: https://www.analyticsvidhya.com/blog/2017/06/word-embeddings-count-word2veec/
注:这里只捡自己喜欢的部分写出来。
1 什么是Word Embeddings
我们知道计算机不认识字符串,所以我们需要将文字转换为数字。Word Embedding就是来完成这样的工作。 定义:A Word Embedding format generally tries to map a word using a dictionary to a vector。
2 Word Embeddings们
既然我们用向量来表示一个词或词语,那么这种表示一定不止有一种方式,所以在这里总结一下不同的表示。
2.1 Frequency based Embedding
在这个分类下有三个小分类. Count Vector TF-IDF Vector(不翻译,略过) Co-Occurrence Vector(不翻译,略过)
2.1.1 Count Vector
我们先举一个例子。先观察以下两句话,D1: He is a lazy boy. She is also lazy. D2: Neeraj is a lazy person. 这两句话一共有6个不同的单词,我们按照如下的方式来分下一下这6个单词在这两句话中的分布情况:
Fig 0.
这张表中的数字表示某个单词在某个句子中出现的次数,比如He在D1中出现1词,在D2中出现0词,如此等等。这时我们就可以看到He这个单词可以形成一个向量,[1,0],向量中的每个元素代表这个单词出现在某句话中的次数。
2.2 Prediction based Vector
2.2.1 CBOW (Continuous Bag of words)
CBOW这个模型是给定一个context的条件下,预测在该context下出现某个词的概率。假设我们有一句话:“I like Julia”,我们把context window设置为1,也就是我们只考虑一个词的前一个词或后一个词,然后这句话可以转换成Fig 1中的形式。右侧的矩阵是Input的unicode.
Fig 1. 注:原图太复杂,在这里我用了一个简单的例子。
这些数据点被传递给一个神经网络,如图Fig 2所示,输出层是一个softmax层,用来计算概率。流程是: 输入被映射到一个低维的向量,比如如Fig 3所示。得到这个二维向量后,再用一个矩阵将它转换成一个三维矩阵,这个三维矩阵经过softmax后就是我们的output。经过优化后得到的向量就是我们所求的向量。
Fig 2.
Fig 3.
注:这里的基本的思想是,一个词=它所处的环境(没有看出,这里的=是等于号)。恩,好有哲理的一句话。比如我们要判断某个人属于哪一个阶级,只需要看他的朋友圈就可以知道。比如在我们的例子中,当给我们一个context的时候,比如‘I’,那么这个context对应一个单词“like”。在这里我们的windows设置为1,也就是仅仅考虑一个词的前后词,当我们将windows设置为2的时候,Julia的context就变成了I和like,这个时候的Input就成了两个向量,也就是I向量和like向量,这两个向量分别经过W和W`两个矩阵的作用,得到两个vector,这个时候取这两个向量的平均值就是得到我们的output vector,最后经过softmax变换就可以得到最后的结果。如图Fig4所示。
Fig 4.

2.2.2 Skip – Gram model
这个方法正好和上边的方法相反,当给定我们一个word的时候,我们用这种方法来计算它的context。如Fig 5.2所示。比如我们有句话: ”Hey, this is sample corpus using only one context word.” 让我们构建training data:
Fig 5.

Fig 5.2
因为我们定义了context window=1,也就是该词的前后应该分别对应一个词,如Fig 5所示。
注意的是,在这里我们有两个输出,分别对应前后两个词。计算流程如Fig6-Fig 8所示.
Fig 6.

Fig 7.
Fig 8.
人工智能
2018-12-07 15:39:00
「深度学习福利」大神带你进阶工程师,立即查看>>>

中文分词
中文分词中有众多分词工具,如结巴、hanlp、盘古分词器、庖丁解牛分词等;其中庖丁解牛分词仅仅支持java,分词是HanLP最基础的功能,HanLP实现了许多种分词算法,每个分词器都支持特定的配置。接下来我将介绍如何配置Hanlp来开启自然语言处理之旅,每个工具包都是一个非常强大的算法集合,所以小编以后将花一些时间去看看里面源码如何。
下载jar、property和data文件
下载jar文件,(下载hanlp压缩包)解压之后获得jar和property文件如下:
其中property问配置文件,jar文件为外部引用文件。
然后下载data文件:
【https://】pan.baidu.com/s/1o8Rri0y (前面的括号自行去掉)
解压压缩包之后就能获取data目录了。
一切就绪之后下面就是配置了。
配置hanlp
新建一个空项目,包括一个新建的java文件的test.java,
1.package com;
2.import com.hankcs.hanlp.HanLP;
3.public class Test {
4.public static void main(String[] args) {
5. System.out.println(HanLP.segment("你好,欢迎使用HanLP!"));
6. }
7.}
目录结构如下图:
如果是在linux中的话,你可以将property文件放在classpath中,windows中也可以,配置环境变量,将property文件的绝对路径加上就可以了,然后运行一下这个java文件:
你会发现如下错误

1.十二月 11, 2017 9:59:37 下午 com.hankcs.hanlp.HanLP$Config
2.严重: 没有找到hanlp.properties,可能会导致找不到data
3.========Tips========
4.请将hanlp.properties放在下列目录:
5.D:\ ideaWorkSpace\ hanlp_mavenHanlp\ target\classes
6.Web项目则请放到下列目录:
7.Webapp/WEB-INF/lib
8.Webapp/WEB-INF/classes
9.Appserver/lib
10.JRE/lib
11.并且编辑root=PARENT/path/to/your/data

然后将property放到相应的目录就可以了,注意property配置只需要修改root的配置就行了。

1.本配置文件中的路径的根目录,根目录+其他路径=绝对路径Windows用户请注意,路径分隔符统一使用/
2.root=D:/ideaWorkSpace/hanlp_mavenHanlp/src/main/java

就比如我的解压后的data文件夹是放在D:/ideaWorkSpace/hanlp_mavenHanlp/src/main/java目录下的那我就改这个就可以了,其余的配置不用修改

运行成功如下图:
---------------------
作者:学zaza
人工智能
2018-12-07 10:15:00
「深度学习福利」大神带你进阶工程师,立即查看>>>
参数 c的变化


参数 b的变化分析

人工智能
2018-12-07 22:20:00