【AI白身境】只会用Python?g++,CMake和Makefile了解一下

CMake 头文件路径设置问题 在使用 CMake 构建项目时,经常需要指定头文件的路径,以便编译器能够正确地找到所需的头文件。本文将探讨在 CMake 中设置默认头文件路径的方法,并提供相应的源代码示例。在这个命令中,我们可以指定一个或多个路径,用于搜索头文件。命令,我们可以在 CMake 中设置默认的头文件路径。命令来设置特定目标的头文件路径。这对于具有多个目标的项目非常有用,可以在不同的目标之间设置不同的头文件路径。参数中,我们确保这些路径仅适用于特定目标,而不影响其他目标。添加到默认的头文件路径中,CMake 将在项目的。 阅读详情

今天是新专栏《AI白身境》的第六篇,所谓白身,就是什么都不会,还没有进入角色。

对于大部分小白来说,因为python用的太爽,以致于或许都没有听说过CMake。python是脚本语言,而当前大量的AI算法都部署在移动端嵌入式平台,需要使用c/java语言,因此熟悉CMake和Makefile也是必备的基础。

作者 | 汤兴旺 言有三

编辑 | 汤兴旺 言有三

01

g++必备基础

在学习CMake和和Makefile之前我们先学下g++这个工具,大家或许会问为什么要学g++,不应该直接学CMake和Makefile吗。实际上如果你不掌握g++根本就不会写Makefile,因为它实际上就是对g++代码的整理,有了Makefile,执行程序会更加快速方便。另外CMake就是为了简化Makefile的编写,它可以自动生成Makefile。


1.1 安装g++

我们在安装g++之前可以看一下自己是否已经安装了g++,因为ubuntu安装后就默认安装了g++,下面命令可查看自己g++版本。

Tips:如果不想作死,就不要手贱去降级或者升级g++版本。

g++ --version

640?wx_fmt=png

因为我已经安装了g++,出现了上面安装的版本号。如果你出现了上面信息,就不需要再安装了,没有的话,用下面的命令即可完成安装。

sudo apt-get install g++

安装好后也可以通过g++ --version查看是否安装成功

1.2 编译流程

现在我们已经安装好了g++,接下来通过写一个简单的程序来看看整个的编译流程。


我们通过vim创建一个test.cpp文件,测试的代码如下:

#include <iostream>

using namespace std;

int main() 

{    

      cout << "Hello, world!" <<endl;   

      return 0; 

}

640?wx_fmt=png

测试代码完成后,我们来进行下编译,打开终端,在终端输入g++  文件名即可,在这个程序中就是下面命令:

g++  test.cpp

注意这里的文件名是包括路径的,要是不知道文件路径的话可以在敲完g++和空格之后直接把文件拖进去,系统会自动添加文件路径。

在终端完成上面的命令后,你发现并没有任何输出,但这时候你去主文件夹下(默认主文件夹)看下会发现有个a.out文件

640?wx_fmt=png

现在你再在终端输入下面命令就能看到结果。

./a.out

640?wx_fmt=png

接下来我来解释下这个.out文件,实际上这是个经过相应的链接产生的可执行文件。还有个.o文件,它是个中间文件,一般是通过编译的但还未链接。我们通过看看g++在执行编译工作的时候的流程,你就会有更好的理解。如下:

1.预处理,生成.i的文件

2.将预处理后的文件转换成汇编语言,生成.s文件

3.将汇编变为目标代码(机器代码),生成.o的文件

4.连接目标代码,生成可执行程序

对于这个流程,我们结合上面的例子,再详细介绍下,如下:

1.预处理阶段

首先在终端输入下面代码:

g++ -E test.cpp > test.i 

预处理后的文件在 linux下以.i为后缀名,这个过程是用来激活预处理,执行完命令后,你会发现主文件夹下多了一个test.i文件

640?wx_fmt=png

这一步(预处理)主要做了宏的替换,和注释的消除。

640?wx_fmt=png

上图是test.i文件的最后部分,可以看见宏的替换和注释的消除。

2.将预处理后的文件转换成汇编语言

在终端输入下面代码:

g++ -S test.cpp

这一步主要就是生成test.s文件,.s文件表示汇编文件,用编辑器打开就都是汇编指令。下图是test.s文件的一部分。

640?wx_fmt=png

3.将汇编语言变为目标代码(机器代码)

在终端输入下面代码:

g++ -c test.cpp 

这一步就是生成目标文件,用编辑器打开就都是二进制机器码。

640?wx_fmt=png

4.链接目标代码,生成可执行程序

在终端输入下面代码:

g++ test.o -o test

在这一步中生成的可执行程序名为test,如果执行命令 g++ test.o  这样默认生成a.out

640?wx_fmt=png

最后我们再看下这个过程中产生的所有文件,如下:

640?wx_fmt=png

这就是编译的整个过程,你掌握了吗,这个过程对于后面编写Makefile非常重要,一定要深刻理解。

02

Makefile必备基础

上面我们对g++和编译过程进行了介绍,现在我们继续学习如何编写Makefile。

2.1 Makefile介绍                        

Makefile描述了整个工程的编译、链接等规则,它定义了一系列规则来指定哪些文件需要编译以及如何编译、需要创建哪些库文件以及如何创建这些库文件、如何产生我们想要的可执行文件。

而且Makefile可以有效的减少大工程中需要编译和链接的文件,只编译和链接那些需要修改的文件,可以说使用Makefile,整个工程都可以完全自动化编译。

640?wx_fmt=jpeg

2.2 Makefile基本格式

target ... : prerequisites ...

target - 目标文件, 可以是 Object File, 也可以是可执行文件

prerequisites - 生成target所需要的文件或者目标

command - make需要执行的命令(任意的shell命令),Makefile中的命令必须以 [tab] 开头


2.3 Makefile语法

Makefile包含了五个重要的东西:显示规则、隐晦规则、变量定义、文件指示和注释。详细解释如下:

 1. 显示规则:

通常在写makefile时使用的都是显式规则,这需要指明target和prerequisite文件。一条规则可以包含多个target,这意味着其中每个target的prerequisite都是相同的。当其中的一个target被修改后,整个规则中的其他target文件都会被重新编译或执行。 

2. 隐晦规则:

make的自动推导功能所执行的规则

3. 变量的定义:

Makefile中定义的变量,一般是字符串

Makefile中引用其他Makefile;指定Makefile中有效部分;定义一个多行命令 

5. 注释:

Makefile只有行注释 "#", 如果要使用或者输出"#"字符, 需要进行转义, "\#

2.4 Makefile简单实例

尽管上面介绍了许多Makefile的知识点,但我相信一定你很晕,接下来我通过一个实例来说明如何编写Makefile。

2.4.1 准备程序文件

我们使用opencv对下面这只可爱的猫进行读取显示。

640?wx_fmt=jpeg

在这里我们用c++和opencv对图片进行读取和显示,程序保存在DisplayImage.cpp这个文件里,代码如下:

#include <stdio.h>

#include <opencv2/opencv.hpp>

using namespace cv;

int main(int argc, char** argv )

{

    if ( argc != 2 )

    {

       printf("usage: DisplayImage.out <Image_Path>\n");

        return -1;

    }

   Mat image;

    image = imread( argv[1], 1 );

    if ( !image.data )

    {

        printf("No image data \n");

        return -1;

    }

    namedWindow("Display Image", WINDOW_AUTOSIZE );

    imshow("Display Image", image);

    waitKey(0);

    return 0;

}

640?wx_fmt=png

2.4.2 Makefile编写

上面我们已经准备好了.cpp文件,现在我们来编写Makefile进而进行编译,程序如下:

640?wx_fmt=png

现在我来解释下应该如何编写这个Makefile,对于编写Makefile我建议从下往上写。步骤如下:

1.编写clean

这一步在Makefile中基本差不多,它的作用就是删除所有的.o文件和可执行文件。为什么这样做呢?我举个例子说明下,如果你有100个.cpp文件,经过编译后会得到一个可执行文件。在这个过程中我们会得到许多不必要的文件,例如100个.o文件,但这个文件又没有用,如果用rm的话那就太麻烦了,所以我们用了clean,它可以很轻松完成这个任务。另外请注意Makefile文件在执行时不会执行clean这个命令,需要我们调用才会执行,即make clean。clean代码如下:

640?wx_fmt=png

2.编写目标文件1:依赖文件1

目标文件就是你想得到的文件,依赖文件就是你目前所拥有的东西。在本实例中我们现在拥有DisplayImage.cpp,所以DisplayImage.cpp是依赖文件,我们想得到DisplayImage.o,所以它是目标文件。代码如下:

640?wx_fmt=png

3.编写目标文件2:依赖文件2

这一步的依赖文件2实际就是第二步的目标文件1,在第二步我们通过DisplayImage.cpp得到了DisplayImage.o,现在我们需要通过DisplayImage.o得到可执行文件DisplayImage。所以在这一步目标文件是DisplayImage,依赖文件是DisplayImage.o,代码如下:

640?wx_fmt=png

4.应用opencv库和头文件

640?wx_fmt=png

这一步就需要根据自己计算机来配置了,对于我们初学者来说挺麻烦的,可以自己尝试下。有问题可以联系我们。

编写完makefile后,我们在终端make下就行了。下面编译后的文件:

640?wx_fmt=png

最后在终端输入下面代码即可显示图片。

./DisplayImage 01.jpg

总体来说编写Makefile可以按照这个套路写,多写几次就会了。

03

CMake必备基础

说完Makefile,我们再说下CMake。CMake是一个跨平台的编译(Build)工具,可以用简单的语句来描述所有平台的编译过程,其是在make基础上发展而来的,早期的make需要程序员写Makefile文件,进行编译,而现在CMake能够通过对cmakelists.txt的编辑,轻松实现对复杂工程的组织。下面我带大家学习下CMake的基础知识。


3.1 安装CMake

首先我们看看如何在自己的linux系统(我的系统Ubuntu18.04)下安装CMake。方法如下:

sudo apt-get install cmake

输入上面命令后实际上就安装成功了,可以通过下面命令来检查:

cmake --version

如果你的界面如下图所示即说明安装成功。

640?wx_fmt=png

3.2 CMake编译流程

成功安装好CMake后我们再来说说如何在linux平台下使用CMake生成Makefile并编译的流程,如下:

1.编写CMake配置文件CMakeLists.txt,我们可以认为CMakeLists.txt就是CMake所处理的"代码"。

2.执行命令 cmake path生成Makefile,其中path是CMakeLists.txt所在的目录。

3.使用make命令进行编译。

3.3 使用CMake编译程序

我们通过一个关于opencv读取图片的程序,让大家更好的理解整个CMake的编译过程。

3.3.1 准备程序文件

这里程序准备可以按照第二部分makefile那里准备。最后文件目录结构如下:

├── build

├── CMakeLists.txt

├── DisplayImage.cpp

opencv读取图片的程序写完后,我们需要编写CMake处理的代码了,即CMakeLists.txt。

3.3.2 编写CMakeLists.txt

现在我们编写CMakeLists.txt文件,该文件实际上放在哪里都可以,只要编写的路径能够正确指向就好了,CMakeLists.txt文件内容如下所示:

cmake_minimum_required(VERSION 2.8)

project( DisplayImage )

find_package( OpenCV REQUIRED )

add_executable( DisplayImage DisplayImage.cpp )

target_link_libraries( DisplayImage ${OpenCV_LIBS} )

640?wx_fmt=png

看到这些代码是不是很闷逼,为了让大家明白CMakeLists.txt文件内容,接下来我说一下Cmake的一些常用命令,你就能很好的理解上面的代码了。

1)cmake_minimum_required命令

命令语法:cmake_minimum_required(VERSION major[.minor[.patch[.tweak]]][FATAL_ERROR])

命令简述:用于指定需要的CMake 的最低版本

使用范例:cmake_minimum_required(VERSION 2.8)

2)project 命令

命令语法:project(<projectname> [languageName1 languageName2 … ] )

命令简述:用于指定项目的名称,一般和项目的文件夹名称对应

使用范例:project(DisplayImage)

3)aux_source_directory命令

命令语法:aux_source_directory(<dir> <variable>)

命令简述:用于将 dir 目录下的所有源文件的名字保存在变量 variable 中

使用范例:aux_source_directory(src DIR_SRCS)

4)add_executable 命令

命令语法:add_executable(<name> [WIN32] [MACOSX_BUNDLE][EXCLUDE_FROM_ALL] source1 source2 … sourceN)

命令简述:用于指定从一组源文件 source1 source2 … sourceN 编译出一个可执行文件且命名为name

使用范例:add_executable( DisplayImage DisplayImage.cpp )

5)target_link_libraries命令

命令语法:target_link_libraries(<target> [item1 [item2 […]]][[debug|optimized|general] ] …)

命令简述:用于指定 target 需要的链接 item1 item2 …。这里 target 必须已经被创建,链接的 item 可以是已经存在的 target(依赖关系会自动添加)

使用范例:target_link_libraries( DisplayImage ${OpenCV_LIBS} )

6)add_subdirectory 命令

命令语法:add_subdirectory(source_dir [binary_dir] [EXCLUDE_FROM_ALL])

命令简述:用于添加一个需要进行构建的子目录

使用范例:add_subdirectory(Lib)

7)include_directories 命令

命令语法:include_directories([AFTER|BEFORE] [SYSTEM] dir1 dir2 …)

命令简述:用于设定目录,这些设定的目录将被编译器用来查找 include 文件

使用范例:include_directories(${PROJECT_SOURCE_DIR}/lib)

像这样的命令还有很多,如find_package()寻找使用第三方库等,这些都需要我们平时多加积累。给大家一个查询命令的方法,大家可以多去看cmake官网的help,链接如下:

https://cmake.org/cmake/help/v2.8.8/cmake.html#section_Commands

3.3 编译和运行程序

现在CMakeLists.txt文件已经编写好了,意味着我们的工作即将进入尾声。现在看看我们的文件结构目录,如下图:

640?wx_fmt=png

接下来我们就需要进行编译了。编译的过程相对于CMakeLists.txt文件的编写是很简单的,只有两步,如下

cmake

make

其中cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库。对于我们这个实例,编译如下:

首先我们在命令行输入cmake .(注意cmake和.之间有空格),表明Cmakelist.txt文件在当前目录下。

640?wx_fmt=png

接下来在命令行输入make

640?wx_fmt=png

这样我们就编译成功了,我们看下编译后的文件目录

640?wx_fmt=png

解释下这个build文件夹,由于cmake后会生成很多编译的中间文件以及makefile文件,所以一般建议新建一个新的目录,专门用来编译,这就是这里的build,打开build后,里面的文件如下:

640?wx_fmt=png

到这里,我们不禁要问怎么没有图片显示呢,别急,在build目录下的命令行输入下面命令即可显示图片,这就是生产的DisplayImage可执行文件。

./DisplayImage ../01.jpg

640?wx_fmt=png

到这里,关于CMake的一些基本操作就介绍的差不多了,其实对于CMake的学习我认为必须在实例中多加应用,才能更好的掌握,因为它的复杂命令太多了。

总结

CMake和Makefile的基础我们就介绍完了,对于这两个工具其实不是一时就能学会的,需要大量的实践积累才能游刃有余。

下期预告:下一期我们会讲AI领域必须掌握的数据爬虫基础,如果你有建议,欢迎留言,我们会及时采纳的。

转载文章请后台联系

侵权必究

更多请关注知乎专栏《有三AI学院》

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=png

往期白身境精选

想要成为变身”AI专家“,就戳戳手指关注我们吧

别忘了点“好看”支持作者噢  ??? 

CMake基础教程(8)添加头文件、动态库搜索路径,链接动态、静态库 这是写cmake时最常用的操作,本文末尾给出一个综合范例供工作时参考。 添加头文件搜索目录INCLUDE_DIRECTORIES 语法: include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...]) 它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用。 include_directories(../../../thirdparty/comm/include) AFTER和BEFO 阅读详情

相关推荐

CMake入门教程:使用target_include_directories指定头文件所在文件夹

由于我们在CMakeLists.txt中使用target_include_directories命令指定了头文件所在的文件夹,编译器将能够找到并包含这个头文件。在CMake中,使用target_include_directories命令可以指定项目中源代码文件所需的头文件所在的文件夹。通过上述步骤,我们使用target_include_directories命令成功包含了指定文件夹中的头文件,并能够在项目中的源代码文件中使用这些头文件。接下来,我们需要在源代码中使用这些头文件。如有任何疑问,请随时提问。

SVIPCODE的博客 961

cmake 指定头文件路径_CMake教程(一)

CMake官方文档: https://cmake.org/cmake/help/v3.17/guide/tutorial/index.html#adding-system-introspection-step-5CMake的优点 高效 、强大 、开发团队的首选 一、基础 1、按照官网教程准备计算平方根的代码,这里命名为calculatesqrt.cpp 2、编写相应的CMakeLists.txt文...

weixin_39559486的博客 5883

“Agent Harness”和“Harness Engineering”

摘要:2026年AI工程化领域,"Agent Harness"(AI代理运行控制系统)与"Harness Engineering"(马具工程方法论)常被混淆。前者是管理AI代理非推理事务的技术实体(工具调用、记忆管理、安全约束等7层架构),后者是设计优化该系统的工程学科。研究表明,优化的Harness设计可使同一模型性能提升10倍。两者关系如同"马具"与"制具工艺":Harness Engineering指导Agent Harn

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 848

autoconf 和automake生成Makefile文件

autoconf 和automake生成Makefile文件 日期:2006-09-22 作者:杨小华、苏春艳 来自:IBM DW中国 <!----> 本文介绍了在 linux 系统中,通过 Gnu autoconf 和 automake 生成 Makefile 的方法。主要探讨了生成 Makefile 的来龙去脉及其机理,接着详细介绍了配置 Configure.in 的方法及其规

燕青专栏 1438

colmap+openMVS稠密重建

简要记录一下colmap+openMVS稠密重建相关使用。

weixin_41631106的博客 2244

Navcat最新版的激活和安装教程(全网最靠谱,最快捷的方式)

现在最新版本navcat已经出到了16.3了,并且新版navcat也支持连接redis和图标等更多样化的功能,但是比较头疼的一件事就是,只能试用14天。那么接下来小编教大家如何用最简单的方式使用最新版navcat16.

weixin_50737119的博客 2万+

《Linux内核Makefile分析》之 auto.conf, auto.conf.cmd, autoconf.h【转】

转自:http://blog.sina.com.cn/s/blog_87c063060101l25y.html 转载:http://blog.youkuaiyun.com/lcw_202/article/details/6661364     在编译构建性目标时(如 make vmlinux),顶层 Makefile 的 $(dot-config) 变量值为 1 。 在顶层 Makefile 的...

weixin_33943836的博客 757

Qt QCustomPlot 图形库详解及使用

QCustomPlot 是一个开源的 Qt C++ 库,专门用于创建数据图表。易于集成到 Qt 项目中。支持多种图表类型,如折线图、散点图、条形图等。提供丰富的交互功能,如缩放、平移、选择和拖动。高度可定制,支持图形的各种样式设置。// 添加第一条曲线i < 101;++i) {// 设置曲线颜色// 添加第二条曲线i < 101;++i) {// 设置曲线颜色// 设置散点样式// 添加图例。

MusicScore的博客 766

cmake添加头文件路径的函数include_directories

cmake添加头文件路径的函数

2637

CKS-CN考试之路----02

其实我们根据题目也可以知道秘钥是叫clever-cactus。稍作等待后,确认pod的状态,如果是1/1基本就没问题了。这步不一定做.目的是确定秘钥的名字。

Q先生 658

【DRAM存储器六十八】DDR5介绍--DQS Interval Oscillator—动态时序校准利器

DDR5内存采用DQS间隔振荡器(DQSIntervalOscillator)技术应对高速数据传输中的时序漂移问题。该技术通过测量DQS信号在可编程时间窗口内的振荡次数(16位计数值),动态监测温度/电压变化导致的DQS-DQ延迟偏移。控制器通过MPC命令启停振荡器,读取MR46/MR47寄存器获取计数值,并与基准值对比来调整DQS相位,确保数据采样窗口始终处于最佳位置。该机制使DDR5在8400MT/s高速率下仍能保持数据可靠性,有效补偿±0.48tCK的时序偏移。

highman110的博客 157

cmake 指定头文件路径_CMake 小计

CMake 小计CMake 是一个高效的 C/C++ Makefile 生成工具,具有很好的跨平台性。利用它可以让代码在各个平台上顺利的编译。现在最愿意看到的编译流程就是:cd build cmake .. make这里可能不是详尽的解释,但是展示了我本人在编写中常用的命令。 利用 CMake 的契机主要是想要摆脱 XCode 以及使用 CLion。当然,也是为自己的一些小项目做管理。(主要是不想...

weixin_39623271的博客 4949

【原理图PCB专题】案例:双排0.5mm间距座子转单排0.5mm间距座子Layout方案分析

本文提供一种分析思路,并通过实际案例来进行Layout方案分析的讲解。

一点硬件 457

【AI白身境】只会用Python?g++,CMake和Makefile了解一下​​​​​​​

文章首发于微信公众号《有三AI》 【AI白身境】只会用Python?g++,CMake和Makefile了解一下 今天是新专栏《AI白身境》的第六篇,所谓白身,就是什么都不会,还没有进入角色。 对于大部分小白来说,因为python用的太爽,以致于或许都没有听说过CMake。python是脚本语言,而当前大量的AI算法都部署在移动端嵌入式平台,需要使用c/java语言,因此熟悉CMake和Ma...

hacker_long的专栏 687

STM32开发 -- GPIO详解

之前有简单讲过GPIO工作模式和寄存器,还是有点没搞明白。这次需要全方位的看一下了。 一、数据手册 1、STM32F105RC引脚说明 可知:STM32F105RC 一共有4组IO口 一共16X3+3=51个IO GPIOA0~A15 GPIOB0~B15 GPIOC0~C15 GPIOD0~D2 2、程序定义 GPIO端口号 STM32F1...

不积跬步,无以至千里 5万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

cmake 指定头文件路径_【AI白身境】只会用Python?g++,CMake和Makefile了解一下

今天是新专栏《AI白身境》的第六篇,所谓白身,就是什么都不会,还没有进入角色。对于大部分小白来说,因为python用的太爽,以致于或许都没有听说过CMake。python是脚本语言,而当前大量的AI算法都部署在移动端嵌入式平台,需要使用c/java语言,因此熟悉CMake和Makefile也是必备的基础。作者 | 汤兴旺 言有三编辑 | 汤兴旺 言有三01g++必备基础在学习CMake和...

weixin_39917211的博客 331

深度学习工具包 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")

【完结】听完这12次分享,你应该完成了AI小白的蜕变

文章首发于微信公众号《有三AI》 【完结】听完这12次分享,你应该完成了AI小白的蜕变 专栏《AI白身境》正式完结了,在这一个专题中,我们给大家从Linux的基本知识,讲到了深度学习中必备的数学基础,从基本工具VIM和编译命令,讲到了常用的库OpenCV,从AI在工业界的各个研究方向,应用方向,讲到了AI领域的代表性人物,虽然知识本身的难度不高,但是覆盖范围非常广泛,这一次我们来重新回顾一下。...

hacker_long的专栏 676

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

言有三文章 - AI系列完整阅读

言有三文章 - AI系列完整阅读 第一期:【AI白身境】深度学习从弃用windows开始 第二期:【AI白身境】Linux干活三板斧,shell、vim和git 第三期:【AI白身境】学AI必备的python基础 第四期:【AI白身境】深度学习必备图像基础 第五期:【AI白身境】搞计算机视觉必备的OpenCV入门基础 第六期:【AI白身境】只会用Python?g++,CMake和...

喜欢打酱油的老鸟 1155

【C/C++编译】CMake定义头文件路径、链接库路径及链接选项:PRIVATE,INTERFACE,PUBLIC

可以使用命令来指定自定义的头文件路径。该命令会将指定的路径添加到编译器的头文件搜索路径中。你可以多次调用 include_directories 命令,以添加多个头文件路径。可以使用命令来指定自定义的链接库路径。该命令会将指定的路径添加到链接器的库搜索路径中。你可以多次调用 link_directories 命令,以添加多个链接库路径。需要注意的是,尽量避免在 CMake 中使用 include_directories 和 link_directories 命令来处理第三方库的头文件和链接库路径。

All_In_gzx_cc的博客 1万+

【CMake 常见疑难问题 】CMake中头文件路径设置的常见问题与解决策略

在CMake中,设置头文件路径(Include Path)是确保编译器能正确定位到你的项目中所有引用的头文件的关键步骤。不正确的路径设置会导致编译错误,影响开发效率,甚至可能导致项目失败。在项目管理中,这不仅是一项技术任务,还反映了开发者对项目细节的关注和对项目结构的理解。

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 4120

cmake的使用

对cmake的命令以及使用方式做总结,并举例简单的测试程序说明。

weixin_45374174的博客 2557

cmake---构建必备配置

动态库--target_link_libraries()链接库到目标对象;下载--编译--安装三方库之后,头文件可以直接使用;静态库--link_libraries();1,库需要find_packages()

m0_60274660的博客 346

cmake(11):将可执行和库文件分别输出到指定目录

1. 说明 当一个工程编译后包含多个可执行和库文件,将这些文件分别放置在对应的目录里面会使得工程看起来更有序…(当然,这些都是我编的,毕竟要给自己找个理由) 这篇笔记用于记录如何使用cmake在编译后将库文件和可执行文件生成在指定目录。 2. 示例 仍然以之前的代码为例。 在主CMakeLists.txt文件中设置目录路径 # 设置静态库文件目录 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) # 动态库文件目录 set(CMAKE

翔底的博客 1万+

CMake学习-添加头文件路径,库路径,库

CMake中,添加头文件路径,对应的函数叫include_directories。然后在参数中,把所有需要添加的路径,加进去就可以了。添加库路径,对应的函数叫LINK_DIRECTORIES,同样,在参数中,把所有的路径加进去就可以了。CMake中的函数调用,是不区分大小写的,大小写可以混合使用。添加库,对应的函数叫LINK_LIBRARIES,把所有的库加进去即可。这里有一个注意事项,这个不需要我

snail_hunan的专栏 7万+

CMake:搜索文件和指定头文件目录(三)

如果一个项目中的源文件很多,在编写CMakeLists.txt文件的时候不可能将项目目录的各个文件一一罗列出来,这样麻烦也不现实。所以在CMake中为我们提供了搜索文件的命令,可以使用。在CMake中使用aux_source_directory命令可以查找某个文件夹下的所有源文件,命令格式如下。当头文件和源代码不在一个文件夹下,需要在源代码中引入头文件具体的位置或者指定头文件的路径。刚才的命令是直接搜索某个目录下的所有源代码文件。而file命令可以搜索目录下指定类型的文件。

weixin_43808717的博客 1356

cmake--指定头文件和源文件路径

file需要指定文件后缀GLOB:只搜索当前目录GLOB_RECURSE:搜索当前目录和其子目录(递归搜索)

m0_60274660的博客 1234
上一篇: 【AI白身境】学AI必备的python基础
下一篇: 【AI白身境】学深度学习你不得不知的爬虫基础
言有三
言有三 领域专家: 人工智能技术领域 领域专家: 人工智能技术领域
博客等级 码龄15年 3635粉丝 976原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

言有三

三人行必有AI

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

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

打赏作者

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

抵扣说明:

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

余额充值