精华内容
下载资源
问答
  • llyz自学笔记 ...1、HMR:hot module replacement 热模块替换 /模块热替换 作用:一个 模块发生变化,会重新打包这一个模块(而不是打包所有的模块),极大的提升了构建速度 2、那么如何去配置呢?直

    llyz自学笔记


    前言

    - webpack性能优化:
    	·开发环境优化
    		优化打包构建速度
    		优化代码调试
    	·生产环境优化
    		优化打包构建速度
    		优化代码运行的性能
    

    提示:以下是本篇文章正文内容,下面案例可供参考

    一、开发环境优化

    1、HMR:hot module replacement 热模块替换 /模块热替换
    作用:一个 模块发生变化,只会重新打包这一个模块(而不是打包所有的模块),极大的提升了构建速度
    2、那么如何去配置呢?直接在devServer中添加一个变量就可以了

    	  devServer: {
    	    contentBase: resolve(__dirname , 'build'),
    	    compress: true,
    	    port: 3000,
    	    //开启HMR功能
    	    open: true
    	  }
    

    二、source-map

    1、source-map:一种提供源代码到构建后代码隐射技术(如果构建后代码出错了,通过映射可以追溯到源代码出错的代码处)
    2、只需要在配置文件中的module中添加这样一行代码就可以了

    	devtool:‘source-map’
    

    3、常用的source-map技术
    ①、source-map
    错误代码的准确信息和源代码的错误的位置
    ②、inline-source-map:内联
    只生成一个内连source-map
    错误代码准确信息和源代码错误的位置
    ③、hidden-source-map:外连
    错误代码错误原因,但是没有错误位置
    不能追踪源代码错误,只能提示到构建后的错误位置
    ④、eval-source-map:内联
    每一个文件都生成对应的source-map
    错误代码准确信息和源代码的错误位置
    ⑤、nosource-source-map:外部
    错误代码准确信息,但是没有任何源代码信息
    ⑥、cheap-source-map:外部
    错误代码的准确信息和源代码的错误的位置
    只能精确到行
    ⑦、cheap-module-source-map:外部
    错误代码的准确信息和源代码的错误的位置
    4、内联和外部的区别:
    ①、外部生成了文件,内联没有,
    ②、内联构建速度更快

    在这里插入图片描述

    展开全文
  • Pytorch修改预训练模型的方法汇总

    千次阅读 多人点赞 2019-12-30 10:11:55
    本文包括如何修改预训练模型的示例。常见的有四种不同程度的修改: 1、修改输入输出的类别数,即某些网络层的参数(常见的是修改通道数) 2、替换整个backbone或预训练模型的某一部分 3、修改网络中间层的结构...

    本文包括如何修改预训练模型的示例。常见的有四种不同程度的修改:

    1、只修改输入输出的类别数,即某些网络层的参数(常见的是修改通道数)

    2、替换整个backbone或预训练模型的某一部分

    3、修改网络中间层的结构(最重要,一般是重写部分中间层再整体替换)

    4、快速去除预训练模型本身的网络层并添加新的层

    正文如下

    1. 只修改输入输出的类别数,即某些网络层的参数(常见的是修改通道数)

    #1、只修改输入输出的类别数,即某些网络层的参数(常见的是修改通道数)
    model = torchvision.models.resnet50(pretrained=True)
    # 修改最后线性层的输出通道数
    model.fc = nn.Linear(2048,10)
    print(model.fc)

    2. 替换整个backbone或预训练模型的某一部分

    #2、替换整个backbone或预训练模型的某一部分
    #以下是替换骨干网的示例
    import torchvision
    from torchvision.models.detection import FasterRCNN
    from torchvision.models.detection.rpn import AnchorGenerator
    
    # 先加载一个预训练模型的特征
    # only the features:其实就是不包含最后的classifier的两层
    backbone = torchvision.models.mobilenet_v2(pretrained=True).features
    # 需要知道backbone的输出通道数,这样才能在替换时保证通道数的一致性
    backbone.out_channels = 1280
    
    # 设置RPN的anchor生成器,下面的anchor_generator可以在每个空间位置生成5x3的anchors,即5个不同尺寸×3个不同的比例
    anchor_generator = AnchorGenerator(sizes=((32, 64, 128, 256, 512),),
                                       aspect_ratios=((0.5, 1.0, 2.0),))
    
    # 定义roipool模块
    roi_pooler = torchvision.ops.MultiScaleRoIAlign(featmap_names=[0],
                                                    output_size=7,
                                                    sampling_ratio=2)
    
    # 将以上模块集成到FasterRCNN中
    model = FasterRCNN(backbone,
                       num_classes=4,
                       rpn_anchor_generator=anchor_generator,
                       box_roi_pool=roi_pooler)

    3. 修改模型网络中间层的结构(最重要,一般是重写部分中间层再整体替换)

    #3、修改网络中间层的结构(最重要,一般是重写部分中间层再整体替换)
    #以下是在ResNet50的基础上修改的,大部分是复制的源码,但后面新增+修改了一些层
    class CNN(nn.Module):
     
        def __init__(self, block, layers, num_classes=9):
            self.inplanes = 64
            super(CNN, self).__init__()
            self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3,
                                   bias=False)
            self.bn1 = nn.BatchNorm2d(64)
            self.relu = nn.ReLU(inplace=True)
            self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
            self.layer1 = self._make_layer(block, 64, layers[0])
            self.layer2 = self._make_layer(block, 128, layers[1], stride=2)
            self.layer3 = self._make_layer(block, 256, layers[2], stride=2)
            self.layer4 = self._make_layer(block, 512, layers[3], stride=2)
            self.avgpool = nn.AvgPool2d(7, stride=1)
            #新增一个反卷积层
            self.convtranspose1 = nn.ConvTranspose2d(2048, 2048, kernel_size=3, stride=1, padding=1, output_padding=0, groups=1, bias=False, dilation=1)
            #新增一个最大池化层
            self.maxpool2 = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)
            #去掉原来的fc层,新增一个fclass层
            self.fclass = nn.Linear(2048, num_classes)
     
            for m in self.modules():
                if isinstance(m, nn.Conv2d):
                    n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
                    m.weight.data.normal_(0, math.sqrt(2. / n))
                elif isinstance(m, nn.BatchNorm2d):
                    m.weight.data.fill_(1)
                    m.bias.data.zero_()
     
        def _make_layer(self, block, planes, blocks, stride=1):
            downsample = None
            if stride != 1 or self.inplanes != planes * block.expansion:
                downsample = nn.Sequential(
                    nn.Conv2d(self.inplanes, planes * block.expansion,
                              kernel_size=1, stride=stride, bias=False),
                    nn.BatchNorm2d(planes * block.expansion),
                )
     
            layers = []
            layers.append(block(self.inplanes, planes, stride, downsample))
            self.inplanes = planes * block.expansion
            for i in range(1, blocks):
                layers.append(block(self.inplanes, planes))
     
            return nn.Sequential(*layers)
     
        def forward(self, x):
            x = self.conv1(x)
            x = self.bn1(x)
            x = self.relu(x)
            x = self.maxpool(x)
     
            x = self.layer1(x)
            x = self.layer2(x)
            x = self.layer3(x)
            x = self.layer4(x)
     
            x = self.avgpool(x)
            #新加层的forward
            x = x.view(x.size(0), -1)
            x = self.convtranspose1(x)
            x = self.maxpool2(x)
            x = x.view(x.size(0), -1)
            x = self.fclass(x)
     
            return x
     
    #加载model
    resnet50 = torchvision.models.resnet50(pretrained=True)
    cnn = CNN(Bottleneck, [3, 4, 6, 3])
    #读取参数
    pretrained_dict = resnet50.state_dict()
    model_dict = cnn.state_dict()
    # 将pretrained_dict里不属于model_dict的键剔除掉
    pretrained_dict =  {k: v for k, v in pretrained_dict.items() if k in model_dict}
    # 更新现有的model_dict
    model_dict.update(pretrained_dict)
    # 加载我们真正需要的state_dict
    cnn.load_state_dict(model_dict)
    # print(resnet50)
    print(cnn)
    

    4. 快速去除预训练模型本身的网络层并添加新的层

    #4、快速去除预训练模型本身的网络层并添加新的层
    #先将模型的网络层列表化,每一层对应列表一个元素,bottleneck对应一个序列层
    net_structure = list(model.children())
    print(net_structure)
    #去除最后两层得到新的网络
    resnet_modified = nn.Sequential(*net_structure[:-2])
    
    #去除后两层后构建新网络
    class Net(nn.Module):
        def __init__(self , model):
            super(Net, self).__init__()
            #取掉model的后两层
            self.resnet_layer = nn.Sequential(*list(model.children())[:-2])
            
            self.transion_layer = nn.ConvTranspose2d(2048, 2048, kernel_size=14, stride=3)
            self.pool_layer = nn.MaxPool2d(32)  
            self.Linear_layer = nn.Linear(2048, 8)
            
        def forward(self, x):
            x = self.resnet_layer(x)
     
            x = self.transion_layer(x)
     
            x = self.pool_layer(x)
     
            x = x.view(x.size(0), -1) 
     
            x = self.Linear_layer(x)
            
            return x
    

     

    展开全文
  • 设计模式-策略模式

    2019-04-12 12:13:36
    策略模式通过对不同的算法进行封装,从而达到算法的实现和调用相分离的目的,不同的算法需要各自实现,环境类需要在根据不同的情况调用不同的算法即可。 代码实现 讲解 抽象策略接口: ...

    策略模式

    引言

    今天家里买了点大闸蟹,弟弟想红烧吃,妹妹想清蒸吃,该如何是好呢?

    正文

    策略模式,就是将一系列功能类似的算法包装起来,使其可以相互替换,并且每种算法内部的改变并不会影响用户的调用。

    核心思想

    策略模式通过对不同的算法进行封装,从而达到算法的实现和调用相分离的目的,不同的算法只需要各自实现,环境类只需要在根据不同的情况调用不同的算法即可。

    代码实现

    讲解

    抽象策略接口:

        public interface Strategy {
            public void strategyMethod();
        }
    复制代码

    不同的算法:

        class StrategyA implements Strategy {
    
            @Override
            public void strategyMethod() {
                System.out.println("StrategyA");
            }
        }
    
        class StrategyB implements Strategy {
            @Override
            public void strategyMethod() {
                System.out.println("StrategyB");
            }
        }
    复制代码

    环境类:

        class Context {
            private Strategy mStrategy;
    
            public Strategy getStrategy() {
                return mStrategy;
            }
    
            public void setStrategy(Strategy strategy) {
                this.mStrategy = strategy;
            }
    
            public void strategyMethod() {
                mStrategy.strategyMethod();
            }
        }
    复制代码

    实例

    //做螃蟹接口
    public interface CookCrab {
        void cookCrab();
    }
    复制代码
    //红烧螃蟹
    public class BraiseCrab implements CookCrab {
        @Override
        public void cookCrab() {
            System.out.println("红烧螃蟹哦~");
        }
    }
    复制代码
    //清蒸螃蟹
    public class SteamCrab implements CookCrab {
        @Override
        public void cookCrab() {
            System.out.println("清蒸螃蟹哦~");
        }
    }
    复制代码
    //环境类
    public class CrabContext {
        private CookCrab mCookCrab;
    
        public CookCrab getCookCrab() {
            return mCookCrab;
        }
    
        public void setCookCrab(CookCrab cookCrab) {
            this.mCookCrab = cookCrab;
        }
    
        public void startCookCrab() {
            mCookCrab.cookCrab();
        }
    }
    复制代码
    //调用
    public class example {
        public static void main(String[] args) {
            //推荐写法
            CrabContext crabContext = new CrabContext();
            crabContext.setCookCrab(new BraiseCrab());
    //        crabContext.setCookCrab(new SteamCrab());
            crabContext.startCookCrab();
        }
    }
    复制代码

    总结

    策略模式将实现和调用进行分离,从而可以对每种算法进行更有效的管理。同时由于其对开闭原则的良好支持,它可以在不修改原来代码的情况下,增加新的算法。但在使用策略模式之前,需要对不同的算法都要有所了解,才能更好的理解其异同并选择合适的算法。

    展开全文
  • 制作ABlogWithGolang ... 现在,您需要在路由admin/postfile进行第一个发布,就可以admin/postfile将标题,URL图像和正文压入markdown中。 那就是您所需要的,现在去访问您的页面,我现在无话可说了,再见
  • 将“新标签”替换为“身体阳性”运动“自定义”页面,并添加书签和“身体正面”墙纸。 带有“身体正面美学”壁纸的新标签! 适用于您自定义浏览器的身体正面美学的精美图片! 新标签页正文积极的自定义NEW TAB扩展...
  • 网页制作中有用的添加背景图片代码,添加普通图片,该图片显示在涂鸦面板代码,如何加音乐,如何改变鼠标样式,独特的鼠标样式显示你独特的个性 ……改变链接字体和颜色 <style type=text/css> <!-- A:link{COLOR: ...
  • 本附录总结了正文中没有介绍的其他C++操作符,如按位操作符等。 附录F:ddne模板类 本附录总结了string类方法和函数。 附录G:STL方法和函数 本附录总结了STL容器方法和通用的STL算法函数。 附录H:精选读物和...
  • 本附录总结了正文中没有介绍的其他C++操作符,如按位操作符等。 附录F:ddne模板类 本附录总结了string类方法和函数。 附录G:STL方法和函数 本附录总结了STL容器方法和通用的STL算法函数。 附录H:精选读物和...
  • 本附录总结了正文中没有介绍的其他C++操作符,如按位操作符等。 附录F:ddne模板类 本附录总结了string类方法和函数。 附录G:STL方法和函数 本附录总结了STL容器方法和通用的STL算法函数。 附录H:精选读物和...
  • 本附录总结了正文中没有介绍的其他C++操作符,如按位操作符等。 附录F:ddne模板类 本附录总结了string类方法和函数。 附录G:STL方法和函数 本附录总结了STL容器方法和通用的STL算法函数。 附录H:精选读物和...
  • VBSCRIPT中文手册

    热门讨论 2010-11-12 10:13:06
    Replace 方法 替换在正则表达式搜索中已发现的正文。 RGB 函数 返回表示 RGB 颜色值的数。 Right 函数 返回字符串最右边的指定数量的字符。 Rnd 函数 返回一随机数。 Round 函数 返回指定位数、四舍五入的数。 ...
  • vb Script参考文档

    2009-07-28 22:13:02
    Replace 方法 替换在正则表达式搜索中已发现的正文。 RGB 函数 返回表示 RGB 颜色值的数。 Right 函数 返回字符串最右边的指定数量的字符。 Rnd 函数 返回一随机数。 Round 函数 返回指定位数、四舍五入的数。 ...
  • VBSCRIP5 -ASP用法详解

    2010-09-23 17:15:46
    Replace 方法 替换在正则表达式搜索中已发现的正文。 RGB 函数 返回表示 RGB 颜色值的数。 Right 函数 返回字符串最右边的指定数量的字符。 Rnd 函数 返回一随机数。 Round 函数 返回指定位数、四舍五入的数。 ...
  • 星外提权工具

    2012-07-23 18:02:01
    下面正文开始。 众所周知要成功提权星外主机就要找到可写可执行目录,可近来星外主机的目录设置越来越BT,几乎没有可写可执行目录。另一个“提权思路”出现了。寻找服务器上安装的第3方软件某些文件的权限问题来...
  • Replace 方法 替换在正则表达式搜索中已发现的正文。 RGB 函数 返回表示 RGB 颜色值的数。 Right 函数 返回字符串最右边的指定数量的字符。 Rnd 函数 返回一随机数。 Round 函数 返回指定位数、四舍五入的数。 ...
  • VBScript 语言参考

    2008-10-07 21:30:05
    Replace 方法 替换在正则表达式搜索中已发现的正文。 RGB 函数 返回表示 RGB 颜色值的数。 Right 函数 返回字符串最右边的指定数量的字符。 Rnd 函数 返回一随机数。 Round 函数 返回指定位数、四舍五入的数。 ...
  • javascript函数的解释

    2011-02-26 11:03:52
    58.innerTEXT的值和上面的一样,不过不会把这种标记显示出来. 59.contentEditable可设置元素是否可被修改,isContentEditable返回是否可修改的状态. 60.isDisabled判断是否为禁止状态.disabled设置禁止状态 61....
  • 入门学习Linux常用必会60个命令实例详解doc/txt

    千次下载 热门讨论 2011-06-09 00:08:45
    -s,--strip:用strip命令删除symbol table,适用于第一及第二种使用格式。 -S,--suffix=后缀:自行指定备份文件的<后缀>。 -v,--verbose:处理每个文件/目录时印出名称。 --help:显示此帮助信息...
  • 本书不仅介绍操作系统的各要素,同时涉及开发操作系统需要的各个方面,比如如何建立开发环境、如何调试以及如何在虚拟机中运行等。书中的实例操作系统采用IA32作为默认平台,所以保护模式也作为必备知识储备收入书...
  • 本书不仅介绍操作系统的各要素,同时涉及开发操作系统需要的各个方面,比如如何建立开发环境、如何调试以及如何在虚拟机中运行等。书中的实例操作系统采用IA32作为默认平台,所以保护模式也作为必备知识储备收入书...
  • 不扫描驱动器看是否有坏区域,因此应对以前格式化过的驱动器使用该参数。  /fs:file-system  指定要使用的文件系统:FAT、FAT32 或 NTFS 。如果未指定文件系统,将使用现有的文件系统格式。  Map  显示...
  • 11.5 讨论在创建表时如何创建约束 329 11.5.1 约束的类型 330 11.5.2 定义约束 332 11.6 认证小结 335 11.7 本章测试题 336 11.7.1 自测题 336 11.7.2 实验题 338 11.7.3 自测题答案 338 11.7.4 实验题答案...
  • 4月25日,跟人民邮电出版社信息技术分社签订合同,书名暂定《程序员编程艺术:面试和算法心得》,有更好的名字再替换。 2014年5月,逐章逐节逐行逐字优化文字描述,测试重写优化每一段每一行每一个代码,确定代码...
  • 对话框中可包括用于输入正文、滚动正文、从列表中选择列表项等操作的控制。对话框管理和处理来自这些控制的输入,使应用程序可使用这些信息,来完成所要求的命令操作。 通过使用"资源"可以共享很多有用的数据,比如...
  • Leland Wilkinson的著作在理论上改善了这种状况,他提出了一套图形语法,让我们在考虑如何构建一幅图形的时候不再陷在具体的图形元素里面,而是把图形拆分为一些互相独立并且可以自由组合的成分。这套语法提出来之后...
  • 开始进入正文前先说下这个系列中我的行文思路:1. 代码尽量通过图片展示,既美观又方便阅读,反正不需要大家复制代码。2. 文章中会讲我认为重要或者有意思的代码,对于其他代码请自行阅读...
  • javascript文档

    2009-08-11 10:44:24
    如果需要查看某个主题(例如对象),则有对该主题进行详细说明的章节可供查阅。 如何操作呢?单击左边任意一个标题,即可显示该标题所包含的项目列表。再从该列表中选择要查看的主题。在打开所选主题后,就可以...
  • JScript 语言参考

    2009-05-28 08:53:39
    如果需要查看某个主题(例如对象),则有对该主题进行详细说明的章节可供查阅。 如何操作呢?单击左边任意一个标题,即可显示该标题所包含的项目列表。再从该列表中选择要查看的主题。在打开所选主题后,就可以...

空空如也

空空如也

1 2
收藏数 33
精华内容 13
关键字:

如何只替换正文