基于 KERAS 深度学习开发快速感性认知

本贴最后更新于 2453 天前,其中的信息可能已经时移世异
  • 机器学习按大功能来区分包含两类

    • 监督学习,需要有经过标注的结果,说明入参对应的结果,用于解决分类、拟合等问题。
    • 无监督学习,无需经过标注的结果,用于分析数据间的聚合关联关系,
  • 在监督学习算法按实现的功能有两大类型

    • 分类算法(用于给定参数推定所属的坆举分类)
    • 回归算法(拟合曲线方程,并根据入参算出曲线入参的结果,回归能得出连续的结果)
  • 一些监督算法

    • 线性回归,可以有多个入参,但是入参对应的幂指数都是1

      • 非线性回归可以转化成线性回归处理
    • Logistic回归,其基于Sigmoid函数,该函数结果介于0-1之间,其结合线性/非线性回归,可用于判断一件事情发生的概率。其是神经网络的基础,神经网络由多个该年该层组成

    • 神经网络(深度学习属于神经网络,后面的算法若不感兴趣可以直接跳过,本节仅仅用于说明监督算法有很多分类,下面会详细一点的介绍神经网络)

    • kNN算法,根据代数最短距离挑出最近的k个已知学习样本,并以样本的平均值(或者分类结果)作为推断值

    • 朴素贝叶斯算法,有很多个对结果有影响的参数,并假设这些参数都是独立发生,没有相互关联的,然后统计这些参数在某个结论中出现的概率,根据这些概率推断特定入参对应最可能的结果是什么

    • 决策树算法,根据训练样本的入参及结果,结合各个参数信息增熵的信息构造一个高效的分类树

  • 神经网络

    • 所谓神经网络学习的过程可以想象成解方程的过程,例如 y=ax+b,如果我们知道了 y 和 x的2个值,那么我们就可以求得a跟b的值。求得a跟b的值就是整个训练的最终目的
    • 但是实际情况下训练过程会复杂很多,我们之前有将到,神经网络的基础是Logistic回归,一个Logistic回归函数可对应为一个神经元,其函数形式可为 y = sigmoid(a0 + a1*x1 + a2 * x2 + ......)。我们实际上是不知道x的实际有效个数,也不知道其对应的合适幂等次数,所以我们很难像解方程一样解出各个a的值,通常求a的值是利用现有的所有训练样例,求得针对所有样例能获得一个最小化误差的a的值。求a值通常会用梯度下降及其相关优化的算法。具体感兴趣可以自行学习。
    • 而神经网络由多个神经元堆叠而成,以下第一个图为单个神经元,第二个图为神经网络

imageimage

  • 深度学习

    • 所谓深度学习就是计算由很多个层次(见上图的Layer)的神经网络的各个a(权重)的值,并没有什么玄乎的东西,其是一个商业概念
    • 但从上图可以看出,深度神经网络的计算量非常的大,这也是为什么在之前深度学习没有火起来的原因,为了减轻计算量提高效率,神经网络有针对不同场景的优化分支,有以下几类
    • 卷积神经网络
      • 卷积神经网络,会局部的抽取计算小特征,并在高层的layer根据小特征计算大特征,最终得到推论结果。其多用于图像处理
    • 循环神经网络
      • 其用于不能一次获得所有输入的场景,其能记录之前输入数据的状态,并以此加以训练。例如语音转文字处理场景,其能根据新的语音输入,以及之前转出来的文字统一作为入参,推断出下一个要转换的语音对应的文字
  • 基于KERAS的深度学习开发

    • 实际上基于KERAS的开发特别简单,我们要做的仅仅是搭积木
    • 根据我们现有的场景,选择组合特定适合的神经网络,就是工作的最主要部分,当然,前提就是我们需要熟悉各种神经网络的有缺点
    • 因此深度学习开发,可以说作出基本成果是难度不的,难度大的是,如何选择出合适的神经网络,拼凑出合适的模型,使得在足量的训练样本的情况下,训练出准确率高,计算复杂度小模型。
  • 以下是一个训练从图片转HTML/CSS的全部开发代码,大家可以感受下其代码量

    from numpy import array
      from keras.preprocessing.text import Tokenizer, one_hot
      from keras.preprocessing.sequence import pad_sequences
      from keras.models import Model, Sequential, model_from_json
      from keras.utils import to_categorical
      from keras.layers.core import Dense, Dropout, Flatten
      from keras.optimizers import RMSprop
      from keras.layers.convolutional import Conv2D
      from keras.callbacks import ModelCheckpoint
      from keras.layers import Embedding, TimeDistributed, RepeatVector, LSTM, concatenate , Input, Reshape, Dense
      from keras.preprocessing.image import array_to_img, img_to_array, load_img
      import numpy as np
      Using TensorFlow backend.
      # In [2]:
      dir_name = '/data/train/'
    

    # Read a file and return a string
    def load_doc(filename):
    file = open(filename, 'r')
    text = file.read()
    file.close()
    return text

    def load_data(data_dir):
    text = []
    images = []
    # Load all the files and order them
    all_filenames = listdir(data_dir)
    all_filenames.sort()
    for filename in (all_filenames):
    if filename[-3:] == "npz":
    # Load the images already prepared in arrays
    image = np.load(data_dir+filename)
    images.append(image['features'])
    else:
    # Load the boostrap tokens and rap them in a start and end tag
    syntax = '<START> ' + load_doc(data_dir+filename) + ' <END>'
    # Seperate all the words with a single space
    syntax = ' '.join(syntax.split())
    # Add a space after each comma
    syntax = syntax.replace(',', ' ,')
    text.append(syntax)
    images = np.array(images, dtype=float)
    return images, text

    train_features, texts = load_data(dir_name)
    # In [4]:
    # Initialize the function to create the vocabulary
    tokenizer = Tokenizer(filters='', split=" ", lower=False)
    # Create the vocabulary
    tokenizer.fit_on_texts([load_doc('bootstrap.vocab')])

    # Add one spot for the empty word in the vocabulary
    vocab_size = len(tokenizer.word_index) + 1
    # Map the input sentences into the vocabulary indexes
    train_sequences = tokenizer.texts_to_sequences(texts)
    # The longest set of boostrap tokens
    max_sequence = max(len(s) for s in train_sequences)
    # Specify how many tokens to have in each input sentence
    max_length = 48

    def preprocess_data(sequences, features):
    X, y, image_data = list(), list(), list()
    for img_no, seq in enumerate(sequences):
    for i in range(1, len(seq)):
    # Add the sentence until the current count(i) and add the current count to the output
    in_seq, out_seq = seq[:i], seq[i]
    # Pad all the input token sentences to max_sequence
    in_seq = pad_sequences([in_seq], maxlen=max_sequence)[0]
    # Turn the output into one-hot encoding
    out_seq = to_categorical([out_seq], num_classes=vocab_size)[0]
    # Add the corresponding image to the boostrap token file
    image_data.append(features[img_no])
    # Cap the input sentence to 48 tokens and add it
    X.append(in_seq[-48:])
    y.append(out_seq)
    return np.array(X), np.array(y), np.array(image_data)

    X, y, image_data = preprocess_data(train_sequences, train_features)

    In [ ]:
    #Create the encoder
    image_model = Sequential()
    image_model.add(Conv2D(16, (3, 3), padding='valid', activation='relu', input_shape=(256, 256, 3,)))
    image_model.add(Conv2D(16, (3,3), activation='relu', padding='same', strides=2))
    image_model.add(Conv2D(32, (3,3), activation='relu', padding='same'))
    image_model.add(Conv2D(32, (3,3), activation='relu', padding='same', strides=2))
    image_model.add(Conv2D(64, (3,3), activation='relu', padding='same'))
    image_model.add(Conv2D(64, (3,3), activation='relu', padding='same', strides=2))
    image_model.add(Conv2D(128, (3,3), activation='relu', padding='same'))

    image_model.add(Flatten())
    image_model.add(Dense(1024, activation='relu'))
    image_model.add(Dropout(0.3))
    image_model.add(Dense(1024, activation='relu'))
    image_model.add(Dropout(0.3))

    image_model.add(RepeatVector(max_length))

    visual_input = Input(shape=(256, 256, 3,))
    encoded_image = image_model(visual_input)

    language_input = Input(shape=(max_length,))
    language_model = Embedding(vocab_size, 50, input_length=max_length, mask_zero=True)(language_input)
    language_model = LSTM(128, return_sequences=True)(language_model)
    language_model = LSTM(128, return_sequences=True)(language_model)

    #Create the decoder
    decoder = concatenate([encoded_image, language_model])
    decoder = LSTM(512, return_sequences=True)(decoder)
    decoder = LSTM(512, return_sequences=False)(decoder)
    decoder = Dense(vocab_size, activation='softmax')(decoder)

    # Compile the model
    model = Model(inputs=[visual_input, language_input], outputs=decoder)
    optimizer = RMSprop(lr=0.0001, clipvalue=1.0)
    model.compile(loss='categorical_crossentropy', optimizer=optimizer)
    In [ ]:
    #Save the model for every 2nd epoch
    filepath="org-weights-epoch-{epoch:04d}--val_loss-{val_loss:.4f}--loss-{loss :.4f}.hdf5"
    checkpoint = ModelCheckpoint(filepath, monitor='val_loss', verbose=1, save_weights_only=True, period=2)
    callbacks_list = [checkpoint]
    In [ ]:
    # Train the model
    model.fit([image_data, X], y, batch_size=64, shuffle=False, validation_split=0.1, callbacks=callbacks_list, verbose=1, epochs=50)

以上仅为大家提供一个深度学习开发的一个初步概念,本人也在学习中,有错误或者不完善请斧整~

  • Keras
    2 引用
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    132 引用 • 189 回帖
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    53 引用 • 40 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Hadoop

    Hadoop 是由 Apache 基金会所开发的一个分布式系统基础架构。用户可以在不了解分布式底层细节的情况下,开发分布式程序。充分利用集群的威力进行高速运算和存储。

    86 引用 • 122 回帖 • 625 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 3 关注
  • abitmean

    有点意思就行了

    29 关注
  • Mobi.css

    Mobi.css is a lightweight, flexible CSS framework that focus on mobile.

    1 引用 • 6 回帖 • 733 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 376 关注
  • GitHub

    GitHub 于 2008 年上线,目前,除了 Git 代码仓库托管及基本的 Web 管理界面以外,还提供了订阅、讨论组、文本渲染、在线文件编辑器、协作图谱(报表)、代码片段分享(Gist)等功能。正因为这些功能所提供的便利,又经过长期的积累,GitHub 的用户活跃度很高,在开源世界里享有深远的声望,并形成了社交化编程文化(Social Coding)。

    209 引用 • 2031 回帖
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    167 引用 • 1513 回帖
  • webpack

    webpack 是一个用于前端开发的模块加载器和打包工具,它能把各种资源,例如 JS、CSS(less/sass)、图片等都作为模块来使用和处理。

    41 引用 • 130 回帖 • 261 关注
  • 开源

    Open Source, Open Mind, Open Sight, Open Future!

    408 引用 • 3574 回帖
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 633 关注
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 175 关注
  • Ubuntu

    Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的 Linux 操作系统,其名称来自非洲南部祖鲁语或豪萨语的“ubuntu”一词,意思是“人性”、“我的存在是因为大家的存在”,是非洲传统的一种价值观,类似华人社会的“仁爱”思想。Ubuntu 的目标在于为一般用户提供一个最新的、同时又相当稳定的主要由自由软件构建而成的操作系统。

    125 引用 • 169 回帖 • 1 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    351 引用 • 1814 回帖
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 43 关注
  • SendCloud

    SendCloud 由搜狐武汉研发中心孵化的项目,是致力于为开发者提供高质量的触发邮件服务的云端邮件发送平台,为开发者提供便利的 API 接口来调用服务,让邮件准确迅速到达用户收件箱并获得强大的追踪数据。

    2 引用 • 8 回帖 • 483 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    186 引用 • 318 回帖 • 302 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    198 引用 • 550 回帖
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖
  • Solidity

    Solidity 是一种智能合约高级语言,运行在 [以太坊] 虚拟机(EVM)之上。它的语法接近于 JavaScript,是一种面向对象的语言。

    3 引用 • 18 回帖 • 399 关注
  • CodeMirror
    1 引用 • 2 回帖 • 129 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 27 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 9 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 531 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 167 关注
  • ZeroNet

    ZeroNet 是一个基于比特币加密技术和 BT 网络技术的去中心化的、开放开源的网络和交流系统。

    1 引用 • 21 回帖 • 638 关注