您的位置:首页 > 理论基础 > 计算机网络

深度学习初步(一)——colab和简单的二分类神经网络

2019-05-27 19:32 525 查看
版权声明:Made by Asen Wang https://blog.csdn.net/weixin_43870742/article/details/90610193

最近在参加腾讯的广告算法大赛,用了些许规则狗到了一点点分数,但是想继续提升估计还是要使用神经网络模型呀。作为一个不入流的小白,只是对深度学习有过浅层次的理解,曾经尝试过tensorflow和pytorch框架来加深自己对于深度学习的认知,奈何一方面资质不够,一方面也有别的事情要做,都只学了个大概,正好借着这次机会尝试一下使用新的框架来系统的学习一下深度学习。

tensoflow和pytorch都曾学习过,18年底刚开始接触深度学习,正好手头有一本tensorflow的书,于是从头开始看起,由于彼时Python code level有限,啃tensorflow是相当吃力,但是这本书一定程度上让我对深度学习有了大致的认识。再拜深度学习已经是今年3月份了,在pytorch框架的基础上大致走了一遍代码,对很多不理解的数学知识也做了修修补补,很多东西联系之前tensorflow框架内的知识也渐渐有了清晰的认识。然而!可能是pytorch风评太好而自己水平太差,即便有了一定的数学基础,还是觉得这个框架设计的有些繁琐。果然还是keras这种傻瓜式框架适合我,当然也不排除使用过tf和pytorch后对keras上手较快的影响。

为啥说keras对于我这种弱智比较友好呢?首先是keras隐藏了很多的内部计算,代码量十分清晰明了。其次keras其实是对tf或者theano等框架的高级封装,因此也会存在在日后研究时对于解决复杂工程的无力感(据说?我也不知道,我又没学到复杂工程)。因此很多人都觉得把keras拿来入门是一个很好的选择。因此从今天开始的深度学习初步系列其实是基于python和keras的简单入门,如果你也有一定的数学功底,一定的代码功底,但是对于深度学习一知半解,欢迎一起学习。

进入正题,很基础的知识,如张量,梯度,分类,回归,卷积之类的我就不多啰嗦了,本文主要阐述一个十分基础的神经网络,用来解决二分类问题(不是mnist哦!!)。

在正式讲述之前,允许我推荐给大家一个神器,这就是谷歌爸爸推出的python IDE,“Colabrotary”,基于Jupyter Notebook的设计方式和哲学,在此基础上还会提供你免费的GPU硬件资源,最新提供GPU的是去年秋季发布的Tesla T4。啥都不说了,都在图里(还要啥自行车)。

!/opt/bin/nvidia-smi   #运行代码查看Tesla T4


Colabrotary有什么好处呢,很简单的是你所需要的大部分环境他已经帮你配置好,不需要你再去使用pip指令去安装,同时Jupeter Notebook所拥有的功能他自然也都继承了。要说缺点的话,除去与外部文件的读写需要配置之外,最明显的就是他需要谷歌账号和谷歌网盘账号。并且只有在谷歌网盘中添加“Colabrotory”扩展才可以使用,如下图:

##二分类问题
二分类问题字面上是很好理解的,不过多解释,直接上代码:

!pip install numpy==1.16.2 #见下方解释
import numpy as np
from keras.datasets import imdb    #加载imdb数据集,包含50000条严重两极分化的评论
(train_data,train_labels),(test_data,test_labels) = imdb.load_data(num_words = 10000)   #train_data和test_data是由评论组成的列表,而labels则是由0,1组成的列表,分别代表负面和正面评价,即我们所谓的标签

为什么要安装numpy的1.16.2版本呢,据Stack Overflow上的大佬说,目前numpy的1.16.3版本在运行上述命令时会出现错误:

ValueError: Object arrays cannot be loaded when allow_pickle=False

据说git上还没有对这个错误的答复,目前我们只好先使用1.16.2的版本。注意安装完成后要重启GPU后端。

那么为什么要设置(num_words = 10000)呢,其实这个参数代表仅仅保留训练数据中10000个最长出现的单词,减少数据量便于我们第一次上手处理。

查看数据我们会发现:

train_data[0].shape    # 运行该指令是会报错的,因为train_data根本不是张量形式
AttributeError: 'list' object has no attribute 'shape'

len(train_data[0])    #运行该指令可以得到结果,说明这只是一个int类的列表
218

这就提醒我们数据的预处理很重要,向神经网络输入的必须是张量形式的数据,而不能是简单的一个列表。
那么怎么把一个列表转换成张量的形式呢,其实很简单,如在tensorflow中使用如下命令即可。

tf.convert_to_tensor()

但是在这儿我们何不尝试一下使用著名的one-hot编码。

import numpy as np
def one_hot_change (sequences,dimension = 10000):
results = np.zeros((len(sequences),dimension))   #创建一个(len(sequences),dimension)的零矩阵
for i, sequence in enumerate(sequences):
results[i,sequence] = 1     #把result[i]的索引设置为1
return results
x_train = one_hot_change(train_data)
x_test  = one_hot_change(test_data)
y_train = np.asarray(train_labels).astype('float32')
y_test  = np.asarray(test_labels).astype('float32')    #全部向量化

接下来开始搭建我们的网络吧,激活函数选择最常用的"relu",以及为了得到概率值方便使用的“sigmoid”。不理解的自己去搜索下激活函数吧。

from keras import models
from keras import layers
from keras import optimizers

model = models.Sequential()
model.add(layers.Dense(32,activation = 'relu',input_shape=(10000,)))
model.add(layers.Dense(8,activation = 'relu'))    #为什么只输入一个input_shape就可以呢,因为别的他会自动判断的
model.add(layers.Dense(1,activation = 'sigmoid'))    #二分类的最后一层一般使用sigmoid

#编译神经网络模型,优化器选择‘rmsprop’,损失函数使用‘binary_crossentropy’(中文咋翻译呀,直接记住这个单词吧,太常用了)
model.compile(optimizer = 'rmsprop', loss = 'binary_crossentropy', metrics = ['acc'])

x_val = x_train[:10000]                  #为了衡量有没有产生过拟合设计了验证集
partial_x_train = x_train[10000:]
y_val = y_train[:10000]
partial_y_train = y_train[10000:]

model.fit(partial_x_train,partial_y_train,epochs = 20,batch_size = 512,validation_data = (x_val,y_val))
#开始训练吧!一次学习学不好,epochs代表你学习多少轮,batch_size代表每批次处理的数量。(当然为什么要这么设置呢,这里面的学问是很深的,以后再聊)

正常的话可以看到如下图所示的训练过程,四个参数分别代表损失函数,准确率,验证集的损失函数,准确率。
可以看到尽管训练集已经做的足够好了(0.9947),但是过拟合现象导致验证集中还是出现了随着训练过程准确率下降的情况,甚至最高只有0.8890的准确率,没错罪魁祸首:过拟合,这也是深度学习最大的拦路虎。

你也可以使用如下指令去查看训练集数据的最终分类情况,0.99的结果表明这则数据很可能是正面评价噢!

model.predict(x_test)[1]
array([0.99999976], dtype=float32)

尽管本文作为深度学习入门文章介绍,但是一些基础数理知识和python知识并未介绍,但这些都是学好深度学习必须的,望读者自行了解。同是小白望相互交流共同进步,如有错误欢迎批评指正。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐