Go语言中的包管理工具之Go Modules的使用

golang 依赖管理之 mod go 很早就考虑了依赖管理的问题,内置 go get 命令,可以直接获取对应的依赖,非常方便,但是有一个巨大的缺陷,没有版本的维护和管理,而版本不一致可能会导致各种兼容性问题,因此出现了很多第三方依赖管理工具,dep 和 glide 就是其中的佼佼者,到了 go 1.11 官方终于推出了自己的依赖管理工具 mod,并内置在 go 版本中,go mod 使用简单,功能强大,并且能自动兼容大多数之前的... 阅读详情

GoLang 中常用的包管理的方式

  • 常用的有三种
    • Go Path
    • Go Vendor
    • Go Modules

关于 Go Modules


1 ) 概述

  • Go的包管理,经过社区和官方的共同努力下,最终在百家争鸣后
  • Go官方在 2018.8 推出了go 1.11版本中的Go Modules,并且很快成为一统江湖的包管理方式
  • Go Modules已经成为目前最主流的包管理工具
  • 需要注意的是,go从1.13版本开始 Go Modules 被默认选择使用
  • 在go的1.11 和 go的1.12 版本中,需要我们手动开启 Go Modules
管理方式版本发布时间
GoPath 模式< 1.5 版本2009.11.10
Go Vendor >= 1.5 版本2015.8.19
Go Modules >=1.11 版本 2018.8.24
  • 关于Go Modules,我们必须要搞明白下面这几个问题
    • 第一个是 Go Modules 的用法
    • 第二个是 go.mod 文件是什么时候生成的,有什么作用,具体有哪些内容
    • go.sum 文件是什么时候生成的,有什么作用,具体有哪些内容,其中的哈希值是怎么计算的, 怎么实现包校验的

2 ) Go Modules 用法

  • 在go1.11的时候就发布了 Go Modules, 但是功能默认是关闭的,直到go的1.13版本才开始开启
  • 所以在go 1.11 和 go 1.12 版本中,我们需要通过go提供的变量,GO111MODULE 来开启 Go Modules
    • 这里跟之前的 Go Vendor 里面开启 govendor 的环境变量
    • 即:GO15VENDOREXPERIMENT 这个环境变量类似
  • GO111MODULE 也属于go的阶段性变量
    • 通常在某个功能发布之初的几个版本,是需要手动去开启的
    • 等稳定下来,被开发者接受之后,会在后续的版本中默认开启
  • GO111MODULE,它有三个值
    • 第一个是 on, 它表示开启 Go Modules
    • 第二个是 off 它表示关闭 Go Modules
    • 第三个是 auto
  • 当项目路径在Go Path目录外部时
    • 如果你设置的是 auto 的话,我们这个 GO111MODULE 就会被设置成 on
  • 那当项目路径在 Go Path内部时
    • 即使存在 go.mod 文件, 也会将 GO111MODULE 设置成 off
  • 在Unix环境下(Linux, MacOS)
    • 需要把 GO111MODULE 设置成 on,然后通过 export 将这个环境变量导出
    • export GO111MODULE=on
  • 在Windows环境
    • 我们可以通过 set命令将 GO111MODULE 设置成 on
      • $ set GO111MODULE=on
    • 当然直接修改 Go 的 Path 环境变量也是可以的
  • 还有一种方式是两种类型的操作系统都可以支持的
    • 我们可以通过 $ go env -w GO111MODULE=on
    • 加上 -w 参数来将这个 GO111MODULE 设置成on
    • 如果没有任何输出就是正常了
    • 注意,我们在执行上面这个命令的时候可能会抛出一个 warning
    • 这个waring的意思, 就是说我们不能通过这个 go env 指令去覆盖我们环境变量的设置
    • 也就是说,如果我们在环境变量里面已经设置了 GO111MODULE 这个环境变量
    • 我们就需要去改环境变量里面这个 GO111MODULE 这个值,而不能通过命令的方式去设置
    • 通常这些环境变量可能会在
      • /etc/profile 文件里
      • 或者是 ~/bash.profile文件里
      • 或者是 /etc/.bashrc 文件里
      • 或者是 ~/.bashrc 文件里
      • 或者是 ~/.profile 文件里
    • 需要注意的是,仅仅设置 GO111MODULE,这个环境变量为on
    • 并不能代表项目就使用了 Go Modules 方式来管理包
  • 我们使用 $ go mod init 将项目初始化成一个 Go Modules 工程
  • 这个命令需要在项目的根目录下执行执行成功后,在当前目录下面生成一个 go.mod 的文件

3 ) go mod 的具体用法

  • 需要准备好环境,go版本 需要 >= 1.11
    • 如果go的版本没有到 1.13, 就需要将 GO111MODULE 设置成 on
    • 查看我们当前使用的go版本,通过 $ go version
  • 之后,可能需要设置go代理
    • 如果我们是开发环境,我们可以直接在这个编辑器IDE上进行设置,比如 GoLand
    • 在这个编辑器上,file / settings里面,就可以对这个go的环境变量进行配置
    • 可以找到Go Modules
      • 需要勾选这个 Enable Go modules integration
      • 填入 Environment, 设置 Go Path 和 Go Proxy
      • GOPROXY https://goproxy.cn/,https://mirrors.aliyun.com/goproxy/,direct
      • 这里 direct的意思是当从上面两个途径无法获取,就从源码获取
      • GOPRIVATE 这个变量是内部包的配置,一般在公司部署的私网内的地址
  • 在生产环境中的设置
    • 比如在Unix环境下
      • 我们可以通过将下面
      • export GOPROXY https://goproxy.cn/,https://mirrors.aliyun.com/goproxy/,direct
      • 放入 /etc/profile 里面
    • 在Windows下,通过 set 指令设置 GOPROXY
      • $ set GOPROXY=https://goproxy.cn/,https://mirrors.aliyun.com/goproxy/,direct
    • 也支持 $ go env -w GOPROXY=https://goproxy.cn/,https://mirrors.aliyun.com/goproxy/,direct

4 ) 工程示例

  • $ mkdir go-mod-test && cd go-mod-test 目录, 仅作为示例
  • $ go mod init go-mod 创建一个go-mod工程目录
  • 可看到里面生成一个 go.mod 文件
  • 在这里就可以编写程序了,$ touch main.go
    package main
    
    import 'github.com/astaxie/beego/logs'
    
    func main() {
      logs.Warn('demo')
    }
    
  • 现在解决 第三方包 引用的问题, 到工程根目录中执行
  • $ go mod tidy
    • 这时候就会自动找到项目以来的包
    • 解决工程中包依赖的关系,如果缺少包,则下载并维护信息到 go.mod
    • 如果没有用的,则移除
  • 执行 go run main.go 正常输出
  • 在 go.mod 下又生成了 go.sum的文件
    • 这里写的是工程所有直接依赖包和间接依赖包
  • go mod download
    • 下载依赖包到本地缓存
    • 如果 go.mod 和 go.sum 已经包含依赖包的信息,而且依赖包还没有下载到本地
    • 这个指令会把依赖包下载到本地
  • go mod vendor
    • 为了兼容 go vendor 模式
    • 在 go mod 发布之前,go vender 使用是比较普遍的
    • go mod 也支持将依赖包通过我们这个go mod vender 指令复制到我们项目 vendor 目录当中
    • 可以看到我们当前这个项目里面是没有 vendor 目录的
    • 那我们在这个项目的根目录里面,执行 go mod vendor
      • 刷新一下,我们可以看到它就为我们生成的一个vendor目录
      • 在 vendor 里面还有一个 modules.txt 文件
      • 这个文件记录了我们当前这个venders里面依赖的包以及包的版本信息。
  • 那上面四个指令是最常用的,还有一些其他指令
    • 比如 $ go help mod 可以看到我们go mod支持的一些指令
    • 这里面包括还有一些 go mod graph,go mod why, 以及 go mod verify
    • 这些是查看和校验依赖的一些指令
    • go mod edit, 我们可以用来编辑这个 go.mod 文件, 平时也很少使用, 我们了解即可

5 ) 关于 go.mod 和 go.sum

  • 接下来需要重点了解两个文件
    • 1 ) go.mod

      • 这个文件里面主要是描述了模块的一些属性
      • 包括它的其他模块的go版本的依赖的信息
        • 里面第一行就是 module 的name,这个name一般使用 git仓库上的路径
        • 第二行是版本信息,项目依赖的最低版本要求,只是获取当前go版本的信息
        • 第三行,require 指令,包含导入的 非工程项目内的包
        • 后面都是 require
        • 工程依赖包有直接依赖包,如beego, 还有间接依赖包
          • 所谓间接依赖包就是直接依赖包的依赖包
          • 如果beego中需要依赖一些包,有一些包没有 go.mod 文件则会添加到工程的 go.mod中
          • 并且生成一个尾版本号
            • 尾版本号格式: 版本号 - UTC的提交时间(提交到github的时间) - commit 哈希的前缀
    • 2 ) go.sum

      • 在触发项目编译后生成,如 go build,go run等指令
      • 里面详细罗列了项目直接或间接依赖的所有模块的版本
      • 每一条包含了模块依赖的路径,导入的版本和哈希值
      • 每个依赖包有可能有多条信息
        • 一种是有 go mod 标识,后面哈希值是 go.mod 的哈希
        • 另一种没有,则后面的哈希是包的每一个文件的哈希
      • 实现包的校验
        • 当我们拿到某个项目的源代码,并尝试在构地进行构建的时候
        • go命令会从本地缓存中去查找所有 go.mod 中记录的依赖包
        • 并且会计算出本地依赖包的哈希值
        • 然后与我们 go.sum 文件中的记录进行对比, 也就是说
        • 它会检测某地缓存中使用的依赖包的版本是否满足项目中 go.sum 文件中期望的版本
        • 如果不满足,就说明本地缓存目录当中的依赖包版本和项目中go.sum文件记录的版本的哈希值是不一致的
        • 这个时候构建就会被拒绝。
        • 这样就可以确保相同的依赖包在任何环境使用这些依赖包的源码,它都是一样的
        • 依赖包中任何一个文件,包括 go.mod 的改动,都会改变它整体的哈希值
        • 在 go.sum 中记录额外的 go.mod 的文件,就是为了在计算这个依赖树的时候
        • 不用去下载完整的依赖包版本,只根据 go.mod 就可以计算出这个依赖信息
        • 主要目的就是加快这个依赖包的校验
        • 那每条记录的哈希值, 都有一个表示的哈希算法的一个h1的哈希算法。
        • 这个哈希算法是由SHA-256计算出来的
        • 那模块版本的SHA-256的哈希值主要是用来校验当前缓存的模块
        • 用来准备go在今后的操作过程中,保证项目中所有的依赖的那些模块版本都不会被篡改
        • 在每次我们构建项目发现有模块缺少的时候,如果在缓存中不存在
        • 那就需要下载并且计算这个包的哈希
        • 并且添加到 go.sum当中,如果缓存中已经存在,就需要匹配 go.sum 中已有的记录
        • 需要注意的是,在每次缺少模块的时候,也就是说我们需要的依赖包
        • 它不在 go.sum 文件当中,而且是一个公网可下载的包
        • go命令就会去go的校验数据库获取模块的校验和,它的默认配置是这个 sum.golang.org
        • 我们也可以使用中国大陆官方的这个校验数据库 sum.golang.google.cn
        • 这个校验数据库,会查询并获取这个模块的校验和
        • 如果下载的这个模块的校验和与它计算出来的校验和不匹配
        • 那我们的 go mod 命令就没办法成功执行, 那如果能够匹配
        • 就会把校验和写到go.sum文件当中
        • 这里有三种情况,它不会对依赖包做哈希校验
          • 第一种, 就是我们配置的这个 GOPRIVATE 匹配到的包
            • 当我们配置的 GO PRIVATE 这个环境变量被我们 GO PRIVATE 匹配到的这些模块包就不会check sum校验
            • GO PRIVATE 这个变量主要是用来设置我们内部的一些包, 不走 GO PROXY 配置的代理
            • 因为内部的包,基于代码安全的考虑,都不会上传到我们的github上面
          • 第二个, 就是我们可以通过 go mod vendor 命令将依赖包全部下载到我们工程的根目录下的 vendor 目录下面
            • 它可以用来做离线编译
            • 打包到 vendor 目录中的包也不会再做哈希校验
          • 第三个, 就是 GOSUMDB 设置为off的时候
            • 所有的包都不会做包校验,相当于关闭了我们这个go sum的校验
    • 需要注意的是,同一个模块版本的数据只会缓存一份。那所有其他模块呢都会共享使用。

    • 如果你希望清除当前已经缓存的模块的版本数据,可以执行这个 $ go clean -modcache

6 ) go.mod 和 go.sum 对比

  • 为什么我们看到的 go.sum 文件中记录的依赖包的版本数量会比go.mod 文件要多很多
  • go.mod 记录的是直接依赖的依赖包版本,直接依赖包版本,不含 go.mod 文件时,才记录构建依赖赖的版本
  • go.sum则是要记录构建依赖到的所有依赖包的版本,它包括直接依赖包和间接依赖包

7 )关闭依赖包校验

  • 如果不希望进行依赖包校验,可以关闭
  • 可以将这个GOSUMDB 设置成 off 就可以关闭我们当前的 go sum 校验
    • $ go env -w GOSUMDB=off
    • 或 将环境变量添加到 /etc/profile

8 ) 依赖包的存储对比

  • Go Path 模式下和 Go Modules 模式下,依赖包的存储路径是不一样的
  • 在 Go Path 模式下,依赖包存储在这个 $GOPATH/src
  • 这个目录下只保存特定依赖包的一个版本
  • 我们通过 go get 下载的包,也包含完整的仓库信息的,也就是包含了 .git 的目录
  • 而我们在 GOMODULES 模式下,依赖包会存储在这个 $GOPATH/pkg/mod 下面
    • 而且这个目录下面可以存储特定依赖包的多个版本
    • 每个版本会占用一个目录,那这个目录里面,只包含依赖包文件,不包含 .git 的目录

Go编码原则与建议

  • 构建go项目的时候,也需要遵循一些原则和规范性的建议
  • 1 ) 我们一个目录名,下面只能有一个package,否则我们的编译器就会报错
  • 2 ) 建议一个package名的内容放在一个目录下面, 方便我们做项目管理
  • 3 ) 建议目录名和package名保持一致,这样也能方便我们对项目进行管理
Go:go mod vendor 使用 Go:go mod vendor 使用 1.背景 我们基于 go mod 机制来管理我们项目的依赖库版本,其中 go.mod 记录了依赖库版本信息。 一般第三方依赖库(包括公司内网gitlab上的依赖库),其源码都不被包含在我们的项目内部,而是在编译的时候go连接公网、内网下载到本地GOPATH,然后编译。 问题是,有些时候需在无公网、无内网(无法连接内网gitlab)的情况下编译go项目,如何做呢? 在此时,需使用go mod vendor将项目的依赖库下载到项目内部,作为项目的一部分来编译。 PS: 阅读详情

相关推荐

Go 语言开发工具

Go 语言开发工具的选择取决于个人的喜好和项目需求。VS Code 和 GoLand 是功能强大的 IDE,适合大型项目和需要丰富特性的开发者。对于喜欢轻量级编辑器的开发者,可以选择 Atom 或 Sublime Text。在包管理方面,Go Modules 是当前的主流选择。调试工具方面,Delve 提供了良好的 Go 语言调试体验。代码质量工具如 GoLint、Go Vet 和 Golint 可以帮助开发者提高代码质量。通过合理选择和使用这些工具,开发者可以更高效地使用 Go 语言进行开发。

wjs2024的博客 1016

go mod vendor 依赖管理命令

在 Go 1.11 版本之前,Go 语言使用 GOPATH 环境变量来管理项目的依赖。但是从 Go 1.11 版本开始,引入了 Go Modules 的概念,可以更方便地管理项目的依赖关系。当你的项目使用 Go Modules 进行依赖管理时,可以使用r 命令将项目依赖的模块复制到vendor目录下。这样做的好处是,可以将项目所需的依赖模块与项目代码一起打包,使得项目更加独立和可移植。

Ch3nnn的博客 2635

Go 学习笔记(69)— Go Modules 使用详解(设置GO111MODULE、设置代理、初始化项目、创建依赖项、回退依赖项版本、删除未使用的依赖项)

采用 Go Module 的方式,可以在任何位置创建你的 Go 语言项目。 假设你的项目位置是 /home/wohu/demo,打开终端,输入如下命令切换到该目录下: $ cd /home/wohu/demo 然后再执行如下命令创建一个 Go Module 项目: $ go mod init go_demo 执行成功后,会生成一个 go.mod 文件。然后在当前目录下创建一个 main.go 文件,这样整个项目目录结构是: wohu@wohu:~/demo$ tree . ├── go.mod ├──

wohu1104的专栏 2万+

go mod vendor简明介绍

vendor 机制并不是一个完美的解决方案。它需要将所有的依赖都复制到 vendor 目录中,这可能会导致项目的大小变得非常大。另外,这可能会对代码审查和版本控制系统(如 Git)的性能产生负面影响。因此,从Go 1.11版本开始,使用 Go Modules 进行依赖管理已经成为了推荐的做法,而vendor机制逐渐被淡化。不过,vendor目录并没有被完全废弃。

ThinkStu的博客 2487

用STM32F103单片机控制电调制动无刷电机

用电调控制无刷电机制作遥控飞艇 蓝牙控制 调控电调 无刷电机 用电调控制无刷电机制作遥控飞艇 代码区 mian.c #include "delay.h" #include "sys.h" #include "usart.h" #include "usart3.h" #include "timer.h" #include "led.h" #include "key.h" int main(v...

子非鱼 的博客 2万+

Python 使用Pygame库实现足球游戏:创建一个球员和一个足球,并使玩家能够控制球员的移动。游戏将包括碰撞检测、简单的物理模拟,以及基本的用户输入处理

本文将介绍如何使用Python和Pygame库创建一个简单的足球游戏。我们将搭建一个基本的游戏环境,创建一个球员和一个足球,并使玩家能够控制球员的移动。游戏将包括碰撞检测、简单的物理模拟,以及基本的用户输入处理。这个简单的足球游戏展示了Pygame的一些基本功能。虽然这是一个简单的游戏,但它包含了创建游戏循环、用户输入处理、物理模拟、碰撞检测等重要概念。

程序熊的博客 743

Go的包管理工具和第三方库

工具选择:Go Modules是现代Go项目的标准工具,建议所有新项目使用它。避免旧方法如GOPATH。库管理:定期运行维护依赖清洁。使用go vet和测试工具确保库兼容性。资源推荐pkg.go.dev流行库示例:Gin(Web框架)、GORM(ORM)、Cobra(命令行工具)。通过合理使用Go Modules和第三方库,你可以显著提升开发效率和项目质量。如果在实际项目中遇到问题,可以查阅官方资源或社区论坛寻求帮助。

u012250895的博客 832

NGSIM数据集字段解析:从车辆轨迹到交通行为分析

本文深度解析NGSIM数据集的核心字段及其在交通行为分析中的应用。详细解读了车辆时空定位、状态属性及交互关系等关键字段,并通过高速路“幽灵堵车”和城市路口左转行为两个实战案例,展示了如何利用该数据集进行微观交通行为建模与驾驶特征提取,为交通流研究和自动驾驶算法测试提供数据基础。

weixin_29172963的博客 148

Go基础之环境搭建

Go语言,也被称为Golang,是一种由Google开发的静态类型、编译型编程语言,是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。Go是从2007年末由主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。go.mod是Go Modules的核心文件,用来定义模块及其依赖项。

2509_93882485的博客 766

tkinter使用label视频播放

tkinter是python的界面开发包 使用tkinter显示视频流的一个办法是使用label来逐帧显示图片。 from Tkinter import * from PIL import ImageTk, Image import cv2 root = Tk() # Create a frame app = Frame(root, bg="white") app.grid() # Create a label in the frame lmian = Label(app) lmain.grid(

六十英里的专栏 5527

VS2022编译xlnt库

xlnt是一个用于读写Excel文件的C++库,本文介绍如何用源代码编译静态或动态xlnt库

QQVQQ的博客 7288

Go语言 包管理

包管理 1 Go Modules是什么? Go语言通过包管理来封装模块和复用代码,这里我们只介绍Go Modules管理方法 Go Modules于Go语言1.11版本时引入,在1.12版本正式支持,是由Go语言官方提供的包管理解决方案 Modules是相关Go包的集合,是源代码交换和版本控制的单元。go命令直接支持使用Modules,包括记录和解析对其他模块的依赖性 2 Go Modules的使用方法 2.1 环境变量 首先需要设置环境变量,可以使用go env命令查看当前配置。 $ go env GO1

xqldyssssyd的博客 189

4、同轴3 - RRR球面并联机构运动分析与自主移动农业水果采摘机器人设计

本文研究了同轴3-RRR球面并联机构的运动学与速度分析,采用几何与数值方法进行位置分析,并利用螺旋理论简化雅可比矩阵的推导,通过ADAMS仿真验证了结果的准确性。同时提出一种新型自主移动农业水果采摘机器人设计,具备多功能末端执行器、水果软管转移系统和配重式静态稳定性结构,旨在减少采摘损伤、提升效率。文章还探讨了该机构在机器人控制与仿真中的应用潜力,以及采摘机器人在智能化升级与多机协作方面的发展方向。

y4z5a6b7的博客 246

go mod 指定版本_通过项目学习Go语言之go mod

Go语言的包管理经过了多种工具的演变,上一节中我们通过配置GOPATH来存放源代码进行包的管理,其实称不上包管理,在起初开发的时候我们会把我们一个系统依赖的全部源代码下载到src目录,当多个 系统依赖不同版本的代码库时,处理起来十分的麻烦。所以,Go的包管理一致受到开发者的诟病。后来社区出现了几个针对Go开发的包管理工具。从Godep包管理工具到glide,直至go1.5版本引入go vender...

weixin_30979383的博客 1417

《测控仪器设计课后习题答案-浦昭邦-王宝光

《测控仪器设计课后习题答案-浦昭邦-王宝光 1.1. 测控仪器的概念是什么? 测控仪器则是利用测量和控制的理论,采用机、电、光各种计量测试原理及控制系统与计算机相结合的一种范围广泛的测量仪器。 1.2. 为什么说测控仪器的发展与科学技术发展密切相关? 仪器仪表的用途和重要性— 遍及国民经济各个部门,深入到人民生活的各个角落,仪器仪表中的计量测试仪器与控制仪器统称为测控仪器,可以说测控仪器的水平是科学技术现代化的重要标志。 仪器仪表的用途: 在机械制造业中:对产品的静态与动态性能测试;加工过程的控制与监测;设

无名何许人的博客 2976

python如何给声音增加回声效果

创建任何声音对象的回声效果。使用sndarray和numpy来创建原始声音的偏移和衰减副本。目前它只是使用硬编码的值来设置回声的数量和延迟。你可以根据自己的需要轻松地重新创建。这段注释说明了make_echo函数的用途和实现方式,即通过pygame的sndarray模块和numpy库来处理声音数据,生成具有回声效果的声音。函数中使用了固定的回声数量和延迟时间,但这些值可以根据用户的需求进行调整。

zhangzhechun的专栏 977

Go 包管理

8.包管理 8.1 Go Modules是什么? Go语言通过包管理来封装模块和复用代码,这里我们只介绍Go Modules管理方法 Go Modules于Go语言1.11版本时引入,在1.12版本正式支持,是由Go语言官方提供的包管理解决方案 Modules是相关Go包的集合,是源代码交换和版本控制的单元。go命令直接支持使用Modules,包括记录和解析对其他模块的依赖性 8.2 Go Modules的使用方法 8.2.1 环境变量 首先需要设置环境变量,可以使用go env命令查看当前配置。 $ go

AbsoluterlyHero 260

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Go学习笔记:包管理

8.1 Go Modules是什么? Go语言通过包管理来封装模块和复用代码,这里我们只介绍Go Modules管理方法 Go Modules于Go语言1.11版本时引入,在1.12版本正式支持,是由Go语言官方提供的包管理解决方案 Modules是相关Go包的集合,是源代码交换和版本控制的单元。go命令直接支持使用Modules,包括记录和解析对其他模块的依赖性 8.2 Go Modules的使用方法 8.2.1 环境变量 首先需要设置环境变量,可以使用go env命令查看当前配置。 $ go env G

weixin_43831209的博客 159

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Go包管理

8.包管理 8.1 Go Modules是什么? Go语言通过包管理来封装模块和复用代码,这里我们只介绍Go Modules管理方法 Go Modules于Go语言1.11版本时引入,在1.12版本正式支持,是由Go语言官方提供的包管理解决方案 Modules是相关Go包的集合,是源代码交换和版本控制的单元。go命令直接支持使用Modules,包括记录和解析对其他模块的依赖性 8.2 Go Modules的使用方法 8.2.1 环境变量 首先需要设置环境变量,可以使用go env命令查看当前配置。 $ go

miaochangq的博客 372

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Go_包管理

包管理 Go Modules go语言通过包管理来封装和复用代码,比较常用的有官方提供的Go Modules。 Modules 是相关Go包的集合,是源代码交换和版本控制的单元,go命令支持直接使用Modules Go Modules的使用方法 //ch go env #set GO111MODULE=on #set GOARCH=amd64 #set GOBIN= #set GOPROXY=https://goproxy.cn,direct #set GOROOT=C:\Go #set G

时光的当铺 578

Go语言学习[9]_包管理

Go语言学习 道法自然 文章目录Go语言学习前言一、包管理1.1 Go Modules是什么?1.2 Go Modules的使用方法1.2.1 环境变量1.2.2 初始化模块1.2.3 go get1.2.4 常用命令总结 前言 Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go语言语法简单,包含了类C语法。快速的编译时间,开发效率和运行效率高。组合的思想、无侵入式的接口。 参考连接 一、包管理 1.1 Go Modules是什么?

牛博通的博客 202

GO中的包管理

我们知道,程序是可以通过封装来提高代码的复用性。那么GO就是可以通过包管理的机制来管理代码。 Go Modules于Go语言1.11版本时引入,在1.12版本正式支持,是由Go语言官方提供的包管理解决方案。Modules是相关Go包的集合,是源代码交换和版本控制的单元。go命令直接支持使用Modules,包括记录和解析对其他模块的依赖性 设置环境变量 首先需要设置环境变量,可以使用go env命令查看当前配置。 $ go env GO111MODULE="auto" GOPROXY="https://p

weixin_40586929的博客 741

Go Modules 管理包工具

简介 在 Java 的项目中,有 Maven 和 Gradle 这些很好用的依赖版本管理工具,简直不要太方便了,但是在 Golang 的项目中,之前的 Golang 官方并没有提供版本管理工具,我们以前用 go get 获取依赖其实是有潜在危险的,因为我们不确定最新版依赖是否会破坏掉我们项目对依赖包的使用方式,即当前项目可能会出现不兼容最新依赖包的问题。之后官方出了一个 vendor 机制,将项目...

爱死亡机器人 772

go build不从本地gopath获取_Go包管理GOPATH、vendor、go mod机制

简介Golang 作为开源编程语言,在 2012 年编程语言 Go 1 发布之后,一直在不断发展,并伴随着云原生而广泛进入各大公司。在互联网发展至今,软件系统不断膨胀。各个编程语言也都逐步支持了依赖包管理工具,从而加快软件迭代速度,提升整体研发效率。依赖包管理工具能够快速的使用公司内部的依赖模块或者开源库,极大的提升软件团队开发效率,减少迭代成本。Go 语言的包管理工具也伴随着开源...

weixin_33788465的博客 2425

Go包管理方式

Go也有支持多版本管理的工具,例如:gvm(https://github.com/moovweb/gvm) 2. Go的三种包管理 go的包管理方式主要有 3 种:以目前的情况来说,更推荐选择go module的包管理方式 两个路径 4. go path 【不推荐使用】 go path是最早的依赖包管理方式(Go1.0),启用GOPATH模式(注意区分GOPATH模式和GOPATH路径,这是两个语境),要求将所有工程代码要求放在GOPATH/src目录下。 在工程经过go build、go i

m0_63770801的博客 809

GO的包管理工具和第三方库

Go语言(Golang)的包管理工具主要用于管理项目依赖,包括标准库和第三方库。第三方库是由社区开发的可重用代码,通常托管在代码仓库如GitHub上。Go的官方包管理工具是Go Modules,它从Go 1.11版本开始引入,取代了早期的GOPATH机制。下面我将逐步介绍如何使用Go Modules管理第三方库,确保内容真实可靠。通过以上步骤,你可以高效管理Go项目的依赖和第三方库。如果有具体问题,如某个库的使用细节,欢迎提供更多信息,我会进一步解答!语句导入第三方库,然后调用其函数或方法。

2501_93583526的博客 1398
上一篇: Go语言中的包管理工具之Go Vendor的使用
下一篇: Go语言中关于go get, go install, go build, go run指令
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值