C语言--基础总结

                              C语言--基础总结

先学习C语言的原因
  1)   OC基于C
  2)   OC跟C的思想和语法很多地方不太一样,而且OC能和C混用
  3)   C是所有编程语言中的经典,很多高级语言都是从C语言中衍生出来的,比如C++、C#、Objective-C等
 特点
  1)   丰富的运算符
  2)   丰富的数据类型
  3)   可以直接操作硬件
  4)   高效的目标代码
  5)   可移植性好
 主要用途
  1)   编写系统软件、图形处理、单片机程序、嵌入式系统开发
  2)   编写游戏外挂
  3)   编写android程序
  4)   编写iOS程序

什么是关键字
1> 关键字就是C语言提供的有特殊含义的符号,也叫做“保留字”
2> C语言一共提供了32个关键字,这些关键字都被C语言赋予了特殊含义
      auto double int struct break else long switch
      case enum register typedef char extern return union
      const float short unsigned continue for signed void
      default goto sizeof volatile do if while static
大致浏览一遍即可,不用去百度每个关键字的作用,这些关键字以后会经常用到的,到时候你想不记住都难
2. 关键字的特征
1> 全部都是小写
2> 在开发工具或者智能文本编辑工具中会显示特殊颜色。默认情况下,C语言中的所有关键字在Xcode中都会显示紫褐色
3. main函数中哪些是关键字
int、return
标识符
1. 什么是标识符
标识符就是在程序中自定义的一些符号和名称。要跟关键字区分开来:关键字是C语言默认提供的符号,标识符是程序员自定义的
2. 标识符的作用
1) 标识符,从字面上理解就是用来标识某些东西的符号,标识的目的就是为了将这些东西区分开来
2) 其实,标识符的作用就跟人类的名字差不多,为了区分每个人,就在每个人出生的时候起了个名字
3) C语言是由函数构成的,一个C程序中可能会有多个函数,为了区分这些函数,就给每一个函数都起了个名称。函数的名称就是标识符的一种。除了函数,以后还会学到“变量”这个概念,变量的名称也是标识符
3. 命名
1> 命名规则(一定要遵守)
* 只能由26个英文字母的大小写、10个阿拉伯数字0~9、下划线_组成
* 严格区分大小写,比如test和Test是2个不同的标识符
* 不能以数字开头
* 不可以使用关键字作为标识符
2> 命名规范(最好遵守)

* 尽量起个有意义的名称,比如一个完整的英文单词,别人一看这个名称就能才能这个标识符的作用,
        如果不懂英文,你也可以用拼音,尽量不要起像abcde、sfsdfsdf等这         类看起来没有意义的名称
* 如果标识符中含有多个单词,可以使用驼峰标识(除开第一个单词,后面每个单词的首字母都是大写):firstName、myFirstName,
       或者使用下划线_来连接:first_name、my_first_name

注释
1. 什么是注释
    1)   注释是在所有计算机语言中都非常重要的一个概念,从字面上看,就是注解、解释的意思
    2)  注释可以用来解释某一段程序或者某一行代码是什么意思,方便程序员之间的交流。
    3)  注释可以是任何文字,也就是说可以写中文
    4)   在开发工具中注释一般是豆沙绿色

2. 注释的作用
    1>被注释的代码不会参与编译
   * 注释是写给人看的,不是给计算机看的。计算机怎么可能看得我们写的中文嘛。因此,当编译程序的时候,并不会将注释编译到.o目标文件中
   * 从.o文件的大小可以间接看出注释后的代码并没有被编译
    2> 检查代码的作用
    3> 排除错误

3. 单行注释
    1)  单行注释以两个正斜杠开头,也就是以//开头,只能注释一行,从//开始到这行的结尾都是注释的内容
    2)  任何地方都可以写注释:函数外面、里面,每一条语句后面

4. 多行注释
     多行注释以/*开头,以*/结尾,/*和*/中间的内容都是注释

5. 注释的嵌套现象
    1)  单行注释可以嵌套单行注释、多行注释
       // 哇哈哈 // 呵呵呵
      // /* fsdfsdf */  // sdfsdfsd
    2) 多行注释可以嵌套单行注释
       /*   
          // 作者:MJ 
         // 描述:第一个C语言程序
         作用:这是一个主函数,C程序的入口点  
       */
   3) 多行注释不能嵌套多行注释
       /* 哈哈哈
      /*嘻嘻嘻*/
      呵呵呵 */
   4) 下面的写法是错误的
    // /*  
       哈哈哈
    */
数据类型

常量
 1.什么是常量
     常量,表示一些固定的数据
 2.常量的分类
  1) 整型常量(int)
       包括了所有的整数,比如6、27、109、256、-10、0、-289等
  2) 浮点型常量(float\double)
      * 浮点型常量分为double和float两种数据类型
      * double:双精度浮点型,其实就是小数。比如5.43、-2.3、0.0等(注意,0.0也算是个小数)
      * float:单精度浮点型,也是小数,比double的精确程度低,也就是说所能表示的小数位数比较少。
      *  为了跟double区分开来,float 型数据都是以f结尾的,比如5.43f、-2.3f、0.0f。需要注意的是,绝对不能有10f这样格式的, 编译器会直接报错,只有小数才允许加上f。
  3) 字符常量(char)
         将一个数字(0~9)、英文字母(a~z、A~Z)或者 其他符号(+、-、!、?等)用单引号括起来,这样构成的就是字符常量。比如'6'、'a'、'F'、'+'、'$'等。
         注意:单引号只能括住1个字符,而且不能是中文字符,下面的写法是错误的:'abc'、'123456'、'男'
  4) 字符串常量
        将一个或者多个字符用双引号("")括起来,这样构成的就是字符串常量。比如"6"、"男"、"哇哈哈"、"abcd"、"my_car4",
       其实printf("Hello World");语句中的"Hello World"就是字符串常量。
  
变量
 1. 什么是变量
     当一个数据的值需要经常改变或者不确定时,就应该用变量来表示。比如游戏积分。
 2.  定义变量
   1) 目的
      *  任何变量在使用之前,必须先进行定义。
      *  定义变量的目的是:在内存中分配一块存储空间给变量,方便以后存储数据。
      *  如果定义了多个变量,就会为这多个变量分别分配不同的存储空间。
    2) 格式
       变量类型  变量名;   比如int num;
       变量名属于标识符
       变量类型:不同类型的变量占用不同大小的存储空间。内存极其有限,分配适当的存储空间 
       约束变量所存放的数据类型(方便运算)
  3) 实例
  int main()
  {
   int i;
   char c;
   int a, b;
   return 0;    
  }
 3. 变量的使用
  1) 赋值
       往变量里面存点东西,就是赋值。赋值语句后带个分号; 例如:  i = 10;
       注意:这里的等号=,并不是数学中的“相等”,而是C语言中的赋值运算符,作用是将右边的常量10赋值给左边的变量i
       第一次赋值,可以称为“初始化”
       初始化的两种形式
           *  先定义,后初始化:int a;  a = 10;
           *  定义的同时进行初始化:int a = 10;
  2)修改
      可以修改变量的值,多次赋值。每次赋值都会覆盖原来的值
    i = 10;
    i = 20; // 变量i最后的值是20
      使用printf输出一个\多个变量的值
 int a = 10, c = 11;
    printf("a=%d, c=%d", a, c);
    double\float\char的输出,格式符的一些小技巧
    double height = 1.55;
    char blood = 'A';
    printf("height=%.2f, 血型是%c",  height,  blood);
  3)变量之间值的传递
   // 可以将一个变量的值赋值给另一个变量
    int a = 10;
    int b = a;
   // 连续赋值
    a = b = 10; 
 4.常见错误
  1) 变量名相同  int a = 10;  int a = 12;
  2)  变量的作用域不对
        变量的创建和释放过程
       代码块作用域 {  int a = 10; }
变量的存储
  1.所占用字节数跟类型有关,也跟编译器环境有关
   2.变量实例
       int b = 10;
       int a = 20;
  1) 内存由大到小寻址,优先分配内存地址较大的字节给变量。b的内存地址比a大
  2) 每个变量都有地址:第一个字节的地址就是变量的地址
 3. 查看内存地址:
  int a;
  printf("a的地址是:%p\n", &a);
 4.注意
  在变量未经初始化之前,不要尝试使用变量的值
  int a;
  printf("a的值是:%d\n", a);  // 这种写法是不建议的<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);"> </span>
scanf函数
 1. 简介
     这也是在stdio.h中声明的一个函数,因此使用前必须加入#include <stdio.h>。调用scanf函数时,需要传入变量的地址作为参数,
     scanf函数会等待标准输入设备(比如键盘)输入数据,并且将输入的数据赋值给地址对应的变量
 2.简单用法
  int age;
  scanf("%d", &age);
  1) scanf函数时,会等待用户的键盘输入,并不会往后执行代码。scanf的第1个参数是"%d",说明要求用户以10进制的形式输入一个整数。这里要注意,scanf的第2个参数传         递的不是age变量,而是age变量的地址&age,&是C语言中的一个地址运算符,可以用来获取变量的地址
  2) 输入完毕后,敲一下回车键,目的是告诉scanf函数我们已经输入完毕了,scanf函数会将输入的值赋值给age变量
3.  其他用法
  1) 用scanf函数接收3个数值,每个数值之间用中划线-隔开
     scanf("%d-%d-%d", &a, &b, &c);
     3个%d之间是用中划线-隔开的,因此我们在每输入一个整数后都必须加个中划线-,比如这样输入10-14-13 ,不然在给变量赋值的时候会出问题
     注意:数值之间的分隔符是任意的,不一定要用中划线-,可以是逗号、空格、星号*、井号#等等,甚至是英文字母
    // 逗号, 
   scanf("%d,%d,%d", &a, &b, &c); // 输入格式:10,14,20  
   // 井号# 
   scanf("%d#%d#%d", &a, &b, &c); // 输入格式:10#14#20  
   // 字母x 
   scanf("%dx%dx%d", &a, &b, &c); // 输入格式:10x14x20
  2)用scanf函数接收3个数值,每个数值之间用空格隔开
 scanf("%d %d %d", &a, &b, &c);
    3个%d之间是用空格隔开的,我们在每输入一个整数后必须输入一个分隔符,分隔符可以是空格、tab、回车
 4. 注意
    scanf的第一个参数中不要包含\n,比如scanf(“%d\n”, &a);  这将导致scanf函数无法结束
  5.占位符
      %a,%A 读入一个浮点值(仅C99有效)   
      %c 读入一个字符   
      %d 读入十进制整数   
      %i 读入十进制,八进制,十六进制整数   
      %o 读入八进制整数   
      %x,%X 读入十六进制整数   
      %s 读入一个字符串,遇空格、制表符或换行符结束。   
      %f,%F,%e,%E,%g,%G 用来输入实数,可以用小数形式或指数形式输入。   
      %p 读入一个指针   
      %u 读入一个无符号十进制整数   
      %n 至此已读入值的等价字符数   
      %[] 扫描字符集合   
      %% 读%符号

算术运算
C语言一共有34种运算符,包括了常见的加减乘除运算
 1. 加法运算+
     除开能做加法运算,还能表示正号:+5、+90
 2. 减法运算-
      除开能做减法运算,还能表示符号:-10、-29
 3. 乘法运算*
     注意符号,不是x,而是*
 4. 除法运算/
      注意符号,不是÷,也不是\,而是/
      整数除于整数,还是整数。1/2的值是0,这个并不是二分之一
 5. 取余运算%
     什么是取余:两个整数相除之后的余数
     %两侧只能是整数
     正负性取决于%左侧的数值
 6. 注意点
    1>自动类型转换
        int a = 10.6;
        int b = 10.5 + 1.7;
       自动将大类型转换为了小类型,会丢失精度
   2> 自动类型提升
       int b = 10.5 + 10;  //  将右边的10提升为了double类型
       double b = 1.0 / 2;  // 解决除法的精度问题
  3>强制类型转换
       double a = (double)1 / 2;
       double b = (double)(1 / 2);
  4>运算顺序
       表达式
       结合性(结合方向):2+3+4
      优先级:5+4*8-3
赋值运算
 1. 简单赋值
     int a = 10 + 5;的运算过程
    a = b = 10;的运算过程
     等号左边不能是常量,比如10 = 11;
 2. 复合赋值
     复加减乘除余:a += 4 + 5;
自增自减
 1. 简单使用
     ++  自增运算符。如a++,++a,都等价于a = a+1
     自减运算符。如a--,--a,都等价于a = a-1
    注意: 5++是错误的
 2. ++a和a++的区别

      ++a;  // 先加1,在使用

     a++;  // 先使用, 再加1
         int a = 10;
         int b = a++;  int b = ++a;  //b=10,a=11;b=11,a=10
sizeof
 1.  作用
      用来计算一个变量或者一个常量、一种数据类型所占的内存字节数。
 2. 基本形式
     sizeof ( 变量\常量 )
     sizeof  变量\常量
     sizeof ( 数据类型 )
    不能是sizeof 数据类型
关系运算(比较运算)
 1. 条件判断
      默认情况下,我们在程序中写的每一句正确代码都会被执行。但很多时候,我们想在某个条件成立的情况下才执行某一段代码
      这种情况的话可以使用条件语句来完成,但是我们暂时不学习条件语句,先来看一些更基础的知识:如何判断一个条件成不成立。
 2. 真假
     在C语言中,条件成立称为“真”,条件不成立称为“假”,因此,判断条件是否成立,就是判断条件的“真假”。
     怎么判断真假呢?C语言规定,任何数值都有真假性,任何非0值都为“真”,只有0才为“假”。也就是说,108、-18、4.5、-10.5等都是“真”,0则是“假”。
 3. 关系比较
     开发中经常要比较,比如斗地主游戏中牌的大小。利用关系运算符就可以比较两个值的大小。
     关系运算符的运算结果只有2种:如果条件成立,结果就为1,也就是“真”;如果条件不成立,结果就为0,也就是“假”。
 4. 使用注意
     关系运算符中==、!=的优先级相等,<、<=、>、>=的优先级相等,且前者的优先级低于后者:2==3>1
     关系运算符的结合方向为“从左往右”: 4>3>2
     关系运算符的优先级小于算术运算符:3+4>8-2
逻辑运算
 有时候,我们需要在多个条件同时成立的时候才能执行某段代码,比如:用户只有同时输入了QQ和密码,才能执行登录代码,如果只输入了QQ或者只输入了密码,就不能执行登录代码。这种情况下,我们就要借助于C语言提供的逻辑运算符。
 逻辑运算的结果只有2个:“真”为1,“假”为0
 1. && 逻辑与
    1> 使用格式
      “条件A && 条件B”
  2>  运算结果
       只有当条件A和条件B都成立时,结果才为1,也就是“真”;其余情况的结果都为0,也就是“假”。因此,条件A或条件B只要有一个不成立,结果都为0,也就是“假”
  3> 运算过程
      总是先判断条件A是否成立
      如果条件A成立,接着再判断条件B是否成立:如果条件B成立,“条件A && 条件B”的结果就为1,即“真”,如果条件B不成立,结果就为0,即“假”
      如果条件A不成立,就不会再去判断条件B是否成立:因为条件A已经不成立了,不管条件B如何,“条件A && 条件B”的结果肯定是0,也就是“假”
  4> 举例
      逻辑与的结合方向是“自左至右”。比如表达式 (a>3) && (a<5)
       若a的值是4:先判断a>3,成立;再判断a<5,也成立。因此结果为1
       若a的值是2:先判断a>3,不成立,停止判断。因此结果为0
       因此,如果a的值在(3, 5)这个范围内,结果就为1;否则,结果就为0
   注意
       若想判断a的值是否在(3, 5)范围内,千万不能写成3<a<5,因为关系运算符的结合方向为“从左往右”。 比如a为2,它会先算3<a,也就是3<2,条件不成立,结果为0。
       再与5比较,即0<5,条件成立,结果为1。因此 3<a<5的结果为1,条件成立,也就是说当a的值为2时,a的值是在(3, 5)范围内的。
      这明显是不对的。正确的判断方法是:(a>3) && (a<5)
     C语言规定:任何非0值都为“真”,只有0才为“假”。因此逻辑与也适用于数值。比如 5 && 4的结果是1,为“真”;-6 && 0的结果是0,为“假”

 2. ||  逻辑或
  1>  使用格式
     “条件A || 条件B”
  2>  运算结果
      当条件A或条件B只要有一个成立时(也包括条件A和条件B都成立),结果就为1,也就是“真”;只有当条件A和条件B都不成立时,结果才为0,也就是“假”。
  3> 运算过程
     总是先判断条件A是否成立
     如果条件A成立,就不会再去判断条件B是否成立:因为条件A已经成立了,不管条件B如何,“条件A || 条件B”的结果肯定是1,也就是“真”
     如果条件A不成立,接着再判断条件B是否成立:如果条件B成立,“条件A || 条件B”的结果就为1,即“真”,如果条件B不成立,结果就为0,即“假”
  4>  举例
     逻辑或的结合方向是“自左至右”。比如表达式 (a<3) || (a>5)
     若a的值是4:先判断a<3,不成立;再判断a>5,也不成立。因此结果为0
     若a的值是2:先判断a<3,成立,停止判断。因此结果为1
     因此,如果a的值在(-∞, 3)或者(5, +∞)范围内,结果就为1;否则,结果就为0
  5> 注意
   C语言规定:任何非0值都为“真”,只有0才为“假”。因此逻辑或也适用于数值。比如 5 || 4的结果是1,为“真”;-6 || 0的结果是1,为“真”;0 || 0的结果是0,为“假”
 3. !  逻辑非
     使用格式 :  “! 条件A”
  2> 运算结果
      其实就是对条件A进行取反:若条件A成立,结果就为0,即“假”;若条件A不成立,结果就为1,即“真”。也就是说:真的变假,假的变真。
  3> 举例
     逻辑非的结合方向是“自右至左”。比如表达式 ! (a>5)
     若a的值是6:先判断a>5,成立,再取反之后的结果为0
     若a的值是2:先判断a>3,不成立,再取反之后的结果为1
     因此,如果a的值大于5,结果就为0;否则,结果就为1
  4> 注意
     可以多次连续使用逻辑非运算符:!(4>2)结果为0,是“假”,!!(4>2)结果为1,是“真”,!!!(4>2)结果为0,是“假”
     C语言规定:任何非0值都为“真”,只有0才为“假”。因此,对非0值进行逻辑非!运算的结果都是0,对0值进行逻辑非!运算的结果为1。!5、!6.7、!-9的结果都为0,!0的结果为1
 4 .优先级
    逻辑运算符的优先级顺序为: 小括号() > 负号 - > ! > 算术运算符 > 关系运算符 > && > ||
    表达式!(3>5) || (2<4) && (6<1) :先计算 !(3>5)、(2<4)、(6<1),结果为1,式子变为1 || 1 && 0,再计算1 && 0,式子变为1 || 0,最后的结果为1
    表达式3+2<5||6>3 等价于 ((3+2) < 5) || (6>3),结果为1
    表达式4>3 && !-5>2 等价于 (4>3) &&  ((!(-5)) > 2) ,结果为0
三目运算符
   类型 变量名 = 公式 ?数值1:数值2 (如果公式成立,则把数值1赋值给变量,否则,把数值2赋值给变量)
   获得a、b中的最大数 int max=a>b?a:b; // 如果a > b成立,则把a赋值给max,否则,把b赋值给max

流程控制
选择结构-if
 1. 简单使用
    if (表达式)  语句1;  //   if(count>50)  开班; 
   if(表达式)  语句1;  else 语句2;  //  if(count>50)  开班;  else 不开班;
   if(表达式)  {   }        // if(count>50)  {开班; 布置课室;}  else {  不上课 }
  if -else if-else
     if(a==0) else if (a>0)  else 
      特点:只有一个括号会被执行
  复合条件
   上课时间的取值范围(9~12 ||  14 ~17)
  陷阱
    if(a!=0)  { a不是0;} else {a是0;} // 自相矛盾
    if (a); {   }  // 无判断
选择结构-switch
 1. 简单使用
    switch(表达式) { case 数值1: break; … default: break;}
 举例
  int a = 10;
  switch (a) {
   case 0:
    printf("这是一个0");
    break;
   case 5:
    printf("这是一个5");
    break;
   case 10:
    printf("这是一个10");
    break;
   default:
    printf("什么也不是");
    break;
 }
   简述break的作用:  在case中定义变量
 2 .if和switch的对比
    很多情况可以互换
    if用得比较多,比较灵活,switch只能某个单值
循环结构-while
 1. 简单使用
    连续printf(“俯卧撑”)20次;
    while(表达式) { }
    continue:输出5次休息一下
    break的使用:某次的时候停止循环
 2. 特点
   只有条件成立才会执行循环体
 3. 陷阱
   while(条件);
循环结构-do while
 特点:一定会执行一次循环体
  while和do while循环对比
  int i=0;
  while(i<0){
   i++;
  }

  int i=0;
  do{
   i++;
  } while(i<0);
循环结构-for
 1. 简单实用
   运行过程  初始化语句等可以是多句(把printf放到for的括号中)
 2. for循环嵌套
   好友列表1
     好友1
     好友2
   好友列表2
     好友1
     好友2
   好友列表3
     好友1
     好友2
 3.陷阱
    1> 死循环  for(; ;);
    2> for循环体内部变量的作用域
    3> 作用域混淆
    for (int i = 0; i<5; i++)  int a = 10;
 4 .while循环和for循环的比较
    可以互换  for循环的变量可以及时回收
break和continue
 1.  break
   使用场合:switch\循环结构
  循环嵌套下的break  跳出所在的整个循环
 2.continue
  使用场合:循环结构
  循环嵌套下的continue 跳出本次循环
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿三先生

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

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

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

打赏作者

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

抵扣说明:

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

余额充值