Shu's Garden - 机器学习
type: channel
link: https://www.sitstars.com/category/Machine-Learning/
items: PaddlePaddle飞桨课程学习Day3-5：手写数字识别与CNN
items: PaddlePaddle飞桨课程学习Day2：波士顿房价模型改写
items: PaddlePaddle飞桨课程学习Day1：深度学习简介与入门模型
items: 【译】PyTorch官方教程第一章：深度学习入门与PyTorch库
items: 用AI识别二次元妹子特征
items: 0基础入门神经网络系列文章汇总
items: 机器学习相关概念汇总
items: 0基础入门神经网络：递归神经网络(RNN)
items: 0基础入门神经网络：卷积神经网络(CNN)02
items: 0基础入门神经网络：卷积神经网络(CNN)01

PaddlePaddle飞桨课程学习Day3-5：手写数字识别与CNN
type: item
date: 2020-08-16T15:05:10+08:00
description: 前言：手写数字识别如果说波士顿房价预测是机器学习中的hello world,，那么手写数字识别就是深度学习中的hello world。在处理如下图所示的手写邮政编码的简单图像分类任务时，可以使用基于MNIST数据集的手写数字识别模型。MNIST是深度学习领域标准、易用的成熟数据集，包含60000条训练样本和10000条测试样本。 任务输入：一系列手写数字图片，其中每张图片都是28x28的像素矩阵。任务输出：经过了大小归一化和居中处理，输出对应的0~9的数字标签。本次任务使用的网络模型为卷积神经网络（CNN），它被广泛应用于图像识别，自然语言等领域。该任务同样遵循五步走战略，即数据处理—模型设计—训练配置—训练过程—模型保存 极简版本的实现代码import paddle import paddle.fluid as fluid from paddle.fluid.dygraph.nn import Linear import numpy as np import os from PIL import Image class MNIST(fluid.dygraph.Layer): def __init__(self): super(MNIST,self).__init__() # 定义一层全连接层，输出维度1，激活函数None self.fc = Linear(input_dim = 784,output_dim=1) # 前向计算 def forward(self,inputs): outputs = self.fc(inputs) return outputs # 创建动态图工作环境 with fluid.dygraph.guard(): # 声明网络结构 model = MNIST() # 启动训练模式 model.train() # 定义读取函数 train_loader = paddle.batch(paddle.dataset.mnist.train(),batch_size=16) # 定义优化器，使用SGD，学习率设置为0.001 optimizer = fluid.optimizer.SGDOptimizer(learning_rate=0.001,parameter_list=model.parameters()) epoch_num = 10 # 10次大循环 for epoch in range(epoch_num): for batch_id,data in enumerate(train_loader()): # 数据格式转换 img_data = np.array([x[0] for x in data]).astype("float32") label_data = np.array([x[1] for x in data]).astype("float32").reshape(-1,1) # 为了loss计算，最后一维要是1。-1是占位符，这个位置是为了batch_size预留的 # 将数据转为飞桨动态图格式 img = fluid.dygraph.to_variable(img_data) label = fluid.dygraph.to_variable(label_data) # 前向计算 predict = model.forward(img) # 计算损失 loss = fluid.layers.square_error_cost(predict,label) avg_loss = fluid.layers.mean(loss) # 每训练1000次数据就打印一次 if batch_id != 0 and batch_id % 1000 == 0: print("epoch is {},batch is {}, loss is {}".format(epoch,batch_id,avg_loss.numpy())) # 后向传播 avg_loss.backward() # 更新参数 optimizer.minimize(avg_loss) # 最小化损失 model.clear_gradients() # 清除梯度 # 保存模型 fluid.save_dygraph(model.state_dict(), 'mnist')说明：飞桨提供了多个封装好的数据集API，涵盖计算机视觉、自然语言处理、推荐系统等多个领域，帮助读者快速完成深度学习任务。如在手写数字识别任务中，通过paddle.dataset.mnist可以直接获取处理好的MNIST训练集、测试集。飞桨将维度是28*28的手写数字图像转成向量形式存储，因此使用飞桨数据加载器读取到的手写数字图像是长度为784（28*28）的向量。pa…

PaddlePaddle飞桨课程学习Day2：波士顿房价模型改写
type: item
date: 2020-08-13T17:37:00+08:00
description: 课程链接：https://aistudio.baidu.com/aistudio/education/group/info/1297深度学习框架介绍在构建模型的过程中，每一步所需要完成的任务均可以拆分成个性化和通用化两个部分。个性化部分：往往是指定模型由哪些逻辑元素组合，由建模者完成。通用部分：聚焦这些元素的算法实现，由深度学习框架完成。 用飞桨重写房价预测模型首先说明一下，代码是我看官方教程一点点手打的，可能有部分地方是按我的想法写的，与官方教程不一致，不过测试是成功运行的。导入库首先加载相关库#加载飞桨、Numpy和相关类库 import paddle import paddle.fluid as fluid import paddle.fluid.dygraph as dygraph from paddle.fluid.dygraph import Linear import numpy as np import os import random代码中参数含义如下：paddle/fluid：飞桨的主库，目前大部分的实用函数均在paddle.fluid包内。dygraph：动态图的类库。Linear：神经网络的全连接层函数，即包含所有输入权重相加和激活函数的基本神经元结构。在房价预测任务中，使用只有一层的神经网络（全连接层）来实现线性回归模型。说明：飞桨支持两种深度学习建模编写方式，更方便调试的动态图模式和性能更好并便于部署的静态图模式。静态图模式（声明式编程范式，类比C++）：先编译后执行的方式。用户需预先定义完整的网络结构，再对网络结构进行编译优化后，才能执行获得计算结果。（写完所有代码，才能编译并执行）动态图模式（命令式编程范式，类比Python）：解析式的执行方式。用户无需预先定义完整的网络结构，每写一行网络代码，即可同时获得计算结果。（写一行代码就可执行）为了学习模型和调试的方便，本教程均使用动态图模式编写模型。在后续的资深教程中，会详细介绍静态图以及将动态图模型转成静态图的方法。仅在部分场景下需要模型转换，并且是相对容易的。数据处理和上一篇文章是一样的，拆分测试集，随机抽样，归一化，这里不细说了。def load_data(): # 数据处理 data = np.fromfile('housing.data',sep = ' ') feature_names = [ 'CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV' ] feature_num = len(feature_names) data = data.reshape([data.shape[0]//feature_num,feature_num]) # 拆分训练集 ratio = 0.8 training_data = data[:int(data.shape[0]*ratio),:] # 归一化 maximums, minimums, avgs = np.max(training_data,axis = 0),np.min(training_data,axis = 0),\ np.average(training_data,axis = 0) global range_value # 定义全局变量，以便预测时仍然可以用归一化参数 global avgs_value range_value = maximums - minimums avgs_value = avgs data = (data - avgs) / range_value # 把归一化的数据重新划分为训练集和测试集 training_data = data[:int(data.shape[0]*ratio),:] test_data = data[int(data.shape[0]*ratio):,:] return training_data, test_data模型设计模型定义的实质是定义线性回归的网络结构，飞桨建议通过创建Python类的方式完成模型网络的定义，即定义init函数和forward函数。forward函数是框架指定实现前向计算逻辑的函数，程序在调用模型实例时会自动执行forward方法。在forward函数中使用的网络层需要在init函数中声明。实现过程分如下两步：定义init函数：在类的初始化函数中声明每一层网络的实现函数。在房价预测模型中，只需要定义一层全连接层。定义forward函数：构建神经网络结构，实现前向计算过程，并返回预测结果，在本任务中返回的是房价预测结果。class Regressor(fluid…

PaddlePaddle飞桨课程学习Day1：深度学习简介与入门模型
type: item
date: 2020-08-12T08:10:00+08:00
description: 前言笔记来自百度架构师手把手带你零基础实践深度学习课程，第一天听下来，我感觉老师讲得还是非常深入浅出，通俗易懂的。推荐大家学一下。课程链接：https://aistudio.baidu.com/aistudio/education/group/info/1297虽然课程标题里说是零基础，但就和之前介绍过的零基础实现神经网络系列文章一样，这里的零基础指的是深度学习零基础。至少你要熟悉python编程，了解基本的数学原理（主要是线性代数和微积分），和部分库（比如Numpy）。博主在学习python和numpy的时候做了一点笔记，可以参考一下：[post url="https://econ.wiki//wiki//编程语言//python//01 基础 Python笔记//" title="python基础语法" intro="雁陎做的关于python语法的笔记"][post url="https://econ.wiki//wiki//编程语言//python//02 numpy库//" title="numpy基础语法" intro="雁陎做的关于numpy语法的笔记"]综述人工智能、机器学习、深度学习的关系概括来说，人工智能、机器学习和深度学习覆盖的技术范畴是逐层递减的。人工智能是最宽泛的概念。机器学习是当前比较有效的一种实现人工智能的方式。深度学习是机器学习算法中最热门的一个分支。如下图 机器学习机器学习的实现机器学习的实现可以分成两步：训练和预测，类似于我们熟悉的归纳和演绎。训练即从样本中抽样出输入和输出的关系，预测即给定新的输入，计算输出。机器学习的方法论图3 是以$H$为模型的假设，它是一个关于参数$W$和输入$X$的函数，用$H(W, X)$ 表示。模型的优化目标是$H(W, X)$的输出与真实输出$Y$尽量一致，两者的相差程度即是模型效果的评价函数（相差越小越好）。那么，确定参数的过程就是在已知的样本上，不断减小该评价函数（$H(W, X)$ 和$Y$相差）的过程，直到学习到一个参数$W$，使得评价函数的取值最小。这个衡量模型预测值和真实值差距的评价函数也被称为损失函数（损失Loss）。 最小化损失是模型的优化目标，实现损失最小化的方法称为优化算法，也称为寻解算法（找到使得损失函数最小的参数解）。参数$W$和输入$X$组成公式的基本结构称为假设。由此可见，模型假设、评价函数（损失/优化目标）和优化算法是构成模型的三个部分。那么这三个部分是如何支撑机器学习流程的呢？如下图 所示： 模型假设：预先圈定好Y~X可能的关系（函数）集（篮圈），以提高训练效率。评价函数：如何确定该函数就是我们要找的？定义一个评价函数，同样将拟合的误差最小作为优化目标。优化算法：在关系可能性集中，寻找使得评价指标最优（损失函数最小/最拟合已有观测样本）的参数，这个寻找的方法即为优化算法。最笨的优化算法即按照参数的可能，穷举每一个可能取值来计算损失函数，保留使得损失函数最小的参数作为最终结果。机器执行学习的框架体现了其学习的本质是“参数估计”（Learning is parameter estimation）。在此基础上，许多看起来完全不一样的问题都可以使用同样的框架进行学习，如科学定律、图像识别、机器翻译和自动问答等，它们的学习目标都是拟合一个“大公式”，如 图5 所示。 深度学习深度学习与机器学习在理论结构上是一致的，即：模型假设、评价函数和优化算法，其根本差别在于假设的复杂度，如下图所示。 这种复杂程度已经无法单纯用数学公式表达，因此研究者设计了神经网络的模型。神经网络人工神经网络包括多个神经网络层，如卷积层、全连接层、LSTM等，每一层又包括很多神经元，超过三层的非线性神经网络都可以被称为深度神经网络。通俗的讲，深度学习的模型可以视为是输入到输出的映射函数，如图像到高级语义（美女）的映射，足够深的神经网络理论上可以拟合任何复杂的函数。因此神经网络非常适合学习样本数据的内在规律和表示层次，对文字、图像和语音任务有很好的适用性。因为这几个领域的任务是人工智能的基础模块，所以深度学习被称为实现人工智能的基础也就不足为奇了。神经网络结构如 图7 所示。 一些基本概念：神经元： 神经网络中每个节点称为神经元，由两部分组成：加权和：将所有输入加权求和。非线性变换（激活函数）：加权和的结果经过一个非线性函数变换，让神经元计算具备非线性的能力。多层连接： 大量这样的节点按照不同的层次排布，形成多层的结构连接起来，即称为神经网络。前向计算： 从输入计算输出的过程，顺序从网络前至后。计算图： 以图形化的方式展现神经网络的计算逻辑又称为计算图。我们也可以将神经网络的计算图以公式的方式表达如下：$$Y =f_3 ( f_2 ( f_1 ( w_1\cdot x_1…

【译】PyTorch官方教程第一章：深度学习入门与PyTorch库
type: item
date: 2020-07-24T22:13:11+08:00
description: 这份官方教程在7月初发布的，等到现在好像也没有汉化版，所以直接上手学了，顺便把我翻译的章节放上来。原书地址：https://PyTorch.org/assets/deep-learning/Deep-Learning-with-PyTorch.pdf配套代码：https://github.com/deep-learning-with-PyTorch/dlwpt-code本书论坛：https://livebook.manning.com/#!/book/deep-learning-with-PyTorch/discussion[scode type="yellow"]本人深度学习小白，英文水平极其有限，大部分地方都借助了翻译软件，仅作为学习过程的记录，大家学的话还是直接看原文或者等其他人翻译。另：有删减。[/scode]深度学习革命为了领会这种深度学习方法所带来的范式转变，让我们回过头来看一看。直到过去十年，机器学习严重依赖于特征工程（feature engineering）。特征是对输入数据的转换，便于下游算法（如分类器）在新数据上产生正确的结果。特征工程包括提出正确的变换，以便下游算法能够解决一个任务。例如，为了区分手写数字图像中的1和0，我们会想出一组滤波器来估计图像上的边缘方向，然后训练一个分类器来预测给定边缘方向分布的正确数字。另一个有用的特征可能是封闭的孔的数量，如0、8。深度学习则从原始数据中自动找到这样的表征，以成功执行任务。在1与0的例子中，过滤器会在训练过程中通过反复观察成对的例子和目标标签来完善。这并不是说深度学习中没有特征工程，我们经常需要在学习系统中注入某种形式的先验知识。然而，神经网络能够摄取数据，并在例子的基础上提取有用的表征，这就是深度学习的强大之处。深度学习从业者的关注点并不在于手动制作这些表征，而是在数学实体上进行操作，使其从训练数据中自主发现表征。通常情况下，这些自动创建的特征比那些手动制作的特征更好！与许多颠覆性技术一样，这一事实导致了观念的改变。在图1.1的左侧，我们看到一个从业者正在忙着定义工程特征，并将其输入到学习算法中；任务的结果将和从业者的工程特征一样好。右边是深度学习，原始数据被输入到算法中，算法自动提取分层特征，在算法的引导下，优化自己的任务表现；结果将和从业者的表现一样好，以驱动算法向目标前进。 图1.1：由于数据的增长和计算需求，深度学习从手动提取特征中解脱出来从图1.1的右侧，我们已经可以窥见成功执行深度学习所需要的条件：我们需要有办法提取我们手头的任何数据。我们需要以某种方式定义深度学习机器。我们必须有一种自动化的方式，训练，以获得有用的表征，并使机器产生期望的输出。这就需要我们仔细研究一下我们一直在说的训练这件事。在训练过程中，我们使用一个标准，一个闹喊模型输出和参考数据的实值函数，为我们模型的期望输出和实际输出之间的差异打分（按照惯例，分数越低越好）。 训练包括通过逐步修改我们的深度学习机器来推动标准向更低的分数发展，直到它达到低分数。PyTorch为什么选PyTorch？它简单易用，足够Pythonic，任何python编程老手都会感到熟悉。具体来说，PyTorch提供了一种数据类型：张量（Tensor），用于存放数字、向量、矩阵、数组等，并提供了相应的函数。如果你熟悉numpy库的话，应该会更容易上手。PyTorch提供了GPU加速计算，这比CPU快了50倍。另外，PyTorch在数据运算方面进行了优化。这两个特性对于任何科学计算都是有用的，因此不打算深度学习的老哥也可以尝试学习。PyTorch的一个设计驱动因素是表达能力，它允许开发人员实现复杂的模型，而不会因为库（它不是一个框架）过于复杂而受到影响。基于这个原因，PyTorch在研究中得到了广泛的采用，国际会议上的高引用率就证明了这一点PyTorch配置了C++，这使得它可以在脱离python的环境中运行，这个特性增强了其灵活性。为了更好学习本书，你需要以下两个条件：有一定的Python编程经验。我们不打算在教授python上花费时间；你需要了解 Python 数据类型、类、浮点数字等。愿意深入研究并动手操作。我们将从基础开始，积累我们的工作知识，如果你跟着我们一起学习，你会学得更轻松。本书专注于实用的PyTorch，目的是覆盖足够的领域，让你能够用深度学习解决现实世界的机器学习问题，比如在视觉领域，或者探索研究文献中出现的新模型。与深度学习研究相关的大部分文献都可以在https://arxiv.org中找到。PyTorch如何支持深度学习项目让我们通过研究深度学习项目需要从pytoch中获得什么，来更好地了解PyTorch的构成。首先，PyTorch的 "Py "如同Python中的 "Py"，但其中有很…

用AI识别二次元妹子特征
type: item
date: 2020-01-08T14:50:00+08:00
description: 在量子位上看到了这个AI，觉得蛮有意思的，体验下来准确率也不错，分享给大家。开源代码地址：https://github.com/KichangKim/DeepDanbooru在线测试地址：http://kanotype.iptime.org:8003/deepdanbooru/数据集下载工具：https://github.com/KichangKim/DanbooruDownloader该程序使用python 3.6与tensorflow编写数据集与结构作者使用的数据集是danbooru网站上爬下来的数据，该网站对每个二次元画像都贴上了标签，因此将标签与图片一一对应，存到数据库（sqlite）中，就可以进行训练了。你可以使用作者提供的一个下载器（有releases版本，无需编译），自动生成所需要的数据集，也可以使用自己的数据集，但是文件夹结构必须如下：MyDataset/ ├── images/ │ ├── 00/ │ │ ├── 00000000000000000000000000000000.jpg │ │ ├── ... │ ├── 01/ │ │ ├── ... │ └── ff/ │ ├── ... └── my-dataset.sqlite其中，sqlite数据库结构如下：posts ├── id (INTEGER) ├── md5 (TEXT) ├── file_ext (TEXT) ├── tag_string (TEXT) └── tag_count_general (INTEGER)这里需要注意一点，MyDataset中的图片名一定要是[md5].[file_ext]格式，使用自己的数据集时不必使用真实的md5值，但也要保证一一对应。tag_count_general用于项目设置，会使用超过tag_count_general值的数据进行训练。项目(project)结构如下，可调整project.json里的各项设置进行训练。MyProject/ ├── project.json └── tags.txt当然，如果你只是想体验一下不想训练，作者提供了一个在线测试网站，你可以直接上传图片获取标签。或者，作者也提供了一个预训练的模型，可以直接使用。详细使用过程见下文。环境配置首先我们要配置好环境，我们直接下载release版本即可，其中deepdanbooru-v1-20191108-sgd-e30.zip是预训练模型，Source code是源代码，前一个是可选的。但是因为我太懒了电脑性能不够好，所以直接使用他的模型了。据量子位说作者用的是Ryzen 7 1800X + Geforce 1070，花了28天才训练成功，我觉得我电脑撑不住……把源代码下载下来，解压缩并重命名为DeepDanbooru，然后cd到该文件夹。因为第一个发行版本作者并没有把requirements.txt打包进去，所以我们需要手动新建一个txt文档，把以下内容复制进去Click>=7.0 numpy>=1.16.2 scikit-image>=0.15.0 tensorflow>=2.1.0rc1 requests>=2.22.0 six>=1.13.0然后运行pip install -r requirements.txt就可以安装所有需要的包了，当然，你也可以手动一个个pip安装。 安装tensorflow时可能会遇到这两个错误，使用相应的解决方案即可。ERROR: google-auth 1.10.0 has requirement setuptools>=40.3.0, but you'll have setuptools 39.1.0 which is incompatible. # 错误代码，原因是setuptools版本过低，升级一下即可 pip install --upgrade setuptools # 解决方案 ERROR: Cannot uninstall 'wrapt'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall. # 错误代码 pip install -U --ignore-installed wrapt enum34 simplejson netaddr # 解决方案然后单独安装tensorflowpip install tensorflowok，环境已经基本配置完毕。接下来就是添加数据集文件夹和项目文件夹。为了图省事，我们就直接把预训练模型deepdanbooru…

0基础入门神经网络系列文章汇总
type: item
date: 2019-10-24T01:41:00+08:00
description: 这一系列文章均来自Victor Zhou，他对神经网络的讲解，让我这个数学基础贼差的人也能够很容易地理解，所以决定进行翻译，作为我机器学习的入门教程吧。作者后续发表的相关文章均会汇总到这里。如果我在机器学习领域发现了其他能够补充的材料，也会放到这里。[scode type="red"]提醒：译者英语水平和机器学习水平都很有限，有能力的同学最好去看原文，如果您发现哪里有翻译错误，欢迎留言指出。[/scode] 这个四篇系列文章特别针对初学者，为理解神经网络提供了一种面向基本原理的方法。在深入研究两种流行的变体：递归神经网络（RNN）和卷积神经网络（CNN）之前，我们将为初学者提供经典神经网络的介绍。对于每种类型的网络，我们将：查看网络的结构。了解使用该类型网络的动机。介绍一个可以使用该网络解决的现实问题。手动推导训练我们特定问题的网络所需的梯度。在Python中完全从头开始（仅使用numpy）实现功能全面的网络。知识背景无需机器学习或神经网络知识基础，但是，以下知识背景可以帮助你更快入门：多元微积分，用于得出训练我们的网络所需的梯度时使用。如果您没有该知识背景，可以跳过这些梯度推导。线性代数，特别是矩阵，通常是表示神经网络权重的最佳方法。Python 3，仅需基础水平即可。译者注：虽然作者说仅要求基础，但是还是建议大家（1）掌握python序列、函数、类、循环、条件等相关概念，尤其是类，其实我觉得它已经超出了基础的范畴……（2）掌握numpy库，这个熟悉一遍了解各个方法的作用就行，我当时是专门学了一遍的，不过被秩轴位的概念搞疯了……（3）如上所述，需要你掌握多元微积分，不过这个好像高中就讲过了，至少我一个文科生都懂；线性代数，回去翻翻教材吧……译者在学python和numpy的时候做了笔记，你可以参考：[post url="https://wiki.sitstars.com//wiki//编程语言//python//01%20基础%20Python笔记//" title="python基础语法" intro="雁陎做的关于python语法的笔记"][post url="https://wiki.sitstars.com//wiki//编程语言//python//02%20numpy库//" title="numpy基础语法" intro="雁陎做的关于numpy语法的笔记"]系列文章基础-softmax[post cid="45" /]在正式入门神经网络之前，推荐大家先看一下上面这个关于softmax的简要介绍，因为从第二篇文章起就要开始用到，而且是CNN和RNN重要组成部分。阅读顺序如下，主要是根据一些概念出现的顺序来决定的，如果跳读的话很有可能遇到一些不明白的概念，又要回过头看前面的文章。[post cid="44" /][post cid="46" /][post cid="47" /][post cid="48" /]持续更新中……另外我专门为这篇文章写了一篇名词手册，包含了中英文对照，您可随时查阅：[post cid="49" /]更深入地学习想要更深入地学习？可以参考以下内容：使用Keras构建您的第一个神经网络。学习合适的机器学习库，例如更大/更好的神经网络Tensorflow，Keras和PyTorch。尝试使用神经网络来参与Kaggle数据科学竞赛。斯坦福大学CS231n（关于CNN）课程的笔记。Coursera上有许多优秀的神经网络。

机器学习相关概念汇总
type: item
date: 2019-10-24T01:39:00+08:00
description: 本文记录了机器学习中所有可能遇到的概念，按先后顺序排列，同时列出英文以便查询。在部分概念下列有解释，也有超链接跳转。随时更新中……[scode type="green"]20200714更新：发现一个机器学习术语表，值得收藏：https://aminer.cn/ml_taxonomy[/scode]基础篇神经元：Neurons神经网络中，连接输入和输出的节点就是神经元，它接受给定的输入，进行运算后输出给下一层。权重：weight偏置：biasBias是 “用所有可能的训练数据集训练出的所有模型的输出的平均值” 与 “真实模型”的输出值之间的差异；方差：VarianceVariance是“不同的训练数据集训练出的模型”的输出值之间的差异。偏置与方差的解释来自知乎@J JR梯度：gradient梯度的本意是一个向量（矢量），表示某一函数在该点处的方向导数沿着该方向取得最大值，即函数在该点处沿着该方向（此梯度的方向）变化最快，变化率最大梯度与方向导数密切相关，想了解更多请点击名词上的超链接。激活函数：activation function简单来说，就是上层输入节点与下层输出节点之间的函数关系，它定义了该节点在给定的输入或输入的集合下的输出S型激活函数：sigmoid activation function将无界的输入转化为(0,1)输出的函数前馈神经网络：feedforward neural network前馈神经网络是一种最简单的神经网络，各神经元分层排列。每个神经元只与前一层的神经元相连。接收前一层的输出，并输出给下一层．各层间没有反馈。均方误差：mean squared error，MSE损失函数：loss functions反向传播算法：Backpropagation，BP反向传播是“误差反向传播”的简称，该方法对网络中所有权重计算损失函数的梯度。这个梯度会反馈给最优化方法，用来更新权值以最小化损失函数。随机梯度下降：Stochastic Gradient Descent，SGD梯度下降：我们知道曲面上方向导数的最大值的方向就代表了梯度的方向，因此我们在做梯度下降的时候，应该是沿着梯度的反方向进行权重的更新，可以有效的找到全局的最优解。随机梯度下降（SGD）也称为增量梯度下降，是一种迭代方法，用于优化可微分目标函数。该方法通过在小批量数据上计算损失函数的梯度而迭代地更新权重与偏置项。学习率：learning rate即参数的更新速率卷积：convolution两个函数的加权叠加，用数学公式表示为$(f·g)(n)$连续的定义为：$$( f * g ) ( n ) = \int _ { - \infty } ^ { \infty } f ( \tau ) g ( n - \tau ) d \tau$$离散的定义为：$$( f * g ) ( n ) = \sum _ { \tau = - \infty } ^ { \infty } f ( \tau ) g ( n - \tau )$$卷机层：Convolutional layer卷积核：filter卷积核就是图像处理时，给定输入图像，输入图像中一个小区域中像素加权平均后成为输出图像中的每个对应像素，其中权值由一个函数定义，这个函数称为卷积核。卷积神经网络：Convolution Neural Networks，CNN逐元素乘法：element-wise multiplication索伯算子：Sobel operator也称索贝滤波器，在在影像处理及电脑视觉领域中常被用来做边缘检测。填充：Padding池化：Pooling我们之所以使用卷积后的特征，是因为图像具有“静态型”的属性，也就意味着在一个图像区域的特征极有可能在另一个区域同样适用。所以，当我们描述一个大的图像的时候就可以对不同位置的特征进行聚合统计（例如：可以计算图像一个区域上的某个特定特征的平均值 or 最大值）这种统计方式不仅可以降低纬度，还不容易过拟合。这种聚合统计的操作就称之为池化，或平均池化、最大池化。交叉熵损失：cross-entropy loss交叉熵主要用于度量两个概率分布间的差异性信息。前向（传播）阶段、后向传播阶段：forward phase，backward phase卷积神经网络的训练过程分为两个阶段。第一个阶段是数据由低层次向高层次传播的阶段，即前向传播阶段。另外一个阶段是，当前向传播得出的结果与预期不相符时，将误差从高层次向底层次进行传播训练的阶段，即反向传播阶段。反向传播：backpropagated or backprop递归神经网络：Recurrent Neural Networks，RNN自然语言处理：Natural Language Processing (NLP)独热编码：One…

0基础入门神经网络：递归神经网络(RNN)
type: item
date: 2019-10-24T00:11:00+08:00
description: 原文地址为什么使用RNN？递归神经网络（Recurrent Neural Networks，RNN）是一种专门处理序列的神经网络。由于它们在处理文本方面的有效性，因此经常用于自然语言处理（NLP）任务。在本文中，我们将探讨RNN是什么，了解它们的工作原理，并在Python中从头开始构建一个真正的RNN。（仅使用numpy）。这篇文章假定您具有神经网络的基础知识。建议先阅读神经网络基础最原始（vanilla，原意为香草，在机器学习中等同于raw）的神经网络和CNNs存在一个问题：只能接受固定的输入并产生固定的输出。RNN则不同，它可以接受并输出可变长度序列，以下是RNN的一些例子： 输入为红色，RNN本身为绿色，输出为蓝色。资料来源：Andrej Karpathy这种处理序列的能力使RNN非常有用。例如：机器翻译（例如Google Translate）使用“多对多” 型RNN进行。原始文本序列输送到RNN，然后RNN生成翻译后的文本并输出。情绪分析（例如，这是正面还是负面的评价？）通常使用“多对一”的RNN进行。将要分析的文本输入到RNN中，然后生成一个单一的输出分类（例如，这是正面的评价）。在本文的后半部分，我们将构建一个“多对一”式的RNN，实现一个最简单的情感分析功能如何做？让我们考虑一个“多对多”式的RNN，它接受$x _ { 0 } , x _ { 1 } , \dots x _ { n }$的输入，并产生$y _ { 0 } , y _ { 1 } , \dots y _ { n }$的输出，xi和yi可以是任意维度的向量。RNN借助一个迭代更新的 隐状态（hidden state）h来工作，h也是一个任意维度的向量。在任意给定的步长t上，有：下一个 隐状态$h_t$通过先前的 隐状态$h_{t-1}$和下一个输入 $x_t$计算而来。下一个输出$y_t$由$h_t$计算而来。 一个多对多RNN这就是使RNN 反复出现的原因：它对每个步骤使用相同的权重。更具体地说，典型的原始RNN仅使用3组权重来执行其计算：$W_{xh}$用于所有的$x_t\to h_t$链接$W_{hh}$用于所有的$h_{t-1}\to h_t$链接$W_{hy}$用于所有的$h_t\to y_t$链接同时我们为RNN应用两个偏置（biases）：$b_h$，计算$h_t$的时候需要加上它。$b_y$，计算$y_t$的时候需要加上它。我们用矩阵表示权重，用向量表示偏置。这3个权重和2个偏置构成了整个RNN！以下是将所有内容组合在一起的方程式：$$\begin{array} { c } { h _ { t } = \tanh \left( W _ { x h } x _ { t } + W _ { h h } h _ { t - 1 } + b _ { h } \right) } \\ { y _ { t } = W _ { h y } h _ { t } + b _ { y } } \end{array}$$不要跳过这些方程式。停下来思考一下。另外，请记住，权重是矩阵，其他变量是向量。所有的权重都使用矩阵乘法，并且将偏置加到乘积结果中。然后，我们将tanh用作第一个方程式的激活函数（但是也可以使用S型等其他激活函数）。问题我们将从头开始实现RNN，以执行简单的情感分析任务：确定给定的文本字符串是正面的还是负面的。这是我为本文汇总的小型数据集的一部分：TextPositive?i am good✓i am bad❌this is very good✓this is not bad✓i am bad not good❌i am not at all happy❌this was good earlier✓i am not at all bad or sad right now✓计划由于这是一个分类问题，因此我们将使用“多对一” RNN。这类似于我们之前讨论的“多对多” RNN，但是它仅使用最终的 隐状态来输出y 多对一RNN每 个$x_i$将是一个向量，代表文本中的一个单词。输出$y$是一个包含两个数字的向量，一个代表正面，另一个代表负面。我们将用Softmax将这些值转换为概率，并最终确定正负。让我们开始构建我们的RNN！预处理我前面提到的数据集由两个Python字典组成：train_data = { 'good': True, 'bad': False, # ... more data } test_data = { 'this is happy': True, 'i am good': True, # ... more data }True = Positive, False = Negative我们必须进行一些预处理才能将数据转换为可用格式…

0基础入门神经网络：卷积神经网络(CNN)02
type: item
date: 2019-10-23T15:34:00+08:00
description: 原文地址在本文中，我们将深入探讨卷积神经网络（CNN）：如何训练CNN（包括梯度推导），从头实现反向传播（仅使用numpy）以及最终构建完整的训练！本文假定你对CNNs有基础了解，如果否，请参考CNN01本部分同时也要求你有多元微分的知识. 您可以根据需要跳过这些部分，但还是建议阅读它们，对写代码有用。开始我们从上一篇文章停下来的地方开始，我们正在使用CNN来解决MNIST手写数字识别问题： 来自MNIST数据集的样本图像我们（简单的）CNN由一个卷机层（Conv layer），一个最大池化层（Max Pooling layer）和一个Softmax层组成。下面是一个简单的示意图： Our (simple) CNN consisted of a Conv layer, a Max Pooling layer, and a Softmax layer. Here's that diagram of our CNN again:我们写了三个类, 分别是这三个层： Conv3x3, MaxPool, 和 Softmax. 每个类都有一个 forward() ，一种用于构建CNN前向传递的方法# Header: cnn.py conv = Conv3x3(8) # 28x28x1 -> 26x26x8 pool = MaxPool2() # 26x26x8 -> 13x13x8 softmax = Softmax(13 * 13 * 8, 10) # 13x13x8 -> 10 def forward(image, label): ''' Completes a forward pass of the CNN and calculates the accuracy and cross-entropy loss. - image is a 2d numpy array - label is a digit ''' # We transform the image from [0, 255] to [-0.5, 0.5] to make it easier # to work with. This is standard practice. out = conv.forward((image / 255) - 0.5) out = pool.forward(out) out = softmax.forward(out) # Calculate cross-entropy loss and accuracy. np.log() is the natural log. loss = -np.log(out[label]) acc = 1 if np.argmax(out) == label else 0 return out, loss, acc你可以阅读代码或 在浏览器中运行. 也可以在Github上找到它.下面是CNN的输出：MNIST CNN initialized! [Step 100] Past 100 steps: Average Loss 2.302 | Accuracy: 11% [Step 200] Past 100 steps: Average Loss 2.302 | Accuracy: 8% [Step 300] Past 100 steps: Average Loss 2.302 | Accuracy: 3% [Step 400] Past 100 steps: Average Loss 2.302 | Accuracy: 12%显然，我们希望能有10%以上的准确度……让我们训练CNN。训练概述训练神经网络通常包括两个阶段：一个前向阶段，其中输入完全通过神经网络。一个后向阶段，其中梯度被反向传播（backpropagated or backprop)，而且权重不断更新。我们将遵循这种模式来训练我们的CNN。我们还将使用两个主要特定于实现的想法：在前向阶段，每一层将缓存（cashe）任何后向阶段所需的任何数据（例如输入，中间值等）。这意味着任何后向阶段都必须在相应的前向阶段之前。在后向阶段，每一层将接收一个梯度（gradient）并且还返回一个梯度。它将获得相对于其输出的损失梯度 ($\frac{\partial L}{\partial \text{out}}$) ，并返回相对于其输入的损失梯度（$\frac{\partial L}{\partial \text{in}}$​).这两个想法将有助于保持我们训练的整洁有序。了解原因的最好方法可能是查看代码：# Feed forward out = conv.forward((image / 255) - 0.5) out = pool.forward(out) out =…

0基础入门神经网络：卷积神经网络(CNN)01
type: item
date: 2019-10-23T03:00:00+08:00
description: 原文链接在过去的几年里，关于卷积神经网络（Convolution Neural Networks，CNN）的讨论越来越多，特别是因为它彻底改变了计算机视觉领域。在本文中，我们将基于神经网络的基本背景知识，探索CNN是什么，了解它们的工作原理，并在Python中从头开始构建一个真正的CNN（仅使用numpy）。这篇文章仅假设你拥有神经网络的基本知识。我对神经网络的介绍涵盖了您需要了解的所有内容，因此您可能需要首先阅读它。为什么使用CNNCNN的经典案例是图像分类，例如查看宠物的图像并确定它是猫还是狗。那么问题来了，为什么不使用普通的神经网络？好问题原因1：图片很大如今，有关计算机视觉问题的图像通常为224x224或更大。想象一下，建立一个神经网络来处理224x224彩色图像：包括图像中的3个彩色通道（RGB），也就是说需要224 x 224 x 3 = 150528个输入特征！在这种网络中，典型的隐藏层可能有1024个节点，因此仅第一层就必须训练150,528 x 1024 = 150+百万个权重。我们的网络非常庞大，几乎无法训练。而且我们也不需要那么多的权重。我们知道像素在与其相邻的环境中最有用。图像中的对象由小的局部特征组成，例如眼睛的圆形虹膜或一张纸的方形角。第一个隐藏层中的每个节点查看每个像素是否很浪费？原因2：位置会发生变化如果你训练了一个网络来检测狗，你会希望它能够检测狗，而不管它出现在图像的什么地方。想象一下，训练一个网络，它能很好地处理一个特定的狗的图像，但是给它一个稍微改变了的图像。狗不会激活相同的神经元，所以网络的反应会完全不同！我们很快就会看到CNN如何帮助我们解决这些问题。数据集在本文中，我们将解决计算机视觉的“Hello, World!”：MNIST手写数字分类问题。很简单：给定图像，将其分类为数字。 MNIST数据集MNIST数据集中的每个图像均为28x28像素，并包含居中的灰度数字。说实话，一般的神经网络实际上可以很好地解决这个问题。您可以将每张图像视为28 x 28 = 784维向量，将其输入到784维输入层，堆叠一些隐藏层，最后得到10个节点的输出层，每个数字1个节点。但是它只会在MNIST数据集包含居中的小图像时起作用，本例中我们不会遇到上述尺寸或偏移问题。请记住，大多数现实世界中的图像分类问题并非易事。卷积什么是卷积神经网络？它是使用卷积层（又称为Conv层）的神经网络，其基于卷积的数学运算。Conv层由一组filter（卷积核）组成，您可以将其视为二维的数字矩阵。这是一个3x3卷积核示例： 我们可以输入图像和卷积核，将卷积核与输入图像卷积来生成输出图像。这包括在某些位置将卷积核覆盖在图像顶部。在卷积核中的值和图像中相应的值之间执行逐元素乘法（element-wise multiplication）。加总所有逐元素乘法的结果。和是输出图像中目标像素的输出值。在所有位置重复该过程。旁注：从技术上讲，我们（以及许多CNN）实际上在这里使用互相关而不是卷积，但是它们几乎是同一件事。我不会在这篇文章中介绍差异，因为它并不重要，但是如果您感到好奇，可以随时查找相关资料。这个四步描述有点抽象，所以让我们做一个例子。考虑一下这个微小的4x4灰度图像和3x3卷积核： 4x4图像（左）和3x3卷积核（右）图像中的数字表示像素强度，其中0为黑色，255为白色。我们将对输入图像和卷积核进行卷积以生成2x2的输出图像： 首先，让我们将卷积核覆盖在图像的左上角： 步骤1：将卷积核（右）覆盖在图像（左）的上方接下来，我们在重叠的图像值和卷积核值之间执行逐元素乘法。结果如下，从左到右，从上到下：图像值卷积核值结果0-1050000100-2080003126233-1-339000010步骤2：执行逐元素乘法。接下来，加总所有的结果，这很容易$$ 62 - 33 = \boxed{29} $$最后，我们将结果放置在输出图像的目标像素中。由于我们的卷积核覆盖在输入图像的左上角，因此我们的目标像素是输出图像的左上像素： 重复以上步骤，得到其他位置像素 它有什么用？让我们缩小一下，在更高的层次上看。将一个图像与一个卷积核进行卷积有什么用?我们可以从我们一直使用的3x3卷积核开始，它通常被称为垂直索伯滤波器 垂直索伯滤波器这是一个垂直索伯滤波器的示例： 图像与垂直索伯滤波器卷积类似地，还有一个水平索伯滤波器卷积： 水平索伯滤波器卷积 图像与水平索伯滤波器卷积看看发生了什么事？索伯滤波器是边缘检测算子（edge-detectors）。垂直索伯滤波器检测垂直边缘，而水平索伯滤波器检测水平边缘。现在可以轻松地解释输出图像：输出图像中的亮像素（值较高的像素）表明原始图像周围有很强的边缘。您能看到为什么边缘检测图像比原始图像更有用的原因吗…