精华内容
下载资源
问答
  • 实现商品的上架下架功能

    千次阅读 2019-09-29 19:18:38
    将前端jsp页面显示的商品状态码1修改为上架,0修改为下架,并且点击上架时,前端页面显示为下架,数据库中的商品状态码 由0变为1. 问题: 1、数据库对应的实体类中的商品状态码类型为int类型,需改为String类型 ...

    项目效果展示:

     

    场景:

    数据库中商品的状态码为0或者1,1代表上架,0代表下架。

    需求:

    将前端jsp页面显示的商品状态码1修改为上架,0修改为下架,并且点击上架时,前端页面显示为下架,数据库中的商品状态码

    由0变为1.

    问题:

    1、数据库对应的实体类中的商品状态码类型为int类型,需改为String类型

    2、上架下架的点击事件应只对商品的状态进行刷新,不应对全局刷新。

    解决思路:

    1、应新建视图类model,将商品的状态码改为String类型,其余不变

    2、上架下架操作应使用ajax实现

    具体实现:

    1、新建model包下的类ProductModel,将状态码类型修改为String(实现get、set方法步骤省略)

    package com.henu.ssm.model;
    
    import com.fasterxml.jackson.annotation.JsonFormat;
    
    import java.math.BigDecimal;
    import java.util.Date;
    /**
     * @author shkstart
     * @create 2019-09-27 15:55
     */
    public class ProductModel {
        private String productId;
    
        private String productName;
    
        private BigDecimal productPrice;
    
        private Integer productStock;
    
        private String productDescription;
    
        private String productIcon;
    
        private String productStatus;
    
        private Integer categoryType;
    
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        private Date createTime;
        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        private Date updateTime;
    

    2、在业务层的实现类中,将原实体类ProductInfo中的数据拷贝到ModelProductInfo

     @Override
        public Map<String, Object> selectProductInfo(ProductInfoExample example, Integer pageNum, Integer pageSize) {
            //设置分页信息
            PageHelper.startPage(pageNum, pageSize);
            //设置排序id排序
            example.setOrderByClause("product_id asc");
            //执行查询
            List<ProductInfo> list = productInfoMapper.selectByExample(example);
            List<ProductModel> list2 = new ArrayList<>();
            //将ProductInfo中的数据拷贝到ProductModel中
            for (ProductInfo productInfo : list) {
                ProductModel productModel = new ProductModel();
                //使用BeanUtils工具类进行拷贝
                //copyProperties(要拷贝的实体类,拷贝到的实体类)
                BeanUtils.copyProperties(productInfo,productModel);
                //如果状态码是0表示下架,显示上架
                if(productInfo.getProductStatus()==0){
                    productModel.setProductStatus("上架");
                    list2.add(productModel);
                }else{
                    productModel.setProductStatus("下架");
                    list2.add(productModel);
                }
            }
            //获取分页信息
            PageInfo<ProductInfo> pageInfo= new PageInfo<>(list);
            Map<String, Object> map = new HashMap<>();
            //获取总记录数
            map.put("total", pageInfo.getTotal());
            map.put("rows", list2);
            return map;
        }

    3、控制层将状态码取反

    //将数据库中的状态码取反
        @RequestMapping("/updateStatus")
        @ResponseBody
        public int selectstatus(String productId) throws SQLException{
            //将前端输入的id用后台进行接收
            ProductInfo productInfo = productService.selectByPrimaryKey(productId);
            //先根据前端输入的id查询获得一条数据,然后获得该条数据的状态码
          int i =  productService.selectByPrimaryKey(productId).getProductStatus();
            //将状态码取反
            if (i==0){
                productInfo.setProductStatus(1);
            }else {
                productInfo.setProductStatus(0);
            }
            //然后进行更新
            productService.updateByPrimaryKeySelective(productInfo);
    
            return i;
        }

    4、前台的状态码

     {field:'状态',title:'状态',width:40,
                        formatter:function(value, row, index){
                            var str = '<a  id="proStatus" style="color:blue" href="#"  class="easyui-linkbutton" onclick="productStatus(\''+row.productId+'\')">'+row.productStatus+'</a>';
                            return str;
                        }},

    对应的后台的ajax请求

     function productStatus(productId){
            $.ajax({
                type: "post",
                dataType: "html",
                url: 'updateStatus',
                data: {"productId":productId},
                success: function (data) {       //服务器返回值
                    var data = eval('('+data+')');//转换为json对象
                    $('#dg').datagrid('reload');// reload the user data
                }
            });
    
        }

    过程中的遇到的问题:

    1、日期类型Date直接在页面传值会发生错误需要在日期前加@JsonFormat注解进行转换,GMT+8代表东八区(中国)

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
        private Date createTime;

    2、在将实体类转换为视图类的过程中分页发生了错误

    原代码:

             //获取分页信息
            PageInfo<ProductInfo> pageInfo= new PageInfo<>(list2);
            Map<String, Object> map = new HashMap<>();
            //获取总记录数
            map.put("total", pageInfo.getTotal());
            map.put("rows", pageInfo.getList());
            return map;

    修改后:

            //获取分页信息
            PageInfo<ProductInfo> pageInfo= new PageInfo<>(list);
            Map<String, Object> map = new HashMap<>();
            //获取总记录数
            map.put("total", pageInfo.getTotal());
            map.put("rows", list2);
            return map;

    分析原因:

    获取分页信息的数据应是数据库中的数据,故对应list即所有productInfo中的数据

    分页显示到页面的每行数据rows应是list2即productModel中的数据

    展开全文
  • 课程学习

    千次阅读 2017-12-28 11:35:43
    Methodology:Idealistic Curriculum Learning ...我们提出了师生自主课程学习(TSCL),一个自动课程学习的框架,学生试图学习一个复杂的任务,教师自动选择给定的子任务给学生进行训练。我们描述了一系列依靠

    Methodology:Idealistic Curriculum Learning Processing
    arXiv:1707.00183 2017
    主要提出了监督学习和强化学习中解决数据集错标签和类别不平衡问题的自动课程设计方法。
    摘要
    我们提出了师生自主课程学习(TSCL),一个自动课程学习的框架,学生试图学习一个复杂的任务,教师自动选择给定的子任务给学生进行训练。我们描述了一系列依靠直觉的老师算法,学生应该多练习那些能有最快进展的任务,即学习曲线斜率最高的那些任务。此外,教师算法还通过选择学生表现变差的任务来解决遗忘问题。我们证明,在两个任务上TSCL达到或超过精心手工课程的结果:用LSTM添加十进制数和导航Minecraft迷宫。使用我们的自动生成的课程能够解决一个直接在解迷宫上训练时根本无法解决的Minecraft迷宫,学习比子任务的统一取样要快一个数量级。
    引言
    深度强化学习算法已被用于解决视频游戏(Mnih等,2015),运动(Schulman等,2015; Lillicrap等,2015)和机器人(Levine等,2015)中的困难任务。 但是像“机器人,给我一杯啤酒”这样稀有回馈的任务仍然是直接应用这些算法解决的难题。 其中一个原因是随机探索任务需要的样本数量随着获得回馈的步骤数量呈指数增长(Langford,2011)。 解决这个问题的一个方法是使用课程学习(Bengio等,2009; Zaremba和Sutskever,2014; Graves等,2016; Wu和Tian,2017) 一旦掌握了更简单的任务,就更难完成任务。 课程学习有助于掌握简单的任务后,通过随机的探索就可以发现更难的任务。
    要使用课程学习,研究人员必须:
     能够通过困难程度设计子任务。
     决定一个“掌握”的门槛。 这可以基于取得一定的分数(Zaremba和Sutskever,2014;吴和田,2017),这需要事先知道每个任务的可接受的完成程度。 或者,这可以基于高原的表现,考虑到学习曲线中的噪音,这可能难以检测到。
     学习更难的东西,同时不断地混合更轻松的任务,以避免遗忘。 有效地设计这些混合物是具有挑战性的(Zaremba和Sutskever,2014)。
    在本文中,我们描述了一种叫做“师生课程学习”(TSCL)的新方法。
    学生是被训练的模型。 教师监控学生的训练进度,并确定学生在每个训练阶段应该训练的任务,以最大化学生在课程中的进度。 学生可以是任何机器学习模型。 老师自己正在学习这个学生,因为它正在给予任务,这些都是单个训练过程的一部分。 我们根据学习进度的概念描述了几种教师算法(Oudeyer and Kaplan,2007)。 主要思想是学生应该多练习它最快的进展,即学习曲线斜率最高。 为了避免遗忘,学生还应该练习表现越来越差的学习任务,即学习曲线斜率为负值
    论文的主要贡献是:
    1我们将TSCL(作为部分可观察的马尔可夫决策过程(POMDP)的课程学习框架)正式化。
    2我们提出了一个基于学习进度概念的算法家族。 算法还解决了忘记以前的任务的问题。
    3我们在两个监督和强化学习任务上评估了算法:添加十进制数与LSTM和导航Minecraft。
    2.师生设置

    图1显示了师生互动。 在每个时间步,教师选择任务供学生练习。 学生训练这些任务并返回一个分数。 教师的目标是让学生尽可能少的训练步骤成功完成最后的任务。 通常,任务是通过表示N个子任务之一的分类值进行参数化的,但是也可以想象多维或连续的任务参数化。 得分可以是强化学习中的情节总回馈或监督学习中的验证集精度。
    我们将教师的目标正式化,把最终任务作为部分可观察的马尔可夫决策过程(POMDP),帮助学生学习解决这个任务。 我们提出了两个POMDP公式:(1)简单,最适合强化学习; 和(2)批次,最适合监督学习。
    2.1简单POMDP公式
    简单的POMDP公式将学生的分数公开在单个任务中,并且非常适合于强化学习问题。
    1.状态st表示学生的整个状态(即,神经网络参数和优化器状态),并且对于教师是不可观察的。
    2.动作at对应于教师选择的任务的参数。以下我们只考虑离散任务参数化。 采取行动意味着对学生进行一定次数的迭代训练。
    3.观察ot是在时间步t训练的学生的任务i =at的得分x(i)t,即发作总回馈。 在理论上,教师也可以观察学生状态的其他方面,比如网络权重,为了简单起见,我们选择只公开分数。
    4.回馈 rt是学生在时间步t训练的任务得分的变化:rt = x(i)t-x(i)t’i,其中t’ i是上一次训练同一任务时的时间步。
    2.2批次POMDP公式
    在监督式学习中,批次训练可以包含多个任务。 因此,对整个训练集合采取行动,观察和回馈,并且可以在持有的验证集上测量分数。 这激励了批POMDP公式:
    1. 状态st表示学生的训练状态
    2.at动作表示N个任务的概率分布。 每个训练批次根据分布采样: ; 其中p(i)t是任务i在时间步t的概率。
    3. 观察值是训练步骤 之后所有任务的得分。在最简单的情况下,分数可以是训练集中任务的精确度。 但是在小批量训练的情况下,模型在训练过程中发展,因此无论如何需要额外的评估通过以产生一致的结果。因此,对这次评估我们使用一个单独的验证集合,其中包含所有任务的统一组合。
    4回馈rt 是对之前时间步的评估分数的累加
    这种设置也可以在加强学习中通过对批次进行训练。但是,因为在强化学习中对一个样本(一个情节)进行评分通常比在监督学习中在计算上要昂贵得多,所以使用简单的POMDP形式化并在每个训练步骤之后对下一个任务做出决定是有意义的。
    2.3优化标准
    对于任何一种POMDP公式来说,最大化教师情节总回馈相当于在情节结束时最大化所有任务的得分:
    其中Ti是任务i正在训练的最后一个训练步骤。
    虽然优化标准的明显选择是最终任务中的表现,但最初,学生在最终任务中可能没有取得任何成功,这并不能给教师提供任何有意义的反馈信号。 所以我们选择最大化所有任务中的表演总和。 这里的假设是,在课程学习中,最后的任务包括了所有以前任务的要素,因此在中间任务中的良好表现通常导致在最终任务中表现良好。
    3 算法
    通常使用强化学习算法来解决POMDP。 但那些需要很多训练集,而我们的目标是在一个教师集中训练学生。 所以,我们诉诸于更简单的启发式。 基本的直觉是,学生应该更多地练习那些它正在取得最大进展的任务(Oudeyer和Kaplan,2007),同时也练习那些有被遗忘风险的任务。

    理想主义的课程学习。 左:随着时间的推移,不同任务的分数会有所提高,一旦掌握了前一个任务,下一个任务就会开始改善。 右:取样任务的可能性取决于学习曲线的斜率。

    图2展示了课程学习环境中理想的训练进度:
    1.首先,教师没有知识,所以从一切工作中统一抽样。
    2.当学生开始在任务1上进展时,教师为这个任务分配更多的概率质量。
    3.当学生掌握任务1时,其学习曲线变平,教师对任务进行较少的抽样。 在这一点上,学生也开始在任务2上取得进展,所以教师从任务2中抽样更多。
    4.继续,直到学生掌握所有任务。 随着所有任务学习曲线最终平坦化,教师返回统一的任务抽样。
    上面的图片是理想的,因为在实践中经常发生一些失误,即当大多数概率质量被分配给任务2时,任务1的性能可能变差。 为了解决这个问题,学生还应该练习所有的学习任务,尤其是那些发生学习不良的学习任务 出于这个原因,我们根据学习曲线的斜率的绝对值来取样任务。 如果分数的变化是负的,这意味着发生了学习失败,这个任务应该更多的训练。
    这个描述本身并不规定一个算法。 我们需要提出一种从噪音任务分数估计学习进度的方法,以及一种平衡exploration and exploitation的方法。 我们从非平稳的多臂赌博机问题(Sutton和Barto,1998)的算法中获得灵感,并将其适用于TSCL。 为了简洁起见,我们只给出简单的公式化算法的直觉,正式的描述可以在附录A和B中找到。
    3.1在线算法
    Online算法受基本的非平稳的bandit算法的启发(Sutton and Barto,1998)。 它使用指数加权移动平均来跟踪不同任务的预期收益Q:

    a是学习率。 接下来的任务可以通过以e贪心搜索方式进行选择: - 以概率e抽样一个随机任务,否则为argmaxQt(a)。
    或者,可以使用波尔兹曼分布来选择下一个任务:

    3.2朴素算法
    为了更可靠地估计学习进度,人们应该多次练习。 Naive算法将每个任务训练K次,观察得到的分数并使用线性回归估计学习曲线的斜率。 回归系数作为上述非平稳Bandit算法的回报。 有关细节,请参阅附录A中的算法2。
    3.3窗口算法
    当明确没有进展时,重复执行固定次数的任务是昂贵的。 窗口算法保持最后K个分数的FIFO缓冲器,并记录这些分数时的时间步长。 执行线性回归来估计每个任务的学习曲线的斜率,其中时间步长作为输入变量。 回归系数作为上述非平稳Bandit算法的回报。 有关细节,请参阅附录A中的算法3。
    3.4采样算法
    以前的算法需要调整超参数来平衡探索。 为了摆脱探索超参数,我们从Thompson采样中获得灵感。 采样算法为每个任务保留最后K个奖励的缓冲区。 为了选择下一个任务,从每个任务的K-last-rewards缓冲区抽取最近的奖励。 然后选择哪个任务产生最高的抽样奖励。 这使得探索成为算法的一个自然部分:最近获得高回报的任务经常被抽样。 有关细节,请参阅附录A中的算法4。
    4个实验
    4.1十进制数加法
    在LSTM中添加十进制数字是一个众所周知的任务,需要课程在合理的时间内学习(Zaremba和Sutskever,2014)。 它被实现为序列到序列模型(Sutskever et al。,2014),其中网络的输入是两个用“加号”分隔的十进制编码数字,网络的输出是这些数字的总和 ,也用十进制编码。 课程以输入数字的位数为基础 - 学习添加短数字然后移到更长的数字更容易。
    增加数字是一个监督学习问题,因此可以通过在小批量中包含几个课程任务来更有效地进行训练。 所以我们采用2.2中所述的批量训练方案。 我们使用的分数是在验证集上计算的每个任务的准确度。 下面显示的结果是用不同的随机种子进行的3次运行的均值和标准偏差。 完整的实验细节可以在附录C中找到。
    4.2 Minecraft
    “我的世界”是一个流行的3D视频游戏,玩家可以探索,制作工具和构建任意结构,使其成为AI研究的潜在丰富环境。 在我们的强化学习实验中,我们使用了带有OpenAI Gym wrapper5的马尔默平台(Johnson et al。,2016)与Minecraft进行交互。 特别是我们使用马尔默的ClassroomDecorator为代理生成随机迷宫来解决。 迷宫包含由以下障碍物分隔的房间序列:
    墙 - 代理商必须在墙上找到一个门口。
    熔岩 - 代理必须通过桥梁跨越熔岩。
    我们只实现了用Window算法完成Minecraft任务,因为其他算法依赖于分数的变化,这对于并行训练方案来说是不直观的。 作为基准,我们使用统一的抽样,仅对最后一项任务进行训练,以及手动调整的课程。 完整的实验细节可以在附录D中找到。
    6,结论
    我们提出了一个自动课程学习框架,可用于监督和强化学习任务。 我们根据学习进度的概念,在该框架内提出了一系列算法。 虽然许多算法表现相当好,但在选择任务时依赖于学习曲线斜率的绝对值是至关重要的。 这保证了网络对开始忘记的任务的重新训练。 在我们的LSTM十进制加法实验中,采样算法胜过了最好的手动设计的课程以及统一的采样。 在具有挑战性的5个任务的Minecraft导航问题上,我们的窗口算法与精心设计的手动课程表现相匹配,并且明显优于统一采样。 对于需要进行课程学习的问题,TSCL可以避免完成子任务难度和手工设计课程的繁琐工作。

    展开全文
  •  斯坦福CS231n 2017最新课程:李...斯坦福大学的课程 CS231n (Convolutional Neural Networks for Visual Recognition) 作为深度学习和计算机视觉方面的重要基础课程,在学界广受推崇。今年 4 月,CS231n 再度开
    

    斯坦福CS231n 2017最新课程:李飞飞详解深度学习的框架实现与对比

    By ZhuZhiboSmith2017年6月19日 13:37

    斯坦福大学的课程 CS231n (Convolutional Neural Networks for Visual Recognition) 作为深度学习和计算机视觉方面的重要基础课程,在学界广受推崇。今年 4 月,CS231n 再度开课,全新的 CS231n Spring 2017 仍旧由李飞飞带头,带来了很多新鲜的内容。今天机器之心给大家分享的是其中的第八讲——深度学习软件(Deep Learning Software)。主要内容有:CPU 和 GPU 的对比;深度学习框架简介;TensorFlow 和 PyTorch 的实例;以及各种深度学习框架的比较。

    一、 CPU 和 GPU

     CPU:核芯的数量更少;

        但是每一个核芯的速度更快,性能更强;

        更适用于处理连续性(sequential)任务。

     

     GPU:核芯的数量更多;

         但是每一个核芯的处理速度较慢;

         更适用于并行(parallel)任务。


    二、深度学习框架简介

    去年我们还仅有 Caffe、Torch、Theano 和 TensorFlow 这些深度学习框架可供使用;但是到了今年,在此基础上我们又新增加了 Caffe2、Pytorch、TensorFlow、PaddlePaddle、 CNDK、MXNet 等等一系列新的框架,可谓「百花齐放」。如今最常用的框架当数 Pytorch 和 TensorFlow 了, 而 Caffe 和 Caffe2 次之。


    深度学习框架的关键点在于:

    (1)易于建造大型的计算机图形;

    (2)易于在计算机图形中进行梯度计算;

    (3)能在 GPU 上高效运行(cuDNN, cuBLA 等)

    三、TensorFlow 简单实例

    下面我们将详细说明一个在 TensorFlow 下训练神经网络的简单实例:即用随机数据训练一个两层的网络,激活函数为 ReLU。

     

    a. 定义计算机图形


    1. 为输入 x,权重系数 w1、w2, 和目标函数 y 创建 placeholder:


    2. 定义前向传输:这是为了计算 y 的预测值和误差损失(loss);实际上这里是没有计算过程的——仅仅是为了创建图形!


    3. 告诉 Tensorflow 去计算关于 w1 和 w2 的梯度损失;这里仍然不产生计算过程——仅仅是为了创建图形。


    b. 运行

    现在已经完成了创建图形的步骤,所以我们进入对图形进行运算的部分。


    创建 Numpy 数组,这个数组将会被填进上方的 placeholder 中。


    对图形进行运算:将 x、y、w1、w2 输入到 numpy 数组中;得到关于损失(loss),w1 梯度和 w2 梯度的 numpy 数组。


    训练网络:反复对图形进行运算,用梯度(gradient)来更新权重(weights)。


    把 w1 和 w2 的相应函数从 placeholder() 改为 Variable()。


    添加 assign 操作来更新 w1 和 w2(图形的一部分)。


    对图形进行一次运算来初始化 w1 和 w2,然后进行多次迭代训练。


    完整代码如下:


    但是产生一个问题:误差损失(loss)并没有下降!这是因为 Assign 指令实际上并没有被执行。


    这时我们就需要添加虚拟图形节点,并且告诉图形去计算虚拟节点。


    可以使用 optimizer 来计算梯度和更新权重系数;记得要执行 optimizer 的输出!


    使用预先定义的常用损失函数:


    使用 Xavier 进行初始化;tf.layer 会自动设置权重系数(weight)和偏置项(bias)!


    c. 高级 Wrapper——Keras

    Keras 可以理解为是一个在 TensorFlow 顶部的 layer,它可以让一些工作变得更加简单(也支持 Theano 后端)。


    把模型目标定义成一系列的 layer :


    定义优化器目标(optimizer object):


    创建模型,明确规定损失函数(loss function):


    仅用一行代码就能训练模型!


    除了 Keras, 还有一些其他类型的高级容器(Wrapper)可供使用:


    四、PyTorch 实例

    PyTorch 是 Facebook 推出的深度学习框架,不论是在工业界还是学术界,它都得到了广泛的应用。它包括三个等级的抽象概念:

    • 张量(Tensor):命令式的多维数组对象(ndarray),在 GPU 上运行;
    • 变量(Varaible):计算型图形(computational graph)的节点;用于存储数据和梯度(gradient)
    • 模块(Module):代表一个神经网络层;可以存储状态(state), 也可以存储可学习的权重系数(learnable weights)

    PyTorch 和 TensorFlow 中抽象概念的等价对应关系:

     

    a. Pytorch 中的张量(Tensor)设置

    PyTorch 中的张量就像 numpy 中的数组,但是这些张量可以在 GPU 上运行;

    这里我们用 PyTorch 的张量设置了一个两层网络:


    下面我们来分步解读:

    1. 为数据和权重(weights)创建随机张量:


    2. 设置前向传播:计算预测值(prediction)和损失(loss):


    3. 设置反向传播:计算梯度(gradients):


    4. 梯度下降(Gradient descent)和权重(weights)相对应:


    5. 为了在 GPU 上运行,将张量(tensors)设置为 cuda 数据类型:


    b. PyTorch 中的 Autogradient 设置

    PyTorch 的张量(Tensors)和变量(Variables)拥有相同的应用编程接口 API。变量(Variables)可以记忆它们是怎么产生的(因为反向传播的缘故)。


    下面仍进行分步解读:

     

    1. 我们不希望(损失 loss 的)梯度和数据(data)有相关性,但我们希望梯度和权重(weights)是相关的。相关设置如图: 


    2. 这里的前向传播看上去和上述张量(Tensor)的对应版本很相似,但是需要注意的是现在这里全部都是变量(variable)。


    3. 计算损失函数对 w1 和 w2 的梯度(开始的时候梯度置零):


    4. 让梯度和权重(weights)相对应:


    C. 定义新型 Autograd 函数

    通过张量的前向和反向传播来定义你自己的 autograd 函数:


    可以在前向传播中使用新的 autograd 函数:


    d. PyTorch 中的神经网络(nn)设置

    用更高级的「容器」(wrapper)来处理神经网络(neural nets), 和 Keras 相似。完整代码如下:


    下面进行分步解读:

    把我们的模型定义成一系列的 layers:


    也要定义常用损失函数:


    前向传播:给模型输入数据;给损失函数(loss function)输入预测信息(prediction):


    反向传播:计算所有的梯度(gradients):


    让梯度和每一个模型参数对应:


    下面我们添加一个优化器(optimizer):


    在计算完梯度以后对所有的参数(parameters)进行更新:


    E. PyTorch 中的神经网络——定义新的模型

    Pytorch 中的模块(Module)其实是一个神经网络层(neural net layer),需要注意它的输入和输出都是变量;模块(Module)中包含着权重 (当作变量处理) 或者其他模块;你可以使用 autograd 来定义你自己的模块。详细代码如下:


    下面进行分步解读:

    1. 把我们的整体模型定义成一个单一的模块:


    2. 用初始化程序来设置两个子模块(一个父模块可以包含子模块)


    3. 用子模块和变量上的 autograd ops 定义前向传播;不需要定义反向传播——因为 autograd 会作相应处理:


    4. 创建并训练一个模型实例:


    E. PyTorch 中的资料存储器(Dataloaders)

    资料存储器(DataLoader)包括一个数据集 (Dataset),而且给你提供了小批量处理(minibatching),「洗牌」处理(shuffling)和多线程处理(multithreading);当你需要载入自定义数据(custom data)时,写下你自己的数据集类型(dataset class)就可以了。


    通过遍历存储器(loader)来形成小批量(minibatch);存储器会给你提供张量(Tensors), 所以你需要将其「打包」(wrap)进变量中:


    注意:使用带有 torchvision 的预先训练好的模型(pretrained model)将会更加简单易行。

    F. Torch 和 pytorch 的简单对比


    结论:尽量使用 PyTorch 来做你的新项目。

    五、Caffe2 简介


    六、深度学习框架之争,究竟谁更胜一筹?





    其实具体选择何种框架来进行深度学习取决于我们要做什么。在参阅相关文献之后,我们大致可以得出以下结论(仅供参考):

    • PyTorch 和 Torch 更适用于学术研究(research);TensorFlow,Caffe,Caffe2 则更适用于工业界的生产环境部署(industrial production)。
    • Caffe 适用于处理静态图像(static graph);Torch 和 PyTorch 更适用于动态图像(dynamic graph);而 TensorFlow 在两种情况下都很实用。
    • Tensorflow 和 Caffe2 可在移动端使用。  

    附主要参考文献CS231n_2017_Lecture8,链接可直接下载PPT:

    • http://cs231n.stanford.edu/slides/2017/cs231n_2017_lecture8.pdf

    其他参考资料:

    • http://203.187.160.132:9011/dl.ee.cuhk.edu.hk/c3pr90ntc0td/slides/tutorial-caffe.pdf
    • http://203.187.160.132:9011/dl.ee.cuhk.edu.hk/c3pr90ntc0td/slides/DL_in_Action.pdf

    展开全文
  • 指的不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况的注意力计算机制。Q(Query), K(Key), V(Value)三个矩阵...

    Encoder-Decoder框架:

    可以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对<Source,Target>,我们的目标是给定输入句子Source,期待通过Encoder-Decoder框架来生成目标句子Target。

    Encoder顾名思义就是对输入句子Source进行编码,将输入句子通过非线性变换转化为中间语义表示C:

    对于解码器Decoder来说,其任务是根据句子Source的中间语义表示C和之前已经生成的历史信息,来生成i时刻要生成的单词:

    如果Source是中文句子,Target是英文句子,那么这就是解决机器翻译问题的Encoder-Decoder框架;如果Source是一篇文章,Target是概括性的几句描述语句,那么这是文本摘要的Encoder-Decoder框架;如果Source是一句问句,Target是一句回答,那么这是问答系统或者对话机器人的Encoder-Decoder框架。

    Attention机制:

    • 根据根据Query和某个Key_i,计算两者的相似性或者相关性,最常见的方法包括:求两者的向量点积、求两者的向量Cosine相似性或者通过再引入额外的神经网络来求值,即如下方式:

    • 引入类似SoftMax的计算方式对第一阶段的得分进行数值转换,一方面可以进行归一化,将原始计算分值整理成所有元素权重之和为1的概率分布;另一方面也可以通过SoftMax的内在机制更加突出重要元素的权重。即一般采用如下公式计算:

    • 计算结果a_i即为value_i对应的权重系数,然后进行加权求和即可得到Attention数值:

    Self Attention模型:

    指的不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况下的注意力计算机制。Q(Query), K(Key), V(Value)三个矩阵均来自同一输入,首先我们要计算Q与K之间的点乘,然后为了防止其结果过大,会除以一个尺度标度 \sqrt{d_k} ,其中 d_k 为一个query和key向量的维度。再利用Softmax操作将其结果归一化为概率分布,然后再乘以矩阵V就得到权重求和的表示。该操作可以表示为 

    Attention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V

    其中 W^Q, W^K, W^V 是我们模型训练过程学习到的合适的参数。上述操作即可简化为矩阵形式:

    参考:深度学习中的注意力模型(2017版)

    Transformer模型:

    Transformer用于执行翻译任务,实验表明,这一模型表现极好,可并行化,并且大大减少训练时间。其本质上是一个Encoder-Decoder的结构,编码器由6个编码block组成(encoder每个block由self-attention,FFNN组成),同样解码器是6个解码block组成(decoder每个block由self-attention,encoder-decoder attention以及FFNN组成),与所有的生成模型相同的是,编码器的输出会作为解码器的输入。

    模型结构如下图所示:

    编码器:编码器有6个完全的层堆栈而成,每一层都有两个子层。第一个子层是多头的self-attention机制上面讲过了,第二层是一层简单的前馈网络全连接层。在每一层子层都有residual和归一化。

    解码器:解码器也是有6个完全相同的层堆栈而成,每一层有三个子层,在编码栈的输出处作为多头的attention机制。

    多头注意力机制:点乘注意力的升级版本。相当于 h 个不同的self-attention的集成(ensemble),在这里我们以 h=8 举例说明。Multi-Head Attention的输出分成3步:

    • 将数据 X 分别输入到上面的8个self-attention中,得到8个加权后的特征矩阵 Z_i, i\in\{1,2,...,8\} 。
    • 将8个 Z_i 按列拼成一个大的特征矩阵;
    • 特征矩阵经过一层全连接后得到输出 Z 。

    参考:深度学习:transformer模型放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较

    EMLO模型:

    ELMO是“Embedding from Language Models”的简称,ELMO的论文题目:“Deep contextualized word representation”更能体现其精髓:在deep contextualized这个短语,一个是deep,一个是context,其中context更关键。ELMO的本质思想是:我事先用语言模型学好一个单词的Word Embedding,根据上下文单词的语义去调整单词的Word Embedding表示,这样经过调整后的Word Embedding更能表达在这个上下文中的具体含义。ELMO采用了典型的两阶段过程:

    • 利用语言模型进行预训练;

    • 在做下游任务时,从预训练网络中提取对应单词的网络各层的Word Embedding作为新特征补充到下游任务中。

    优点:

    • 引入上下文动态调整单词的embedding后解决了多义词问题;
    • 适用范围是非常广的,普适性强

    缺点:

    • LSTM抽取特征能力弱于Transformer
    • 拼接方式双向融合特征融合能力偏弱

    GPT模型:

    GPT是“Generative Pre-Training”的简称,从名字看其含义是指的生成式的预训练。GPT也采用两阶段过程:

    • 利用语言模型进行预训练;

    • 通过Fine-tuning的模式解决下游任务;

    一个新问题:对于NLP各种花样的不同任务,怎么改造才能靠近GPT的网络结构呢?

    • 对于分类问题,不用怎么动,加上一个起始和终结符号即可;
    • 对于句子关系判断问题,比如Entailment,两个句子中间再加个分隔符即可;
    • 对文本相似性判断问题,把两个句子顺序颠倒下做出两个输入即可,这是为了告诉模型句子顺序不重要;
    • 对于多项选择问题,则多路输入,每一路把文章和答案选项拼接作为输入即可。

    与ELMO区别

    • 特征抽取器不是用的RNN,而是用的Transformer
    • 采用的是单向的语言模型

    优点

    • 引入Transformer任务性能提升非常明显

    缺点

    • 单项语言模型只采用Context-before这个单词的上文来进行预测,而抛开了下文,白白丢掉了很多信息

    Bert模型

    Bert采用和GPT完全相同的两阶段模型:

    • 首先是语言模型预训练;
    • 其次是使用Fine-Tuning模式解决下游任务。

    改造下游任务

    • 对于句子关系类任务,和GPT类似,加上一个起始和终结符号,句子之间加个分隔符即可。对于输出来说,把第一个起始符号对应的Transformer最后一层位置上面串接一个softmax分类层即可。
    • 对于分类问题,与GPT一样,只需要增加起始和终结符号,输出部分和句子关系判断任务类似改造;
    • 对于序列标注问题,输入部分和单句分类是一样的,只需要输出部分Transformer最后一层每个单词对应位置都进行分类即可。
    • 对于机器翻译或者文本摘要,聊天机器人这种生成式任务,同样可以稍作改造即可引入Bert的预训练成果。只需要附着在S2S结构上,encoder部分是个深度Transformer结构,decoder部分也是个深度Transformer结构。根据任务选择不同的预训练数据初始化encoder和decoder即可。这是相当直观的一种改造方法。当然,也可以更简单一点,比如直接在单个Transformer结构上加装隐层产生输出也是可以的。

    与GPT区别

    • 最主要不同在于在预训练阶段采用了类似ELMO的双向语言模型
    • 另外一点是语言模型的数据规模要比GPT大

    优点

    • 在各种类型的NLP任务中达到目前最好的效果,某些任务性能有极大的提升

    Bert最关键两点:

    • 一点是特征抽取器采用Transformer;
    • 第二点是预训练的时候采用双向语言模型。

    创新点

    • Masked 语言模型:

      ①随机选择语料中15%的单词,用[Mask]掩码代替原始单词,
      ②然后要求模型去正确预测被抠掉的单词。
      ③15%的被上天选中要执行[mask]替身这项光荣任务的单词中,只有80%真正被替换成[mask]标记
      ④10%被狸猫换太子随机替换成另外一个单词,10%情况这个单词还待在原地不做改动。
    • Next Sentence Prediction:

      ①一种是选择语料中真正顺序相连的两个句子;
      ②另外一种是第二个句子从语料库中抛色子,随机选择一个拼到第一个句子后面。

    参考:从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史

    展开全文
  • 计算机数学课程收集

    千次阅读 2018-11-13 15:37:02
    编者:李国帅 qq:9611153 微信lgs9611153 时间:2018/10/24   ...课程号:20100440 课程名:泛函分析 课程英文名:Functional Analysis 学时:68 学分:4 先修课程:实变函数、高等代数...
  • MFC课程设计 --学生成绩管理系统

    万次阅读 多人点赞 2018-07-26 21:12:55
    MFC课程设计 ,C++课程设计 --学生成绩管理系统 ps:因为课设完成的过程大家都不太一样,以下的代码仅供学习一下在MFC各个控件的用法,有问题欢迎留言讨论。     实验目的 使用MFC类库编制应用程序:按钮...
  • 对称网络是我来刷Hinton课程的原因之一,因为我发现自己对于玻尔兹曼机、限制玻尔兹曼机、Hopfield Net等网络知之甚少,但其又往往对解释神经网络、理解神经网络有帮助。而上诉几个经典模型均和对称网络有着关联。 ...
  • MSDN课程

    千次阅读 2009-09-09 09:14:00
    系列课程 > Windows移动开发系列课程 使用.NET CF开发Smartphone应用程序 (Level 300) 讲 师:马宁 课程简介:介绍使用.NET Compact Framework 2.0开发Windows Mobile 5的Smartphone应用程序。结合Smartphone界面...
  • 网页设计课程设计报告

    万次阅读 多人点赞 2019-03-01 21:45:11
    学号 课 程 设 计 课程名称 网页设计 题 目 鑫晨之家特效网站设计 专 业 软件工程 ...
  • 例如,对图中右角的方形区域再做25点的随机采样,以获得最佳参数。 2. Using an appropriate scale to pick hyperparameters 上一部分讲的调试参数使用随机采样,对于某些超参数是可以进行尺度均匀...
  • JavaWeb笔记 黑马程序员课程

    万次阅读 2020-09-28 00:41:49
    该学习是基于黑马的JavaWeb课程,感兴趣的盆友可以在b站搜索javaweb进行观看学习。 Day 01 内容 04/07/2020 * Junit单元测试 * 反射 * 注解 Junit单元测试: * 测试分类: * 黑盒测试:不需要写代码,给输入值,...
  • 大数据视频课程汇总

    千次阅读 2017-04-09 16:57:10
    由于大数据视频未经视频版权方授权,很可能会被下架,请各位需要的同仁及时下载,如果被下架,请留言说明。
  • 课程设计模式研究——基于国内外微课程的对比分析 【编者按】2008年,美国教学设计师David Penrose对微课程(Micro-lecture)理念作了系统阐释,很快在实践层面就出现了一些有益的尝试并成为热点。然而,目前...
  • python培训课程-python培训课程

    千次阅读 2020-10-30 23:20:05
    生活关怀 icon 从学员学习中的心态调整,到生活中的困难协助,从课上班级氛围塑造到课多彩的班级活动,班主任360度暖心鼓励相伴。 就业辅导 icon 小到五险一金的解释、面试礼仪的培训;大到500强企业面试实训及...
  • 云计算课程详解

    千次阅读 2014-10-23 15:08:28
    这套课程最大的特点是站在初学者容易吸收理解的角度对云计算的知识进行了重新的整理及细化,内容的安排更符合初学者的学习思维,知识一环扣一环,循序渐进,让学员无痛苦并且觉得“so easy”的情况完成云计算的...
  • 本文主要基于WinEdt编译器,以案例的形式介绍了如何使用latex制作课程报告,包括: 1. 案例的完整代码、编译方式;2. 如何写latex的参考文献; 3. 效果展示; 4. 分享相关的参考网址。
  • j2EE课程总结(Java课程学习总结)

    千次阅读 2016-11-10 10:54:16
    摘要: j2EE课程上完之后的总结 java 是变成语言,运行环境,开发平台 硬件-》操作系统-》虚拟机-》字节码程序 java-》字节码-》类加载器-》字节码校验器-》解释器、优化器、JIT-》硬件 静态变量为类所有,静态方法...
  • 编程课程 学习您感兴趣的编程语言 最近,我调查了Udemy数据库并找到了这些免费的在线课程。 我已经创建了300种此类免费在线课程的清单,您可以从今天开始。 我已经根据主题和主题对在线课程进行了分类。 学习这些...
  • 课程上架与下架 营销信息 营销信息,其实就是设置课程的详细信息 回显课程信息 修改课程信息,包含了图片上传 配置课时 对课程下所属的章节与课时进行配置(一个课程对应多个章节,一个章节有多个课时) ...
  • 数据库课程设计(饭店点餐系统)

    万次阅读 多人点赞 2020-06-09 11:25:06
    2.1.1订单阶段需要的数据: 2.1.2点菜阶段需要的数据: 2.1.3结账阶段需要的数据: 2.1.4员工管理需要的数据: 2.1.5顾客管理需要的数据: 2.1.6消费记录管理需要的数据有: 2.2事务需求 2.2.1数据录入 ...
  • Java课程设计-学籍信息管理系统

    万次阅读 多人点赞 2015-12-15 21:08:23
     学生的学籍信息是记录学生的重要信息档案,如何以电子文档形式记录学生的学籍信息是每个学校必须做的事情,该学生学籍信息管理系统就是为了方便学校记录每一个学生的基本信息,生成电子数据库,并且能够做到...
  • 原文作者:aircraft ... 注:本文档需与c语言课程设计之贪吃蛇文档配套使用。...本代码在VS2013可正常运行,其他版本需根据版本需要进行调试。2.代码在Csnake-Csnake里,想直接打开整个工程直接进入Cnak...
  • 安卓课程学期总结

    千次阅读 2019-06-11 16:41:29
    刘茂安卓第一学期总结 在大一的时候只是知道自己要学习Java知识...在分专业前,暑假期间我自学了Android Studio的操作(因为学校似乎用的Eclipse,但是已经大多都不用了),我开始在各大课程网站搜集学习视频学习,也...
  • 作者最近在复习考博,乘此机会分享一些计算机科学与技术、软件工程等相关专业课程考题,一方面分享给考研、考博、找工作的博友,另一方面也是自己今后完成这些课程的复习资料,同时也是在线笔记。基础知识,希望对您...
  • 郭一璞 发自 椰子树 量子位 报道 | 公众号 QbitAI最近NLP方向的资源越来越多,GitHub上又出现了一套新的课程,目前已经获得了1300多颗星星。在这套NL...
  • Java web课程设计-购物系统

    万次阅读 多人点赞 2019-08-21 22:49:26
    Java web课程设计是为了是计算机学院的学子深入学习java web应用开发设置的一门实验性的动手性的实践课程。是计算机科学与技术、 网络工程、信息安全、物联网工程、软件工程等专业集中实践的教学环节,是将关jav...
  • 如果你是在校大学生,或许你用多了各种课程表,比如课程格子,超级课程表。它们都有一个共同点就是可以一键导入教务处的课程。那么一直都是用户的我们,没有考虑过之间是如何实现的。那么现在就由我来带领大家从程序...
  • android 优秀框架整理

    万次阅读 多人点赞 2018-01-11 11:28:29
    Retrofit2.0开始内置okhttp框 ,Retrofit专注封装接口完成业务需求,okhttp专注网络请求的安全高效,笔者将两者区分开,是想让后来学习者知道,这是两套框架,学习框架 原理时可以分开学习,以免理解混乱。...
  • 实现-超级课程表——校园登录(1)

    千次阅读 2017-09-11 10:00:20
    如果你是在校大学生,或许你用多了各种课程表,比如课程格子,超级课程表。它们都有一个共同点就是可以一键导入教务处的课程。那么一直都是用户的我们,没有考虑过它是如何实现的。那么现在就来模仿一款”超级课程表...
  • linux课程总结

    千次阅读 2015-05-06 21:01:50
    当系统调用服务例程结束时,system_call()函数从eax获得返回值。如果所有标志都没有被设置,函数跳到restore_all处执行,并执行ireq。  第六周: fork()是如何创建新进程的   一个简化版...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,927
精华内容 23,970
关键字:

得到下架的课程