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

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

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

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

    • 线性回归,可以有多个入参,但是入参对应的幂指数都是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)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    135 引用 • 190 回帖
  • 深度学习

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

    53 引用 • 40 回帖 • 1 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 483 关注
  • Rust

    Rust 是一门赋予每个人构建可靠且高效软件能力的语言。Rust 由 Mozilla 开发,最早发布于 2014 年 9 月。

    58 引用 • 22 回帖
  • BND

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

    107 引用 • 1281 回帖 • 34 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 216 关注
  • Firefox

    Mozilla Firefox 中文俗称“火狐”(正式缩写为 Fx 或 fx,非正式缩写为 FF),是一个开源的网页浏览器,使用 Gecko 排版引擎,支持多种操作系统,如 Windows、OSX 及 Linux 等。

    8 引用 • 30 回帖 • 410 关注
  • 开源

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

    407 引用 • 3578 回帖
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    7 引用 • 40 回帖
  • ngrok

    ngrok 是一个反向代理,通过在公共的端点和本地运行的 Web 服务器之间建立一个安全的通道。

    7 引用 • 63 回帖 • 626 关注
  • IDEA

    IDEA 全称 IntelliJ IDEA,是一款 Java 语言开发的集成环境,在业界被公认为最好的 Java 开发工具之一。IDEA 是 JetBrains 公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。

    181 引用 • 400 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 1 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 672 关注
  • 星云链

    星云链是一个开源公链,业内简单的将其称为区块链上的谷歌。其实它不仅仅是区块链搜索引擎,一个公链的所有功能,它基本都有,比如你可以用它来开发部署你的去中心化的 APP,你可以在上面编写智能合约,发送交易等等。3 分钟快速接入星云链 (NAS) 测试网

    3 引用 • 16 回帖 • 6 关注
  • 导航

    各种网址链接、内容导航。

    42 引用 • 175 回帖
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 528 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖
  • Mobi.css

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

    1 引用 • 6 回帖 • 745 关注
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    51 引用 • 25 回帖
  • 人工智能

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

    135 引用 • 190 回帖
  • PostgreSQL

    PostgreSQL 是一款功能强大的企业级数据库系统,在 BSD 开源许可证下发布。

    22 引用 • 22 回帖 • 2 关注
  • WebClipper

    Web Clipper 是一款浏览器剪藏扩展,它可以帮助你把网页内容剪藏到本地。

    3 引用 • 9 回帖 • 4 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 363 关注
  • NGINX

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

    313 引用 • 547 回帖
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖 • 1 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 76 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    88 引用 • 1235 回帖 • 410 关注
  • 996
    13 引用 • 200 回帖 • 11 关注