Keras深度学习之示例应用

本文通过多个示例详细介绍了使用Keras进行深度学习的各种模型应用,包括预测数值、二元分类、多元分类以及处理视频和时间序列数据。对比了不同模型如感应器神经网络、多层感知器、卷积神经网络、循环神经网络及其变种在训练时间和性能上的差异,揭示了卷积和循环神经网络在处理复杂任务时的优势。

4.1 输入——预测数值模型示例

4.1.1 模型准备

  • 线性回归模型

    w = np.cov(X,Y,bias=1)[0,1]/np.var(X)
    b = np.average(Y) - w * np.average(X)
  • 感应器神经网络模型

    最基本的感应器神经网络模型,只有一个Dense层一个神经元

    model = Sequential()
    model.add(Dense(1,input_dim=1))
  • 多层感应器神经网络模型

    是由两个Dense层构成的神经网络模型。第一层是由64个神经元构成的Dense层,调用便于处理误差反向传播的relu函数作为激活函数;第二层输出层只输出一个预测值,只有一个神经元不需调用激活函数

    model = Sequential()
    model.add(Dense(64,input_dim=1,activation='relu'))
    model.add(Dense(1))
  • 深度多层感应器神经网络模型

    是由三个Dense层构成的神经网络模型。第一、二层是具有64个神经元的Dense层,调用便于处理误差反向传播的relu函数作为激活函数;第三层输出层只输出一个预测值,只有一个神经元不需调用激活函数

    model = Sequential()
    model.add(Dense(64,input_dim=1,activation='relu'))
    model.add(Dense(64,activation='relu'))
    model.add(Dense(1))

4.1.2 训练结果比较

模型训练所需时间排序

感应器神经网络>多层感应器神经网络>深度多层感应器神经网络

4.2 输入数值二元分类模型示例

4.2.1 准备模型

输出层调用sigmoid函数作为激活函数

4.2.2 训练结果比较

模型训练所需时间排序

感应器神经网络>多层感应器神经网络>深度多层感应器神经网络

4.3 输入数值多元分类问题模型示例

4.3.1 准备模型

输出层调用softmax函数作为激活函数

4.3.2 训练结果比较

模型训练所需时间排序

感应器神经网络>多层感应器神经网络>深度多层感应器神经网络

4.4 输入视频预测数值的模型示例

首先,生成简单的用于测试的视频数据集,随后搭建并训练多层感知器神经网络模型和卷积神经网络模型。

由于多层感应器神经网络模型的输入Dense层只接收一维向量数据,因此需要将二维视频转换为一维向量

x_train_1d = x_train.reshape(x_train.shape[0],width*height)
x_val_1d = x_val.reshape(x_val.shape[0],width*height)
x_test_1d = x_test.reshape(x_test.shape[0],width*height)

4.4.1 准备模型

  • 多层感应器神经网络模型

    model = Sequential()
    model.add(Dense(256,activation='relu',input_dim=width*weight))
    model.add(Dense(256,activation='relu'))
    model.add(Dense(256))
    model.add(Dense(1))
  • 卷积神经网络模型

    model = Sequential()
    model.add(Conv2D(32,(3,3),activation='relu',input_shape=(width,height,1)))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Conv2D(32,(3,3),activation='relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Flatten())
    model.add(Dense(256,activation='relu'))
    model.add(Dense(1))

4.4.2 训练结果比较

由于标签值并非形状和颜色等具体的视频特征,而是简单的像素为1的像素个数,所以卷积神经网络模型并没有发挥其性能优势

4.5 输入视频预测二分类问题的模型示例

该模型用于将随机的视频区分为A或B,以及区分正负样本。可用于以下问题:

  • 根据输入的脸部照片识别性别
  • 根据输入的配件照片识别优劣
  • 根据医疗视频判断是否患病

4.5.1 准备模型

  • 多层感知器神经网络模型

    model = Sequential()
    model.add(Dense(256,activation='relu',input_dim=width*weight))
    model.add(Dense(256,activation='relu'))
    model.add(Dense(256,activation='relu'))
    model.add(Dense(1,,activation='sigmoid'))
  • 卷积神经网络模型

    model = Sequential()
    model.add(Conv2D(32,(3,3),activation='relu',input_shape=(width,height,1)))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Conv2D(32,(3,3),activation='relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Flatten())
    model.add(Dense(256,activation='relu'))
    model.add(Dense(1,activation='sigmoid'))
  • 深度卷积神经网络模型

    model = Sequential()
    model.add(Conv2D(32,(3,3),activation='relu',input_shape=(width,height,1)))
    model.add(Conv2D(32,(3,3),activation='relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Dropout(0.25))
    model.add(Conv2D(64,(3,3),activation='relu'))
    model.add(Conv2D(64,(3,3),activation='relu'))
    model.add(MaxPooling2D(pool_size=(2,2)))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(256,activation='relu'))
    model.add(Dropout(0.5))
    model.add(Dense(1,activation='sigmoid'))

4.5.2 训练结果比较

多层感知器神经网络模型的训练准确率随着验证损失值的提高出现了过拟合现象

相比于多层感知器神经网络模型,卷积神经网络模型的性能更优

得益于Dropout层,深度卷积神经网络模型没有发生过拟合现象,验证损失值持续下降。

4.6 输入视频预测多元分类问题的模型示例

该模型可以用于以下问题:

  • 区分亚洲人的面部照片
  • 区分显微镜影像中的细菌种类
  • 区分智能手机拍摄的植物种类
  • 区分气象卫星摄像中的台风类型

4.6.1 训练结果比较

多层感知器神经网络模型的训练准确率随着验证损失值的提高出现了过拟合现象

相比于多层感知器神经网络模型,卷积神经网络模型的性能更优

得益于Dropout层,深度卷积神经网络模型没有发生过拟合现象,验证损失值持续下降。

4.7 输入时间序列数据,预测数值的模型示例

4.7.1 准备模型

使用多层感知器神经网络模型、循环神经网络模型、Stateful循环神经网络模型、Stateful叠加循环神经网络模型

  • 多层感知器神经网络模型

    model = Sequential()
    model.add(Dense(32,input_dim=40,activation='relu'))
    model.add(Dropout(0.3))
    for i in range(2):
    model.add(Dense(32,activation='relu'))
    model.add(Dropout(0.3))
    model.add(Dense(1))
  • 循环神经网络模型

    model = Sequential()
    model.add(LSTM(32,input_shape=(None,1)))
    model.add(Dropout(0.3))
    model.add(Dense(1))
  • Stateful循环神经网络模型

    model = Sequential()
    model.add(LSTM(32,batch_input_shape=(1,look_back,1),stateful=True))
    model.add(Dropout(0.3))
    model.add(Dense(1))
  • Stateful叠加循环神经网络模型

    model = Sequential()
    for i in range(2):
    model.add(LSTM(32,batch_input_shape=(1,look_back,1),stateful=True,return_sequences=True))
    model.add(Dropout(0.3))
    model.add(LSTM(32,batch_input_shape=(1,look_back,1),stateful=True))
    model.add(Dropout(0.3))
    model.add(Dense(1))

4.7.2 训练结果比较

  1. 预测结果振幅较小,但周期基本一致

  2. 初期的振幅和周期都一致,但后期结果的振幅和周期都有增大的趋势

  3. 虽然结果呈现余弦曲线趋势,但与同一训练周期及相同单元大小的循环神经网络模型相比,结果并不理想

  4. 振幅和周期趋势都与预测几乎一致最大振幅很接近,但最小振幅预测结果数据略高

4.8 根据输入句子(时间序列数值)预测二元分类问题的模型示例

4.8.1 准备模型

  • 多层感知器神经网络模型

    model = Sequential()
    model.add(Embedding(20000,128,input_length=200))
    model.add(Flatten())
    model.add(Dense(256,activation='relu'))
    model.add(Dense(1,activation='sigmoid'))
  • 循环神经网络模型

    model = Sequential()
    model.add(Embedding(20000,128))
    model.add(LSTM(128))
    model.add(Dense(1,activation='sigmoid'))
  • 卷积神经网络模型

    model = Sequential()
    model.add(Embedding(20000,128,input_length=200))
    model.add(Dropout(0.2))
    model.add(Conv1D(256,3,padding='valid',activation='relu',strides=1))
    model.add(GlobalMaxPooling1D())
    model.add(Dense(128,activation='sigmoid'))
    model.add(Dropout(0.2))
    model.add(Dense(1,activation='sigmoid'))
  • 循环卷积神经网络模型

    model = Sequential()
    model.add(Embedding(20000,128,input_length=200))
    model.add(Dropout(0.2))
    model.add(Conv1D(256,3,padding='valid',activation='relu',strides=1))
    model.add(GlobalMaxPooling1D(pool_size=4))
    model.add(LSTM(128))
    model.add(Dense(1,activation='sigmoid'))

4.8.2 训练结果比较

相比于多层感知器神经网络模型,使用循环层或卷积层的模型性能更高

4.9 输入句子(时间序列数值)预测多元分类问题的模型示例

同4.8.2

sigmoid转换成softmax

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bgbgssh1314

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值