读书笔记(二):深度学习基于Keras的Python实践

人工神经网络称为神经网络或多层感知器

多层感知器也许是最有用的神经网络类型,用于解决分类与回归问题,多层感知器是一种前馈人工神经网络模型,将输入的多个数据维度映射到单一的输出数据维度上

神经网络的学习过程,是在其所处环境的激励下,相继给网络输入一些样本,并按照一定的规则(学习算法)调整网络各层的权值矩阵,待网络各层权值都收敛到一定程度,学习过程结束

  • 神经元权重
    线性回归种输入的权重与回归方程种使用的系数非常相似,每个神经元也有一个偏差,偏差是改善学习速度和预防过拟合的有效方法。权重通常被初始化为小的随机值,例如0到0.3范围内的值,与线性回归一样,较大的权重表示模型的复杂性和脆弱性的增加,小随即苏初始化权重初始值要接近0
  • 神经网络
    设计神经网络时,输入层与输出层的节点数往往是固定的,中间层可以自由指定。神经网络结构图中的拓扑与箭头代表预测过程中数据的流向,和训练时数据流向有一定区别

Keras各种layer的作用及用法

  • Maxpooling layer
    池化层是基于采样的离散过程(sample-based discretization process)。听起来好复杂的样子,简单来说,即对input进行采样,降低input的维度,减少了参数(简化了计算),增强了模型的泛化能力,也降低了overfitting的可能性
  • Flatten layer & Dense layer
    Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到(Convolution)全连接层(Dense)的过渡。Convolution卷积层之后是无法直接连接Dense全连接层的,需要把Convolution层的数据压平(Flatten),然后就可以直接加Dense层了。上面code最后一行, Dense(32)表示output的shape为(*,32)。当Dense作为第一层时,需要specify输入的维度,之后就不用了
  • Dropout layer
    如dropout的名字,就是要随机扔掉当前层一些weight,相当于废弃了一部分Neurons它还有另一个名字 dropout regularization, 所以你应该知道它有什么作用了:降低模型复杂度,增强模型的泛化能力,防止过拟合,顺带降低了运算量
    Keras各种layer的作用及用法

深度学习模型和评估

在设计和配置深度学习模型时,面临很多选择,如网络的层数、大小和类型,以及损失函数的选择等。由于深度学习具有数据量大和模型复杂的特征,因此需要花费很长时间进行训练,在评估模型时候,将数据简单的分离成训练数据集和评估数据集,Keras提供了两种评估深度学习模型的方法:自动评估和手动评估

自动评估

Keras将数据集的一部分分成评估数据集,在每个epoch中使用该数据集对模型进行评估,可以通过将fit()函数的验证分割参数设置为数据集大小的百分比来实现

手动评估

Keras允许手动指定在训练期间进行验证的数据集,例子中,使用scikit机器学习库的train_test_split()函数将数据分成训练数据集和评估数据集,使用80%数据进行训练,剩余20%用于评估,评估数据集可以通过评估数据参数传递给Keras中的fit()函数,需要一个输入和输出数据集的元组

k折交叉验证

机器学习模型评估的黄金标准是k折交叉验证,提供了模型对未知数据性能的可靠估计,k折交叉验证的过程是将数据集分为k个子集,选择其中一个子集作为评估数据集,利用剩余的k-1个子集训练模型,并用预留的子集对模型进行评估,重复该过程,直到所有子集被赋予作为被评估数据集的机会,采用K个模型评估结果的平均值作为模型最终的评估结果

例子:将使用Scikit-Leam机器学习库中的StratifiedKFold类将数据集分成 10个子集.StratifiedKFold 是盯old 的变体, StratifiedKFold 通过算法来平衡每个子集 中每个类的实例数。该示例使用 StratifiedKFold 将数据分割成 10 个子集, 并利用这 10 个子集创建和评估 10 个模型,且收集这 10 个模型的评估得分。 通过设置 verbose 为 0 来关闭模型的fir()和 evaluate()函数的详细输出,在每个模型构建完成后,进行评估并输出评估结果; 在所有模型评估完成后,输出模型得分的均值和标准差,以提供对模型精 度的鲁棒性的估计

from keras.models import Sequential
from keras.layers import Dense
import numpy as np
from sklearn.model_selection import StratifiedKFold
np.random.seed(7)

#导入数据
dataset = np.loadtxt('./pima-indians-diabetes.csv',delimiter=',')
#分割输入变量x和输出变量y
x = dataset[:,0:8]
y = dataset[:,8]

kfold = StratifiedKFold(n_splits=10,random_state=7,shuffle=True)
cvscores = []

for train,validation in kfold.split(x,y):
    #创建模型
    model  = Sequential()
    model.add(Dense(12,input_dim=8,activation = 'relu'))
    model.add(Dense(8,activation='relu'))
    model.add(Dense(1,activation='sigmoid'))
    
    #编译模型
    model.compile(loss = 'binary_crossentropy',optimizer = 'adam',metrics=['accuracy'])
    
    #训练模型
    model.fit(x[train],y[train],epochs=150,batch_size = 10,verbose=0)
    
    #评估模型
    scores = model.evaluate(x[validation],y[validation],verbose=0)
    
    #输出评估结果
    print('%s:%.2f%%' % (model.metrics_names[1],scores[1] * 100))
    cvscores.append(scores[1] * 100)

print('%.2f%% (+/- %.2f%%)' % (np.mean(cvscores),np.std(cvscores)))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值