sherecho的个人博客

弱小和无知不是生存的障碍,傲慢才是

emplace_pack和push_back

emplace_backpush_back 都是用于将元素添加到容器尾部的 C++ 函数,但它们有一些关键的区别,使得 emplace_back 在某些情况下比 push_back 更高效。

  1. 构造对象的方式:
    • push_back 接受一个已经构造好的对象,并将其拷贝(或移动)到容器中。
    • emplace_back 则允许你在容器内部就地构造对象,而不需要提前创建一个对象。它接受参数,并将这些参数传递给对象的构造函数。
  2. 性能优势:
    • 当使用 push_back 时,你需要先创建一个对象,然后将其拷贝(或移动)到容器中。这可能导致额外的构造和拷贝开销,特别是当操作涉及到复杂的对象。
    • emplace_back 可以直接在容器内部构造对象,避免了额外的拷贝或移动操作,因此在性能上可能更高效。
  3. 可变参数:
    • emplace_back 使用可变参数列表,允许传递给构造函数的参数。这使得它对于构造函数带有多个参数的情况更为灵活,而不需要显式创建一个临时对象。

在实际编程中,如果你只需要添加已经存在的对象到容器尾部,那么 push_back 是一个不错的选择。但如果你想要在容器中直接构造对象,并且构造函数带有多个参数,那么 emplace_back 可能更为合适和高效。

阅读全文 »

虚函数

什么是虚函数

虚函数是一种由virtual关键字修饰的一种类内函数,可分为虚函数和纯虚函数。

阅读全文 »

计算机体系结构基础

引言:按下ppt翻页会发生什么

键盘按下后键盘会产生一个信号发送给南桥芯片,芯片将键盘的编码存储在寄存器中并向处理器发送一个外部中断信号。

外部中断发送到cpu控制寄存器模块,并存储在一个控制寄存器中。没有被屏蔽的中断信号被附在一条译码后的指令上传到重排序缓存(Reoder buffer),当该指令成为ROB的第一条指令时,发生精确例外,取消后面的指令,修改控制寄存器,系统状态切到核心态。把例外发生的原因和当前PC保存在控制寄存器中,pc设置为例外处理函数入口,处理器跳转执行中断处理。

操作系统保护现场将当前状态压入寄存器,操作系统从cpu控制器中读中断原因,发现是按下键盘,将该原因传给南桥芯片同时清楚南桥中断位。同时操作系统查那个进程在阻塞等待这个按键,发现是ppt在阻塞态,将其唤醒,ppt运行态接收操作系统传过来的数据是按键,表示要翻页,应用程序进行ppt翻页。

常见性能优化方法

  • 加快经常性发生的事件(加速比,Amdahl定律)
  • 开发局部性:时间,空间。例如:cache,TLB,预取,转移猜测
  • 通过并行性提高性能
    • 指令级并行:时间并行(流水线),空间并行(多发射)
    • 数据级并行:多数据流的向量结构
    • 任务级并行:多核处理器,多线程处理器
阅读全文 »

Linux网络编程基础API-学习笔记

主机字节序和网络字节序

大端字节序:网络字节序

利用union公用体查看自己电脑的字节序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <stdio.h>
void byteorder()
{
union
{
short value;
char union_bytes[ sizeof( short ) ];
} test;
test.value = 0x0102;
if ( ( test.union_bytes[ 0 ] == 1 ) && ( test.union_bytes[ 1 ] == 2 ) )
{
printf( "big endian\n" );
}
else if ( ( test.union_bytes[ 0 ] == 2 ) && ( test.union_bytes[ 1 ] == 1 ) )
{
printf( "little endian\n" );
}
else
{
printf( "unknown...\n" );
}
}

现代的PC机大多采用小端序:主机字节序

socket

linux:所有的东西都是文件。socket:可读,可写可控制,可关闭的文件描述符。

创建socket:

阅读全文 »

image-20230208163700173
image-20230208163830112
image-20230208164045725

结构化剪枝:

image-20230208213740958
阅读全文 »

GAN:隐式的生成模型

生成对抗原理

生成器与判别器损失总体优化目标:

\(\min \max V(D, G)=E_{x \sim p_{\text {data }}(x)}[\log \mathrm{D}(\mathrm{x})]+E_{z \sim p_z(z)}[\log (1-\mathrm{D}(\mathrm{G}(\mathrm{z})))]\)

\(E_{x \sim p_{\text {data }}(x)}[\log \mathrm{D}(\mathrm{x})]\) :真实样本输入到判别器的输出 --> 期望这一项越大越好

\(E_{z \sim p_z(z)}[\log (1-\mathrm{D}(\mathrm{G}(\mathrm{z})))]\) :噪声样本输入生成器,再输入判别器以后的样本,应该越小越好,因为用\(1-\mathrm{D}(\mathrm{G}(\mathrm{z}))\) 所以是越大越好。

D的学习目标:D(X)大,D(G(Z))小:

\(\max _\theta \mathbb{E}_{x \sim p_{\text {data }}}[\log D(x)]+\mathbb{E}_{z \sim p_z}[\log (1-D(G(z)))]\)

G的学习目标: D(G(Z))大 \(\min _\theta\mathbb{E}_{z \sim p_z}[\log (1-D(G(z)))]\)

阅读全文 »

什么是目标检测

image-20230108115751362

识别图片中有哪些物体并找到物体存在的位置

多任务:位置+类别

主要挑战:

  • 目标种类与数量繁多问题
  • 目标尺度不均问题
  • 遮挡、噪声外部环境干扰

NMS

常用数据集

阅读全文 »

图像分割分类

image-20230107225200305

语义分割:每一个像素必须且只能属于一类,预测结果为掩膜

实例分割:只预测前景目标的类别属性以及边框,个体ID,每一个像素可以属于多个ID

image-20230107225809249

比如上面所示因为有遮挡所以每一个像素可以属于多个ID

全景分割(panoptic segmentation)每个像素点分配一个语义类别和一个唯一的实例ID

  • 如果所有的类别都是stuff那么全景分割除了度 量,与语义分割相同。

  • 全景分割中不允许重叠,但实例分割可以;实例分割需要每个分割的置信概率,但全景分割不需要。

经典数据集

pascal VOC

阅读全文 »

卷积拆分

image-20230107115007216

应用

image-20230107115131230

深度可分离卷积

先执行空间卷积,再执行\(1\times 1\)卷积

image-20230107115347713
image-20230107115956429

image-20230107120019334

image-20230107120237867
阅读全文 »

写在前面:本文是阅读有三AI博主课程的笔记

AlexNet

  • 更深的网络结构
  • 使用卷积层+卷积层+池化层提取图像特征
  • dropout
  • 数据增强
  • RELU替换sigmoid
  • 多GPU训练

训练技巧

image-20230106104745510
  • 多GPU训练:(与只是用一个GPU想不,top-1和top-5的错误率减少1.7%和1.2%)

    使得神经元并行,并使通信限制在了某些网络层。从上图中可以看出,c1,c2层是独立的,c4,c5是独立的,c3层两个GPU有通信

image-20230106105552881
  • Dropout

    随机裁剪一部分神经元,每次裁剪后生成的网络结构都不一样,通过组合多个模型的方式能有效减少过拟合

image-20230106105847910
  • 数据增强

    image-20230106110213739
阅读全文 »
0%