使用Keras快速构建集成卷积网络模型

2023-05-16

在统计学和机器学习领域,集成方法(ensemble method)使用多种学习算法以获得更好的预测性能(相比单独使用其中任何一种算法)。和统计力学中的统计集成(通常是无穷集合)不同,一个机器学习集成仅由一个离散的可选模型的离散集合组成,但通常拥有更加灵活的结构 [1]。


GitHub 地址:https://github.com/LawnboyMax/keras_ensemblng


使用集成的主要动机是在发现新的假设,该假设不一定存在于构成模型的假设空间中。从经验的角度看,当模型具有显著的多样性时,集成方法倾向于得到更好的结果 [2]。


动机


在一个大型机器学习竞赛的比赛结果中,最好的结果通常是由模型的集成而不是由单个模型得到的。例如,ILSVRC2015 的得分最高的单个模型架构得到了第 13 名的成绩。而第 1 到 12 名都使用了不同类型的模型集成。


我目前并没有发现有任何的教程或文档教人们如何在一个集成中使用多种模型,因此我决定自己做一个这方面的使用向导。


我将使用 Keras,具体来说是它的功能性 API,以从相对知名的论文中重建三种小型 CNN(相较于 ResNet50、Inception 等而言)。我将在 CIFAR-10 数据集上独立地训练每个模型 [3]。然后使用测试集评估每个模型。之后,我会将所有三个模型组成一个集合,并进行评估。通常按照预期,这个集成相比单独使用其中任何一个模型,在测试集上能获得更好的性能。


有很多种不同类型的集成:其中一种是堆叠(stacking)。这种类型更加通用并且在理论上可以表征任何其它的集成技术。堆叠涉及训练一个学习算法结合多种其它学习算法的预测 [1]。对于这个示例,我将使用堆叠的最简单的一种形式,其中涉及对集成的模型输出取平均值。由于取平均过程不包含任何参数,这种集成不需要训练(只需要训练模型)。




本文介绍的集成的简要结构


准备数据


首先,导入类和函数:

        
  
  
  1. from keras.models import Model, Input

  2. from keras.layers import Conv2D, MaxPooling2D, GlobalAveragePooling2D, Activation, Average, Dropout

  3. from keras.utils import to_categorical

  4. from keras.losses import categorical_crossentropy

  5. from keras.callbacks import ModelCheckpoint, TensorBoard

  6. from keras.optimizers import Adam

  7. from keras.datasets import cifar10

  8. import numpy as np

我使用的数据集是 CIFAR-10,因为很容易找到在这个数据集上工作得很好的架构的相关论文。使用一个流行的数据集还可以令这个案例容易复现。


以下是数据集的导入代码。训练数据和测试数据都已经归一化。训练标签向量被转换成一个 one-hot 矩阵。不需要转换测试标签向量,因为它不会在训练中使用。

        
  
  
  1. (x_train, y_train), (x_test, y_test) = cifar10.load_data()

  2. x_train = x_train / 255.

  3. x_test = x_test / 255.

  4. y_train = to_categorical(y_train, num_classes=10)

数据集由 6 万张 10 个类别的 32x32 的 RGB 图像组成。其中 5 万张用于训练/验证,其它 1 万张用于测试。

        
  
  
  1. print('x_train shape: {} |

  2. y_train shape: {}\nx_test shape : {} |

  3. y_test shape : {}'.format(x_train.shape, y_train.shape,                                                                                      x_test.shape, y_test.shape))

>>> x_train shape: (50000, 32, 32, 3) | y_train shape: (50000, 10)

>>> x_test shape : (10000, 32, 32, 3) | y_test shape : (10000, 1)


由于三个模型使用的是相同类型的数据,定义单个用于所有模型的输入层是合理的。

        
  
  
  1. input_shape = x_train[0,:,:,:].shape

  2. model_input = Input(shape=input_shape)


第一个模型:ConvPool-CNN-C


第一个将要训练的模型是 ConvPool-CNN-C[4]。它使用了常见的模式,即每个卷积层连接一个池化层。唯一一个对一些人来说可能不熟悉的细节是其最后的层。它使用的并不是多个全连接层,而是一个全局平均池化层(global average pooling layer)。


以下是关于全局池化层的工作方式的简介。最后的卷积层 Conv2D(10,(1,1)) 输出和 10 个输出类别相关的 10 个特征图。然后 GlobalAveragePooling2D() 层计算这 10 个特征图的空间平均(spatial average),意味着其输出是一个维度为 10 的向量。之后,对这个向量应用一个 softmax 激活函数。如你所见,这个方法在某种程度上类似于在模型的顶部使用全连接层。可以在这篇论文 [5] 中查看更多关于全局池化层的内容。


重要事项:不要对最后的 Conv2D(10,(1,1)) 层的输出直接应用激活函数,因为这个层的输出需要先输入 GlobalAveragePooling2D()。


        
  
  
  1. def conv_pool_cnn(model_input):

  2.    x = Conv2D(96, kernel_size=(3, 3), activation='relu', padding =    'same')(model_input)

  3.    x = Conv2D(96, (3, 3), activation='relu', padding = 'same')(x)

  4.    x = Conv2D(96, (3, 3), activation='relu', padding = 'same')(x)

  5.    x = MaxPooling2D(pool_size=(3, 3), strides = 2)(x)

  6.    x = Conv2D(192, (3, 3), activation='relu', padding = 'same')(x)

  7.    x = Conv2D(192, (3, 3), activation='relu', padding = 'same')(x)

  8.    x = Conv2D(192, (3, 3), activation='relu', padding = 'same')(x)

  9.    x = MaxPooling2D(pool_size=(3, 3), strides = 2)(x)

  10.    x = Conv2D(192, (3, 3), activation='relu', padding = 'same')(x)

  11.    x = Conv2D(192, (1, 1), activation='relu')(x)

  12.    x = Conv2D(10, (1, 1))(x)

  13.    x = GlobalAveragePooling2D()(x)

  14.    x = Activation(activation='softmax')(x)

  15.    model = Model(model_input, x, name='conv_pool_cnn')

  16.    return model

用具体例子解释该模型

        
  
  
  1. conv_pool_cnn_model = conv_pool_cnn(model_input)

为了简单起见,每个模型都使用相同的参数进行编译和训练。其中,epoch 数等于 20、批尺寸等于 32(每个 epoch 进行 1250 次迭代)的参数设置能使三个模型都找到局部极小值。随机选择训练集的 20% 作为验证集。

        
  
  
  1. def compile_and_train(model, num_epochs):

  2.    model.compile(loss=categorical_crossentropy, optimizer=Adam(), metrics=['acc'])

  3.    filepath = 'weights/' + model.name + '.{epoch:02d}-{loss:.2f}.hdf5'

  4.    checkpoint = ModelCheckpoint(filepath, monitor='loss', verbose=0, save_weights_only=True, save_best_only=True, mode='auto', period=1)

  5.    tensor_board = TensorBoard(log_dir='logs/', histogram_freq=0, batch_size=32)

  6.    history = model.fit(x=x_train, y=y_train, batch_size=32, epochs=num_epochs, verbose=1, callbacks=[checkpoint, tensor_board], validation_split=0.2)

  7.    return history

大约需要每 epoch1 分钟的时间训练这个(以及下一个)模型,我们使用了单个 Tesla K80 GPU。如果你使用的是 CPU,可能需要花较多的时间。

        
  
  
  1. _ = compile_and_train(conv_pool_cnn_model, num_epochs=20)

该模型达到了大约 79% 的验证准确率。



ConvPool-CNN-C 验证准确率和损失


通过计算测试集的误差率对模型进行评估。

        
  
  
  1. def evaluate_error(model):

  2.    pred = model.predict(x_test, batch_size = 32)

  3.    pred = np.argmax(pred, axis=1)

  4.    pred = np.expand_dims(pred, axis=1) # make same shape as y_test

  5.    error = np.sum(np.not_equal(pred, y_test)) / y_test.shape[0]  

  6.    return error

  7. evaluate_error(conv_pool_cnn_model)

>>> 0.2414


第二个模型:ALL-CNN-C


下一个模型,ALL-CNN-C,来自同一篇论文 [4]。这个模型和上一个很类似。唯一的区别是用步幅为 2 的卷积层取代了最大池化层。再次,需要注意,在 Conv2D(10,(1,1)) 层之后不要立刻应用激活函数,如果在该层之后应用了 ReLU 激活函数,会导致训练失败。


        
  
  
  1. def all_cnn(model_input):

  2.    x = Conv2D(96, kernel_size=(3, 3), activation='relu', padding = 'same')(model_input)

  3.    x = Conv2D(96, (3, 3), activation='relu', padding = 'same')(x)

  4.    x = Conv2D(96, (3, 3), activation='relu', padding = 'same', strides = 2)(x)

  5.    x = Conv2D(192, (3, 3), activation='relu', padding = 'same')(x)

  6.    x = Conv2D(192, (3, 3), activation='relu', padding = 'same')(x)

  7.    x = Conv2D(192, (3, 3), activation='relu', padding = 'same', strides = 2)(x)

  8.    x = Conv2D(192, (3, 3), activation='relu', padding = 'same')(x)

  9.    x = Conv2D(192, (1, 1), activation='relu')(x)

  10.    x = Conv2D(10, (1, 1))(x)

  11.    x = GlobalAveragePooling2D()(x)

  12.    x = Activation(activation='softmax')(x)

  13.    model = Model(model_input, x, name='all_cnn')

  14.    return model

  15. all_cnn_model = all_cnn(model_input)

  16. _ = compile_and_train(all_cnn_model, num_epochs=20)

该模型收敛到了大约 75% 的验证准确率。



ConvPool-CNN-C 验证准确率和损失


由于这两个模型很相似,误差率差别不大。

        
  
  
  1. evaluate_error(all_cnn_model)

>>> 0.26090000000000002


第三个模型:Network In Network CNN


第三个 CNN 是 Network In Network CNN[5]。这个模型来自引入了全局池化层的论文。它比之前的两个模型更小,因此其训练速度更快。(再提醒一次,不要在最后的卷积层之后使用 ReLU 函数!)


相较于在 MLP 卷积层中使用多层感知机,我使用的是 1x1 卷积核的卷积层。从而需要优化的参数变得更少,训练速度进一步加快,并且还获得了更好的结果(当使用全连接层的时候无法获得高于 50% 的验证准确率)。该论文中称,MLP 卷积层中应用的函数等价于在普通卷积层上的级联跨通道参数化池化(cascaded cross channel parametric pooling),其中依次等价于一个 1x1 卷积核的卷积层。如果这个结论有错误,欢迎指正。


        
  
  
  1. def nin_cnn(model_input):

  2.    #mlpconv block 1

  3.    x = Conv2D(32, (5, 5), activation='relu',padding='valid')(model_input)

  4.    x = Conv2D(32, (1, 1), activation='relu')(x)

  5.    x = Conv2D(32, (1, 1), activation='relu')(x)

  6.    x = MaxPooling2D((2, 2))(x)

  7.    x = Dropout(0.5)(x)

  8.    #mlpconv block2

  9.    x = Conv2D(64, (3, 3), activation='relu',padding='valid')(x)

  10.    x = Conv2D(64, (1, 1), activation='relu')(x)

  11.    x = Conv2D(64, (1, 1), activation='relu')(x)

  12.    x = MaxPooling2D((2, 2))(x)

  13.    x = Dropout(0.5)(x)

  14.    #mlpconv block3

  15.    x = Conv2D(128, (3, 3), activation='relu',padding='valid')(x)

  16.    x = Conv2D(32, (1, 1), activation='relu')(x)

  17.    x = Conv2D(10, (1, 1))(x)

  18.    x = GlobalAveragePooling2D()(x)

  19.    x = Activation(activation='softmax')(x)

  20.    model = Model(model_input, x, name='nin_cnn')

  21.    return model

  22. nin_cnn_model = nin_cnn(model_input)


这个模型的训练速度快得多,在我的机器上每个 epoch 只要 15 秒就能完成。


        
  
  
  1. _ = compile_and_train(nin_cnn_model, num_epochs=20)


该模型达到了大约 65% 的验证准确率。




NIN-CNN 验证准确率和损失


这个模型比之前的两个模型简单得多,因此其误差率要高一点。

        
  
  
  1. evaluate_error(nin_cnn_model)

>>> 0. 0.31640000000000001


三个模型的集成


现在将这三个模型组合成一个集成。


所有三个模型都被重新实例化并加载了最佳的已保存权重。

        
  
  
  1. conv_pool_cnn_model = conv_pool_cnn(model_input)

  2. all_cnn_model = all_cnn(model_input)

  3. nin_cnn_model = nin_cnn(model_input)

  4. conv_pool_cnn_model.load_weights('weights/conv_pool_cnn.29-0.10.hdf5')

  5. all_cnn_model.load_weights('weights/all_cnn.30-0.08.hdf5')

  6. nin_cnn_model.load_weights('weights/nin_cnn.30-0.93.hdf5')

  7. models = [conv_pool_cnn_model, all_cnn_model, nin_cnn_model]


集成模型的定义是很直接的。它使用了所有模型共享的输入层。在顶部的层中,该集成通过使用 Average() 合并层计算三个模型输出的平均值。


        
  
  
  1. def ensemble(models, model_input):

  2.    outputs = [model.outputs[0] for model in models]

  3.    y = Average()(outputs)

  4.    model = Model(model_input, y, name='ensemble')

  5.    return model

  6. ensemble_model = ensemble(models, model_input)

不出所料,相比于任何单一模型,集成有着更低的误差率。

        
  
  
  1. evaluate_error(ensemble_model)

>>> 0.2049


其他可能的集成


为了完整性,我们可以查看由两个模型组合组成的集成的性能。相比于单一模型,前者有更低的误差率。

        
  
  
  1. pair_A = [conv_pool_cnn_model, all_cnn_model]

  2. pair_B = [conv_pool_cnn_model, nin_cnn_model]

  3. pair_C = [all_cnn_model, nin_cnn_model]

  4. pair_A_ensemble_model = ensemble(pair_A, model_input)

  5. evaluate_error(pair_A_ensemble_model)

>>> 0.21199999999999999

        
  
  
  1. pair_B_ensemble_model = ensemble(pair_B, model_input)

  2. evaluate_error(pair_B_ensemble_model)

>>> 0.22819999999999999

        
  
  
  1. pair_C_ensemble_model = ensemble(pair_C, model_input)

  2. evaluate_error(pair_C_ensemble_model)

>>>0.2447


结论


重申一下介绍中的内容:每个模型有其自身的缺陷。使用集成背后的原因是通过堆叠表征了关于数据的不同假设的不同模型,我们可以找到一个更好的假设,它不在一个从其构建集成的模型的假设空间之中。


与在大多数情况下使用单个模型相比,使用一个非常基础的集成实现了更低的误差率。这证明了集成的有效性。


当然,在使用集成处理你的机器学习任务时,需要牢记一些实际的考虑。由于集成意味着同时堆栈多个模型,这也意味着输入数据需要前向传播到每个模型。这增加了需要被执行的计算量,以及最终的评估(预测)时间。如果你在研究或 Kaggle 竞赛中使用集成,增加的评估时间并不重要,但是在设计一个商业化产品时却非常关键。另一个考虑是最后的模型增加的大小,它会再次成为商业化产品中集成使用的限制性因素。 


参考文献


1. Ensemble Learning. (n.d.). In Wikipedia. Retrieved December 12, 2017, from https://en.wikipedia.org/wiki/Ensemble_learning

2. D. Opitz and R. Maclin (1999)「Popular Ensemble Methods: An Empirical Study」, Volume 11, pages 169–198 (http://jair.org/papers/paper614.html)

3. Learning Multiple Layers of Features from Tiny Images, Alex Krizhevsky, 2009.

4. Striving for Simplicity: The All Convolutional Net:arXiv:1412.6806v3 [cs.LG]

5. Network In Network:arXiv:1312.4400v3 [cs.NE]



原文链接:https://towardsdatascience.com/ensembling-convnets-using-keras-237d429157eb


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Keras快速构建集成卷积网络模型 的相关文章

  • 窗口控件透明效果的实现--DSkinLite界面库使用技巧

    DSkinLite 界面库使用技巧 二 窗口控件透明效果 界面设计中 xff0c 很多效果需要借助透明效果来实现 不幸的是 xff0c Windows 标准控件基本不支持透明效果 因此我们需要自己来实现透明效果 一般来说所谓控件透明 xff
  • DSkinControl( For MFC) 控件- dsCtrlComboBox

    原文地址 xff1a http www uieasy cn blog p 61 513 传统的combobox 在使用方面有很多限制 xff0c 很难满足我们combobox类型控件的需求 主要表现中combobox内置的listbox难以
  • 图像典型特征描述子Haar

    以下文章摘录自 xff1a 机器学习观止 核心原理与实践 京东 xff1a https item jd com 13166960 html 当当 xff1a http product dangdang com 29218274 html 由
  • oracle触发器执行用户和v$session的查询

    oracle触发器 xff0c 由针对表的动作触发 xff0c 其执行用户为当前表的所有者 xff0c 所以在触发器中涉及的权限问题 xff0c 应该和触发器所基于的表的所有者有关 对于v session的查询 xff1a 要明确的是 xf
  • springboot打包docker镜像部署

    springboot打包docker镜像部署 环境准备 机器 vultr一台 centos7 资源下载 jdk8 maven git yum install git docker yum install docker io 环境搭建 jdk
  • 深度学习基础——简单了解meta learning(来自李宏毅课程笔记)

    知乎同名账号同步发布 目录 一 初步了解二 和ML的差异三 应用了解 一 初步了解 我们以分类问题为例 xff0c 以前 xff0c 学习的目的是学习一个二元分类器 f f f xff1b 现在 xff0c 学习的
  • docker删除镜像及容器

    问题 清理服务器相关无用docker镜像及容器 删除镜像image 要删除 Docker 中的镜像 xff0c 可以使用 docker rmi 命令 请注意 xff0c 删除镜像前请确保不再需要它 xff0c 并且已经停止了使用该镜像的所有
  • 云技术:弹性计算ECS

    云计算 xff08 Cloud Computing xff09 被业界看作继大型计算机 个人计算机 互联网之后的第四次IT产业革命 xff0c 正日益成为未来互联网与移动技术相结合的一种新兴计算模式 云计算提供了IT基础设施和平台服务的新模
  • 如何在 docker 容器中安装 ROS

    本文记录在 docker ubuntu 18 04 环境下安装 ROS xff08 机器人操作系统 xff09 的过程 目录 文章目录 目录安装 ROS参考文献 安装 ROS 安装步骤如下 xff1a span class token co
  • DOCKER个人遇见小问题

    1 在写dockerfile的时候使用了echo的方式向文件里面写入 基本格式是 echo 34 想要写入的操作 34 gt gt gt 路径 dockerfile 1 因为是要向文件里面进行一个写操作同时希望建立容器的时候执行这个操作 所
  • Tips and Tricks for Visual Question Answering: Learnings from the 2017 Challenge阅读笔记

    本文提出了一种基于深度神经网络的VQA模型 xff0c 并报告了一套广泛的实验来确定每个设计选择的贡献和替代设计的性能 它提供了关于VQA模型各个组件重要性的指示器 xff0c 一 Summary of findings 1 使用一个sig
  • Ubuntu系统用VNCViewer连不上远程的解决办法

    有时Ubuntu重启电脑重新联网之后 xff0c 用VNCViewer远程时提示timeout 解决办法 点击Ubuntu电脑系统的设置按钮 xff0c 进入共享选项卡 检查远程登录是不是已经开启 xff0c 屏幕共享是不是活动状态 屏幕共
  • OAuth2.0的四种授权方式

    前言 OAuth 简单理解就是一种授权机制 xff0c 它是在客户端和资源所有者之间的授权层 xff0c 用来分离两种不同的角色 在资源所有者同意并向客户端颁发令牌后 xff0c 客户端携带令牌可以访问资源所有者的资源 OAuth2 0 是
  • PowerBuilder---合并相同单元格

    在用数据窗口显示数据时 xff0c 经常会出现某一列的连续多行内容是相同的 xff0c 在有中国特色的软件使用者看来这是一个很大的问题 一定要合并才能显得规范 如下图 xff1a PowerBuilder 合并相同单元格 qibin jin
  • 各行业的英语术语(绝对精华 1)

    不看不知道 各行业的英语术语 xff08 绝对精华 xff09 化妆品中英文对照 makeup xff08 粉底 xff09 mask xff08 面膜 xff09 mascara xff08 睫毛膏 xff09 milk xff08 乳
  • SD-WAN与SDN:揭开差异 如何选择虚拟化网络

    随着物联网 工业互联网等新兴业务场景的不断涌现 xff0c 网络正面临着开放 融合 智能化 个性化等需求 在SDN进入稳定爬升期 xff0c 还未完全落地之时 xff0c 以SD WAN xff08 软件定义的广域网 xff09 为代表的新
  • H5实例 移动端页面练习

    文章目录 标签知识点 标签知识点 name 61 viewport xff1b 屏幕设定maximum scale 61 1 0 minimum scale 61 1 0 initial scale 61 1 0 xff1b 最大最小缩放比
  • SSH修改远程端口后无法登录的解决办法

    参考 xff1a https www cnblogs com opswa p 16076001 html SSH是一种网络协议 xff0c 用于计算机之间的加密登录 如果一个用户从本地计算机 xff0c 使用SSH协议登录另一台远程计算机
  • 串口调试助手如何使用

    需要设置好对应的串口端口 xff0c 波特率 校验位 数据位 停止位 xff0c 然后打开串口 这是一个绿色版的 xff0c 比深蓝串口调试助手好用的多
  • 来来来!我告诉你 AUTOSAR架构深度解析从入门到放弃

    如何快速学习AUTOSAR 关于AUTOSAR的背景和架构信息 xff0c 这里就不详细展开了 大家可以参看 xff1a AUTOSAR的分层架构 一文了解 今天我们重点讲讲如何快速学习AUTOSAR架构的方法 如何获取规范文档 xff1f

随机推荐

  • 智能指针make_unique 与make_shared 的知识介绍

    关于make unique的构造及使用例程 xff0c MSDN的讲解非常详细 xff08 https msdn microsoft com zh cn library dn439780 aspx xff09 使用过程中 xff0c 主要有
  • Adaptive AutoSAR 标准介绍

    关于自适应AutoSAR 平台 自适应autosar 平台实现了adaptive applications的运营环境 它提供了两种接口 xff0c 一种是service 一种是API 平台功能分成两部分 xff1a service部分和ad
  • MPU和MCU的区别

    MCU指的是微控制 器 集合了FLASH RAM和一些外围器件 MCU一般使用片内FLASH来存储和执行程序代码 MPU指的是微处理 器 FLASH和RAM则需要设计者自行搭建 xff0c 当然MCU也可以外扩 MPU的电路设计相对MCU较
  • powerbuilder9 窗口高级配置

    一 无标题栏 办法 xff1a 把窗口类型配置成response或者popup xff0c 窗口属性中的titlebar属性就变成可以选择 xff0c 把titlebar属性的勾点掉 xff0c 就可以配置成无标题栏 xff0c main类
  • Adaptive AUTOSAR——Cryptography (VRTE3.0 R21-11)

    Cryptography模块是用于自适应汽车软件架构的密码学模块 xff0c 主要用于实现各种安全功能 xff0c 包括加密 解密 签名和验证 等操作 它的主要作用包括 xff1a 安全通信 xff1a 使用各种算法对数据进行加密和解密 x
  • 一文读懂AUTOSAR SecOC通讯

    为什么用SecOC 在车载网络中 xff0c CAN总线作为常用的通讯总线之一 xff0c 其大部分数据是以明文方式广播发送且无认证接收 这种方案具有低成本 高性能的优势 xff0c 但是随着汽车网联化 xff0c 智能化的业务需要 xff
  • 汽车操作系统的趋势

    操作系统 OS 需要管理基于计算机的系统的所有硬件和软件 xff0c 并且是汽车行业的关键软件平台 本文侧重于提供教程信息和汽车操作系统策略的一些观点 每个操作系统在功能 程序大小 复杂性 开发工作和硬件要求以及生命周期维护 支持工作和成本
  • 4.5.2 DDS

    1 标准及发展简介 DDS 的全称为 Data Distribution Service xff08 数据分发服务 xff0c 是由 OMG 联盟在 2004 年发布的中间件协议和应用程序接口标准 采用发布 订阅模型 xff0c 提供丰富的
  • SOA协议DDS和Some/IP对比

    SOME IP 和 DDS 均已被纳入AUTOSAR AP的平台标准中 SOME IP 和 DDS是在不同的应用场景和不同的需求下诞生的技术 xff0c 所以它们之间注定有很大的区别 SOME IP SOME IP的全称为 xff1a Sc
  • linux内核提高系统实时性,Linux操作系统实时性分析及改进策略

    摘要 xff1a 实时操作系统要求具有速度快和可预测性的特点 xff0c 必须保证实时任务在要求的时间内完成 本文在分析Linux操作系统的中断方式和进程调度等影响实时性的因素后 xff0c 对Linux的实时性策略进行改进 xff0c 提
  • switch ... case语句的用法

    当情况大于或等于4种的时候就用switch case语句 switch xff08 表达式 xff09 case 常量1 xff1a 语句体1 xff1b case 常量2 xff1a 语句体2 xff1b case 常量3 xff1a 语
  • 什么是eNodeB?eNodeB有什么主要功能?eNodeB与2G、3G的基站有什么区别?

    答 xff1a eNodeB xff08 简称为eNB xff09 是LTE网络中的无线基站 xff0c 也是LTE无线接入网的唯一网元 xff0c 负责空中接口相关的所有功能 xff1a xff08 1 xff09 无线链路维护功能 xf
  • 最优传输-ML实战

    在正文开始之前 xff0c 我们先举一个例子 xff1a Equations A 1
  • 最优传输-Sinkhorn算法(第九篇)

    最优传输系列是基于Computational Optimal Transport开源书的读书笔记 Sinkhorn算法 在上一篇里 xff0c 我们介绍了加入熵正则化的最优传输问题 熵正则化通过限制最优传输问题解的复杂度 xff0c 可以以
  • oracle表对表的多行更新

    oracle并没有update from 这个写法 所以在从一个表将数据更新到另外一个表时 xff0c 无法使用update from写法 xff0c 尤其是需要多行更新时 xff0c 最好使用merge into merge into允许
  • 一图理解M0不同优先级中断及Pendsv切换

  • 纽约客封面故事:欢迎来到「黑暗工厂」,这里是由机器统治的世界

    来源 The New Yorker 作者 Sheelah Kolhatkar 编译 编辑部 大急流城 xff0c Steelcase 的 人肉机器人 1977 年 xff0c 在密歇根州大急流城 xff0c 当 David Stinson
  • 先读懂CapsNet架构然后用TensorFlow实现:全面解析Hinton的提出的Capsule

    上周 Geoffrey Hinton 等人公开了那篇备受关注的 NIPS 论文 xff0c 而后很多研究者与开发者都阅读了该论文并作出了一定的代码实现 机器之心在本文中将详细解释该论文提出的结构与过程 xff0c 并借助 GitHub 上热
  • Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测

    近日 xff0c Artur Suilin 等人发布了 Kaggle 网站流量时序预测竞赛第一名的详细解决方案 他们不仅公开了所有的实现代码 xff0c 同时还详细解释了实现的模型与经验 机器之心简要介绍了他们所实现的模型与经验 xff0c
  • 使用Keras快速构建集成卷积网络模型

    在统计学和机器学习领域 xff0c 集成方法 xff08 ensemble method xff09 使用多种学习算法以获得更好的预测性能 xff08 相比单独使用其中任何一种算法 xff09 和统计力学中的统计集成 xff08 通常是无穷