Keras的基本介绍

原文:http://blog.youkuaiyun.com/u012162613/article/details/45397033

1. Keras简介

Keras是基于Theano的一个深度学习框架,它的设计参考了Torch,用Python语言编写,是一个高度模块化的神经网络库,支持GPU和CPU。使用文档在这:http://keras.io/,这个框架貌似是刚刚火起来的,使用上的问题可以到github提issue:https://github.com/fchollet/keras

下面简单介绍一下怎么使用Keras,以Mnist数据库为例,编写一个CNN网络结构,你将会发现特别简单。

2. Keras里的模块介绍

  • Optimizers

    顾名思义,Optimizers包含了一些优化的方法,比如最基本的随机梯度下降SGD,另外还有Adagrad、Adadelta、RMSprop、Adam,一些新的方法以后也会被不断添加进来。

    keras.optimizers.SGD(lr=0.01, momentum=0.9, decay=0.9, nesterov=False)
    		

    上面的代码是SGD的使用方法,lr表示学习速率,momentum表示动量项,decay是学习速率的衰减系数(每个epoch衰减一次),Nesterov的值是False或者True,表示使不使用Nesterov momentum。其他的请参考文档。

  • Objectives

    这是目标函数模块,keras提供了mean_squared_error,mean_absolute_error ,squared_hinge,hinge,binary_crossentropy,categorical_crossentropy这几种目标函数。

    这里binary_crossentropy 和 categorical_crossentropy也就是logloss

  • Activations

    这是激活函数模块,keras提供了linear、sigmoid、hard_sigmoid、tanh、softplus、relu、 softplus,另外softmax也放在Activations模块里(我觉得放在layers模块里更合理些)。此外,像LeakyReLU和 PReLU这种比较新的激活函数,keras在keras.layers.advanced_activations模块里提供。

  • Initializations

    这是参数初始化模块,在添加layer的时候调用init进行初始化。keras提供了uniform、lecun_uniform、normal、orthogonal、zero、glorot_normal、he_normal这几种。

  • layers

    layers模块包含了core、convolutional、recurrent、advanced_activations、normalization、embeddings这几种layer。

    其中core里面包含了flatten(CNN的全连接层之前需要把二维特征图flatten成为一维的)、reshape(CNN输入时将一维的向量弄成二维的)、dense(就是隐藏层,dense是稠密的意思),还有其他的就不介绍了。convolutional层基本就是Theano的 Convolution2D的封装。

  • Preprocessing

    这是预处理模块,包括序列数据的处理,文本数据的处理,图像数据的处理。重点看一下图像数据的处理,keras提供了 ImageDataGenerator函数,实现data augmentation,数据集扩增,对图像做一些弹性变换,比如水平翻转,垂直翻转,旋转等。

  • Models

    这是最主要的模块,模型。上面定义了各种基本组件,model是将它们组合起来,下面通过一个实例来说明。

3.一个实例:用CNN分类Mnist

  • 数据下载

    Mnist数据在其官网上有提供,但是不是图像格式的,因为我们通常都是直接处理图像,为了以后程序能复用,我把它弄成图像格式的,这里可以下载:http://pan.baidu.com/s/1qCdS6,共有42000张图片。

  • 读取图片数据

    keras要求输入的数据格式是numpy.array类型(numpy是一个python的数值计算的库),所以需要写一个脚本来读入mnist图像,保存为一个四维的data,还有一个一维的label,代码:

#coding:utf-8
"""
Author:wepon
Source:https://github.com/wepe
file:data.py
"""

import os
from PIL import Image
import numpy as np

#读取文件夹mnist下的42000张图片,图片为灰度图,所以为1通道,
#如果是将彩色图作为输入,则将1替换为3,图像大小28*28
def load_data():
    data = np.empty((42000,1,28,28),dtype="float32")
    label = np.empty((42000,),dtype="uint8")

    imgs = os.listdir("./mnist")
    num = len(imgs)
    for i in range(num):
        img = Image.open("./mnist/"+imgs[i])
        arr = np.asarray(img,dtype="float32")
        data[i,:,:,:] = arr
        label[i] = int(imgs[i].split('.')[0])
    return data,label

  • 构建CNN,训练

    短短二十多行代码,构建一个三个卷积层的CNN,直接读下面的代码吧,有注释,很容易读懂:

#导入各种用到的模块组件
from __future__ import absolute_import
from __future__ import print_function
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.advanced_activations import PReLU
from keras.layers.convolutional import Convolution2D, MaxPooling2D
from keras.optimizers import SGD, Adadelta, Adagrad
from keras.utils import np_utils, generic_utils
from six.moves import range
from data import load_data

#加载数据
data, label = load_data()
print(data.shape[0], ' samples')

#label为0~9共10个类别,keras要求格式为binary class matrices,转化一下,直接调用keras提供的这个函数
label = np_utils.to_categorical(label, 10)

###############
#开始建立CNN模型
###############

#生成一个model
model = Sequential()

#第一个卷积层,4个卷积核,每个卷积核大小5*5。1表示输入的图片的通道,灰度图为1通道。
#border_mode可以是valid或者full,具体看这里说明:http://deeplearning.net/software/theano/library/tensor/nnet/conv.html#theano.tensor.nnet.conv.conv2d
#激活函数用tanh
#你还可以在model.add(Activation('tanh'))后加上dropout的技巧: model.add(Dropout(0.5))
model.add(Convolution2D(4, 1, 5, 5, border_mode='valid')) 
model.add(Activation('tanh'))

#第二个卷积层,8个卷积核,每个卷积核大小3*3。4表示输入的特征图个数,等于上一层的卷积核个数
#激活函数用tanh
#采用maxpooling,poolsize为(2,2)
model.add(Convolution2D(8,4, 3, 3, border_mode='valid'))
model.add(Activation('tanh'))
model.add(MaxPooling2D(poolsize=(2, 2)))

#第三个卷积层,16个卷积核,每个卷积核大小3*3
#激活函数用tanh
#采用maxpooling,poolsize为(2,2)
model.add(Convolution2D(16, 8, 3, 3, border_mode='valid')) 
model.add(Activation('tanh'))
model.add(MaxPooling2D(poolsize=(2, 2)))

#全连接层,先将前一层输出的二维特征图flatten为一维的。
#Dense就是隐藏层。16就是上一层输出的特征图个数。4是根据每个卷积层计算出来的:(28-5+1)得到24,(24-3+1)/2得到11,(11-3+1)/2得到4
#全连接有128个神经元节点,初始化方式为normal
model.add(Flatten())
model.add(Dense(16*4*4, 128, init='normal'))
model.add(Activation('tanh'))

#Softmax分类,输出是10类别
model.add(Dense(128, 10, init='normal'))
model.add(Activation('softmax'))

#############
#开始训练模型
##############
#使用SGD + momentum
#model.compile里的参数loss就是损失函数(目标函数)
sgd = SGD(l2=0.0,lr=0.05, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(loss='categorical_crossentropy', optimizer=sgd,class_mode="categorical")

#调用fit方法,就是一个训练过程. 训练的epoch数设为10,batch_size为100.
#数据经过随机打乱shuffle=True。verbose=1,训练过程中输出的信息,0、1、2三种方式都可以,无关紧要。show_accuracy=True,训练时每一个epoch都输出accuracy。
#validation_split=0.2,将20%的数据作为验证集。
model.fit(data, label, batch_size=100,nb_epoch=10,shuffle=True,verbose=1,show_accuracy=True,validation_split=0.2)

#fit方法在达到设定的nb_epoch时结束,并且自动地保存了效果最好的model,之后你可以调用model.evaluate()方法对测试数据进行测试,
#还有model.predict_classes,model.predict_proba等方法,具体请看文档。

  • 代码使用与结果

代码放在我github的机器学习仓库里:https://github.com/wepe/MachineLearning,非github用户直接点右下的DownloadZip。

在/DeepLearning Tutorials/keras_usage目录下包括data.py,cnn.py两份代码,下载Mnist数据后解压到该目录下,运行cnn.py这份文件即可。

结果如下所示,在Epoch 9达到了0.98的训练集识别率和0.97的验证集识别率:

这里写图片描述

<think>嗯,用户之前询问了关于使用串口发送MPU6050数据的问题,现在突然问到了Keras。这看起来像是用户可能在进行一个项目,结合硬件数据采集和机器学习。可能需要用Keras来处理采集到的传感器数据,比如动作识别或者姿态估计之类的应用。 首先,用户可能对Keras不太熟悉,所以需要先介绍Keras基本概念。要解释清楚Keras是一个高级的神经网络API,基于TensorFlow等后端,简化了深度学习模型的构建和训练。 接下来,用户可能想知道Keras的优点,特别是为什么选择它而不是其他库。需要强调它的易用性、模块化和快速实验特性,适合新手和快速原型开发。另外,跨平台和可扩展性也很重要,尤其是如果用户打算在嵌入式系统或者移动端部署模型的话。 然后,用户可能需要一个简单的代码示例,这样他们可以快速上手。要提供一个简单的全连接神经网络例子,包括数据预处理、模型构建、编译、训练和评估的步骤。同时,要说明每个步骤的作用,比如激活函数、优化器、损失函数的选择。 用户可能还会关心Keras的应用场景,特别是结合他们之前的硬件项目。比如,用MPU6050的数据做动作分类,或者实时预测,这时候可以提到Keras在时间序列分析、实时推理方面的应用。如果用户的数据量不大,还可以提到迁移学习和微调预训练模型的可能性。 需要注意用户的技术背景,他们可能更偏向硬件,对深度学习不太熟悉,所以解释时要避免过于复杂的术语,保持简洁明了。同时,考虑到他们之前使用Arduino,可能对Python和Keras的生态不太熟悉,可以建议一些学习资源,如官方文档、社区论坛,或者示例项目。 另外,用户可能没有提到的深层需求,比如如何将采集的数据输入到Keras模型中,或者如何部署训练好的模型到微控制器上。虽然用户没有直接问这些,但可能在后续问题中会提到,所以可以在介绍中适当提及这些可能性,为后续的扩展问题做铺垫。 最后,确认用户是否需要更具体的指导,比如如何将MPU6050的数据处理成适合Keras输入的格式,或者如何优化模型以适应实时性要求。这样既回答了当前问题,又为可能的后续互动打开了通道。</think>好的!以下是关于 **Keras** 的详细介绍,内容涵盖其核心概念、优势、基本用法和典型应用场景: --- ### **1. Keras 是什么?** - **定位**:Keras 是一个用于构建和训练深度学习模型的高级神经网络 API,设计目标是简单、快速和模块化。 - **底层依赖**:最初是独立库,现作为 **TensorFlow 的高级接口**(从 TensorFlow 2.0 开始,Keras 被直接集成到 TensorFlow 中,即 `tf.keras`)。 - **特点**: - 用户友好:简化模型定义和训练流程。 - 模块化:通过组合层、损失函数、优化器等模块快速构建模型。 - 支持多后端:可基于 TensorFlow、Theano 或 CNTK 运行。 --- ### **2. Keras 的核心优势** | 优势 | 说明 | |---------------------|----------------------------------------------------------------------| | **快速原型设计** | 几行代码即可实现复杂网络结构(如CNN、RNN)。 | | **易用性** | 语法简洁直观,适合深度学习入门。 | | **灵活性** | 支持自定义层、损失函数和训练流程,满足高级需求。 | | **社区支持** | 文档丰富,用户社区活跃,与 TensorFlow 生态无缝集成。 | --- ### **3. Keras 核心组件** #### **(1)模型(Model)** - **Sequential 模型**:线性堆叠层的简单模型。 ```python from tensorflow import keras model = keras.Sequential([ keras.layers.Dense(64, activation='relu', input_shape=(784,)), keras.layers.Dense(10, activation='softmax') ]) ``` - **Functional API**:支持复杂模型(如多输入/输出、共享层)。 ```python inputs = keras.Input(shape=(784,)) x = keras.layers.Dense(64, activation='relu')(inputs) outputs = keras.layers.Dense(10, activation='softmax')(x) model = keras.Model(inputs=inputs, outputs=outputs) ``` #### **(2)层(Layers)** - **常用层类型**: - `Dense`(全连接层) - `Conv2D`(卷积层) - `LSTM`/`GRU`(循环层) - `Dropout`(正则化层) - `BatchNormalization`(归一化层) #### **(3)编译与训练** - **编译模型**:定义优化器、损失函数和评估指标。 ```python model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) ``` - **训练模型**: ```python history = model.fit(x_train, y_train, epochs=10, batch_size=32, validation_split=0.2) ``` --- ### **4. 典型代码示例(图像分类)** ```python import tensorflow as tf from tensorflow.keras import layers # 数据加载(示例:MNIST) (x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data() x_train = x_train.reshape(-1, 28*28).astype('float32') / 255.0 # 定义模型 model = tf.keras.Sequential([ layers.Dense(128, activation='relu', input_shape=(784,)), layers.Dropout(0.2), layers.Dense(10, activation='softmax') ]) # 编译与训练 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=5, batch_size=32) # 评估 loss, accuracy = model.evaluate(x_test.reshape(-1, 784), y_test) print(f"Test Accuracy: {accuracy}") ``` -- ### **5. Keras 应用场景** - **计算机视觉**:图像分类、目标检测(需结合框架如TensorFlow Object Detection API)。 - **自然语言处理**:文本分类、序列生成(如LSTM/Transformer)。 - **时序数据预测**:传感器数据分析(例如你的MPU6050数据可用于动作识别)。 - **生成模型**:GAN(生成对抗网络)、VAE(变分自编码器)。 --- ### **6. 学习资源推荐** - **官方文档**:[Keras Documentation](https://keras.io/) - **书籍**:《Python深度学习》(François Chollet 著,Keras 作者) - **实战教程**: - [TensorFlow 官方教程](https://www.tensorflow.org/tutorials) - Kaggle 竞赛案例(如手写数字识别、房价预测)。 --- ### **7. 注意事项** - **性能优化**:对于大规模数据,需使用GPU加速(如TensorFlow- **过拟合**:通过正则化(Dropout、L2)、数据增强或早停(Early Stopping)缓解。 - **部署**:训练后的模型可导出为 `SavedModel` 或 `H5` 格式,部署到移动端、嵌入式设备或云端。 --- 如果需要进一步探讨如何结合 **Keras 处理MPU6050数据**(例如动作分类模型),可以继续交流!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值