Keras

python编写的高级神经网络API,能够以TensorFlow,CNTK,或者Theano作为后端运行。

示例

Step1:定义模型

在这里插入图片描述

  • 在Keras首先创建模型容器:
model=sequential() #线性堆栈模型
  • 第一个隐藏层:
    • Dense(全连接层),输入维度28*28,该层拥有500个神经元
model.add(Dense(input_dim=28*28,output_dim=500))
model.add(activation('sigmoid'))
  • 第二个隐藏层:输入就是上层的输出不用再说明。
model.add(Dense(output_dim=500))
model.add(Activation('sigmoid'))
  • 输出层:
    输出层10个神经元
model.add(Dense(output_dim=10))
model.add(Activation('softmax'))

Step2:模型评估

在这里插入图片描述

模型评估:

model.compile(loss=('categorical crossentropy'),optimizer='adam',metrics=['accuracy'])
  • loss:定义损失函数(categorical crossentropy 多分类交叉熵)
  • optimizer:优化器
  • metrics:指标,(accuracy:直接显示预测正确样本数占总样本数的百分率)

Step3:最佳模型

3.1:Configuration(编译配置)

在这里插入图片描述

其他优化器备选:SGD, RMSprop, Adagrad, Adadelta, Adam, Adamax, Nadam。

3.2 寻找最优网络参数

在这里插入图片描述

model.fit(x_trian,y_trian,batch_size=100,nb_epoch=20)

Numpy是Python中 基础的科学计算库,Array(数组)是它最核心的数据结构。Numpy array在内存中是连续存放的,计算速度极快,非常适合处理成千上万张图片数据。

x_train:训练数据集
y_train:标签数据集
batch_size:批大小
nb_epoch:迭代轮数

mini bach的原理详解

在这里插入图片描述

做梯度下降和深度学习时,并不是最小化总损失,我们会将训练数据随机分成几个mini-batch。
步骤:

  • 随机初始化神经网络的参数
  • 先随机选择第一个batch出来,对选择出来的batch里面的总损失,计算偏微分,根据偏微分更新参数
  • 然后随机选择第二个batch出来,对选择出来的batch里面的总损失,计算偏微分,根据偏微分更新参数
  • 反复上述过程,直到将所有的batch统统过一次,一个epotch才算结束。

假设有100个batch,就将参数更新100次,也就是所有batch都遍历一遍才叫做一个epotch。

使用minibatch的原因:speed
在这里插入图片描述

batch越小意味着在一轮迭代中有更多的参数更新次数

  • 很大的batch_size会导致很差的表现(不能设置太大也不能设置太小)
    在这里插入图片描述

为什么批量梯度下降比随机梯度下降要快?因为计算机的平行计算(矩阵运算)会使计算速度快很多。

  • 随机梯度下降:两个矩阵x分开计算
  • mini batch:将两个x合并在一起,一起计算得到Z1Z^1Z1Z2Z^2Z2 ,对CPU来说上面的运算时间是下面运算时间的两倍。(用上mini batch和GPU的时候速度加快的原理,只用GPU没用。)

GPU:图形处理器(比CPU相比能够做大量数据的简单计算) minibatch:将数据打包给GPU一起处理

模型保存和使用

#case1:测试集正确率
score=model.evaluate(x_test,y_test)
print("Total loss on Testing Set:",score[0])
print("Accuracy of Testing Set:",score[1])
# case2:模型预测
result=model.predict(x_test)

例子:手写数据识别

创建网络

先立草稿,输入是28*28 向量,输出对应0~9,也就是10维。假设有两层隐藏层,每层有500个神经元。
在这里插入图片描述

#创建网络
model=Sequential()
#添加第一个隐藏层
model.add(Dense(input_dim=28*28,units=500,activation='relu'))
#添加第二个隐藏层
model.add(Dense(units=500,activation='relu'))
#输出层
model.add(Dense(units=10,activation='softmax'))
  • input_dim:输入维度
  • units:隐藏层的神经元

配置

定义损失函数,选择优化器(optimizer),评估指标metrics

model.compile(loss='categorical crossentropy',optimizer='adam',metrics=['accuracy'])

选择最好的方程

model.fix(x_train,y_train,batch_size=100,epochs=20)

开始使用梯度下降训练模型。此时:

  • x_train:二维数组,一个轴表示样本,另一个轴表示每个样本用多长的向量表示
  • y_train:二维数组,一个轴表示样本,另一个轴表示对应不同case的值。只有一个维度是为1,另外的维度为0。第N维为1就表示待识别的数字为1
    在这里插入图片描述

使用模型

存储和载入模型
官方文档:
http://keras.io/getting-started/faq/#how-can-i-save-a-keras-model

使用搭建的神经网络,对应不同的情景:

  • 评估:
score=model.evaluate(x_test,y_test)
print('Total loss on Testing Set:',score[0])
print('Accuracy of Testing Set:',score[1])
  • 预测:(没有正确答案,直接根据输入预测结果)
result=model.predict(x_test)
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐