当前位置: 首页 > news >正文

25- 卷积神经网络(CNN)原理 (TensorFlow系列) (深度学习)

知识要点

  • 卷积神经网络的几个主要结构:

    • 卷积层(Convolutions):   {\color{Red} (\frac{N + 2P - F}{S} + 1)}

      • Valid :不填充,也就是最终大小为卷积后的大小.

      • Same:输出大小与原图大小一致,那么N ​变成了​N+2P.  padding-零填充.

    • 池化层(Subsampling),  主要对卷积层学习到的特征图进行亚采样处理:

      • 最大池化Max Pooling, 取窗口内的最大值作为输出

      • 平均池化Avg Pooling, 取窗口内的所有值的均值作为输出

    • 全连接层(Full connection)

      • 卷积层+激活层+池化层可以看成是CNN的特征学习/特征提取层,而学习到的特征(Feature Map)最终应用于模型任务,需要先对所有 Feature Map 进行扁平化.

    • 激活函数

      • softmax, relu, selu, sigmoid

  • filters , 卷积核, 必须是4维的tensor(卷积核的高度和宽度, 输入图片的通道数, 卷积核的个数)
  • strides, 步长, 卷积核在图片的各个维度的移动步长, (1, 1,  1)
  • padding, 0填充, 'valid'和'same', valid 表示不填充, same表示输入图片和输出图片的大小保持一致, (会自动计算)
  • 显示卷积过程中的图像:
# 边缘检测
input_img = tf.constant(cat_gray.reshape(1, 456, 730, 1), dtype = tf.float32)
filters = tf.constant(np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]]).reshape(3, 3, 1, 1), dtype = tf.float32)
strides = [1, 1, 1, 1]
conv2d = tf.nn.conv2d(input =  input_img, filters= filters, strides= strides, padding= 'SAME')
plt.figure(figsize= (10, 8))
plt.imshow(conv2d.numpy().reshape(456, 730), cmap = 'gray')


一 卷积神经网络(CNN)原理

1.1 卷积神经网络的组成

1.1.1 简介

  • 卷积神经网络由一个或多个卷积层、池化层以及全连接层等组成。与其他深度学习结构相比,卷积神经网络在图像等方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他浅层或深度神经网络,卷积神经网络需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。

我们来看一下卷积网络的整体结构什么样子。

其中包含了几个主要结构

  • 卷积层(Convolutions)

  • 池化层(Subsampling)

  • 全连接层(Full connection)

  • 激活函数

1.1.2 卷积层

  • 目的: 卷积运算的目的是提取输入的不同特征,某些卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网路能从低级特征中迭代提取更复杂的特征。

  • 参数

    • size: 卷积核/过滤器大小,选择有1 *1, 3* 3, 5 * 5

    • padding零填充,ValidSame

    • stride: 步长,通常默认为1

  • 计算公式

    

1.1.3 卷积运算过程

对于之前介绍的卷积运算过程,我们用一张动图来表示更好理解些。一下计算中,假设图片长宽相等,设为N,  一个步长, 3 X 3 卷积核运算。

假设是一张5 X 5 的单通道图片,通过使用3 X 3 大小的卷积核运算得到一个 3 X 3大小的运算结果(图片像素数值仅供参考)

我们会发现进行卷积之后的图片变小了,假设N为图片大小,F为卷积核大小

相当于: ​N - F + 1 = 5 - 3 + 1 = 3

如果我们换一个卷积核大小或者加入很多层卷积之后,图像可能最后就变成了1 X 1 大小,这不是我们希望看到的结果。并且对于原始图片当中的边缘像素来说,只计算了一遍,二对于中间的像素会有很多次过滤器与之计算,这样导致对边缘信息的丢失

缺点:

  • 图像变小

  • 边缘信息丢失

1.1.4 padding-零填充

零填充:在图片像素的最外层加上若干层0值,若一层,记做p =1。

  • 为什么增加的是0?

因为0在权重乘积和运算中对最终结果不造成影响,也就避免了图片增加了额外的干扰信息

这张图中,还是移动一个像素,并且外面增加了一层0。那么最终计算结果我们可以这样用公式来计算:5 + 2 * p - 3 + 1 = 5,  P为1,那么最终特征结果为5。实际上我们可以填充更多的像素,假设为2层,则 5 + 2 * 2 - 3 + 1 = 7​,这样得到的观察特征大小比之前图片大小还大。所以我们对于零填充会有一些选择,该填充多少?

 1.1.5 Valid and Same卷积

有两种形式,所以为了避免上述情况,大家选择都是Same这种填充卷积计算方式

  • Valid :不填充,也就是最终大小为: (N - F + 1) * (N - F + 1)

  • Same:输出大小与原图大小一致,那么N ​变成了​N+2P:  (N + 2P - F + 1) * (N + 2P - F + 1)

那也就意味着,之前大小与之后的大小一样,得出下面的等式

(N + 2P - F + 1) = N

P = \frac{F -1}{2}

所以当知道了卷积核的大小之后,就可以得出要填充多少层像素。

1.1.6 奇数维度的过滤器  (卷积核)

通过上面的式子,如果F不是奇数而是偶数个,那么最终计算结果不是一个整数,造成0.5,1.5.....这种情况,这样填充不均匀,所以也就是为什么卷积核默认都去使用奇数维度大小

  • 1 *1,3* 3, 5 *5,7* 7

  • 另一个解释角度

    • 奇数维度的过滤器有中心,便于指出过滤器的位置

当然这个都是一些假设的原因,最终原因还是在F对于计算结果的影响。所以通常选择奇数维度的过滤器,是大家约定成俗的结果,可能也是基于大量实验奇数能得出更好的结果。

1.1.7 stride-步长

以上例子中我们看到的都是每次移动一个像素步长的结果,如果将这个步长修改为2,3,那结果如何?

这样如果以原来的计算公式,那么结果:  N + 2P - F + 1 = 6 + 0 -3 +1 = 4

但是移动2个像素才得出一个结果,所以公式变为:  \frac{N + 2P - F}{2} + 1 = 1.5 + 1 = 2.5​,如果相除不是整数的时候,向下取整,为2。这里并没有加上零填充。

所以最终的公式就为:

  • 对于输入图片大小为N,过滤器大小为F,步长为S,零填充为P: 
  • {\color{Red} (\frac{N + 2P - F}{S} + 1)}

​1.2 多通道卷积

当输入有多个通道(channel)时(例如图片可以有 RGB 三个通道),卷积核需要拥有相同的channel 数, 每个卷积核 channel 与输入层的对应 channel 进行卷积,将每个 channel 的卷积结果按位相加得到最终的 Feature Map。

1.2.1 多卷积核

当有多个卷积核时,可以学习到多种不同的特征,对应产生包含多个 channel 的 Feature Map, 例如上图有两个 filter,所以 output 有两个 channel。这里的多少个卷积核也可理解为多少个神经元。相当于我们把多个功能的卷积核的计算结果放在一起,比如水平边缘检测和垂直边缘检测器

1.2.2 卷积总结

我们来通过一个例子看一下结算结果,以及参数的计算

  • 假设我们有10 个Filter,每个Filter3 X 3 X 3(计算RGB图片),并且只有一层卷积,那么参数有多少?

计算:每个Filter参数个数为:3 *3* 3 + 1 bias = 28​ 个权重参数,总共28 * 10 = 280个参数,即使图片任意大小,我们这层的参数也就这么多。

  • 假设一张200 *200* 3的图片,进行刚才的Filter,步长为1,最终为了保证最后输出的大小为200 * 200,需要设置多大的零填充

(\frac{N + 2P - F}{s} + 1) = N

P = \frac{(N -1) * s + F - N}{2} = \frac{199 + 3 - 200}{2} = 1

1.2.3 设计单个卷积Filter的计算公式

假设神经网络某层l的输入:

  • inputs: ​ n_{h}^{[l -1]},n_{w}^{[l -1]},n_{c}^{[l -1]}

  • 卷积层参数设置:

    • f^{[l]}​:filter的大小

    • p^{[l]}:padding的大小

    • s^{[l]}:stride大小

    • n_{c}^{[l]}:filter的总数量

  • outputs:​n_{h}^{[l]},n_{w}^{[l]},n_{c}^{[l]}

所以通用的表示每一层:

  • 每个Filter:​f^{[l]} * f^{[l]} * n_{c}^{[l -1]}

  • 权重Weights:​f^{[l]} * f^{[l]} * n_{c}^{[l -1]}

  • 应用激活函数Activations:​a^{[l]} = n_{h}^{[l]},n_{w}^{[l]},n_{c}^{[l]}

  • 偏差bias:1 * 1 * 1 * n_{c}^{[l]} ​,通常会用4维度来表示

之前的式子我们就可以简化成,假设多个样本编程向量的形式:

Z^{[l]} = W^{[l]} * X^{[l-1]} + b^{[l]}

A^{[l]} = g(Z^{[l]})

1.3 池化层(Pooling)

池化层主要对卷积层学习到的特征图进行亚采样(subsampling)处理,主要由两种:

  • 最大池化Max Pooling, 取窗口内的最大值作为输出

  • 平均池化Avg Pooling, 取窗口内的所有值的均值作为输出

意义在于:

  • 降低了后续网络层的输入维度,缩减模型大小,提高计算速度

  • 提高了Feature Map 的鲁棒性,防止过拟合

对于一个输入的图片,我们使用一个区域大小为2 *2,步长为2的参数进行求最大值操作。同样池化也有一组参数,f, s,得到2* 2的大小。当然如果我们调整这个超参数,比如说3 * 3,那么结果就不一样了,通常选择默认都是f = 2 * 2, s = 2

池化超参数特点:不需要进行学习,不像卷积通过梯度下降进行更新。

如果是平均池化则:

1.4 全连接层

卷积层+激活层+池化层可以看成是CNN的特征学习/特征提取层,而学习到的特征(Feature Map)最终应用于模型任务(分类、回归):

  • 先对所有 Feature Map 进行扁平化(flatten, 即 reshape 成 1 x N 向量)

  • 再接一个或多个全连接层,进行模型学习

二 图像数据与边缘检测

2.1 为什么需要卷积神经网络

计算机视觉领域,通常要做的就是指用机器程序替代人眼对目标图像进行识别等。那么神经网络也好还是卷积神经网络其实都是上个世纪就有的算法,只是近些年来电脑的计算能力已非当年的那种计算水平,同时现在的训练数据很多,于是神经网络的相关算法又重新流行起来,因此卷积神经网络也一样流行。

  • 1974年,Paul Werbos提出了误差反向传导来训练人工神经网络,使得训练多层神经网络成为可能。

  • 1979年,Kunihiko Fukushima(福岛邦彦),提出了Neocognitron, 卷积、池化的概念基本形成。

  • 1986年,Geoffrey Hinton与人合著了一篇论文:Learning representations by back-propagation errors。

  • 1989年,Yann LeCun提出了一种用反向传导进行更新的卷积神经网络,称为LeNet。

  • 1998年,Yann LeCun改进了原来的卷积网络,LeNet-5。

2.2 图像特征数量对神经网络效果压力

假设下图是一图片大小为28 * 28 的黑白图片时候,每一个像素点只有一个值(单通道)。那么总的数值个数为 784个特征。

那现在这张图片是彩色的,那么彩色图片由RGB三通道组成,也就意味着总的数值有28 28 3 = 2352个值。

从上面我们得到一张图片的输入是2352个特征值,即神经网路当中与若干个神经元连接,假设第一个隐层是10个神经元,那么也就是23520个权重参数。

如果图片再大一些呢,假设图片为1000 *1000* 3,那么总共有3百万数值,同样接入10个神经元,那么就是3千万个权重参数。这样的参数大小,神经网络参数更新需要大量的计算不说,也很难达到更好的效果,大家就不倾向于使用多层神经网络了。

所以就有了卷积神经网络的流行,那么卷积神经网络为什么大家会选择它。那么先来介绍感受野以及边缘检测的概念。

2.3 感受野

1962年Hubel和Wiesel通过对猫视觉皮层细胞的研究,提出了感受野(receptive field)的概念, Fukushima基于感受野概念提出的神经认知机(neocognitron)可以看作是卷积神经网络的第一个实现网络。

单个感受器与许多感觉神经纤维相联系,感觉信息是通过许多感受神经纤维发放总和性的空间与时间类型不同的冲动,相当于经过编码来传递。

2.4 边缘检测

为了能够用更少的参数,检测出更多的信息,基于上面的感受野思想。通常神经网络需要检测出物体最明显的垂直和水平边缘来区分物体。比如

看一个列子,一个 6×6的图像卷积与一个3×3的过滤器(Filter or kenel)进行卷积运算(符号为 *),* 也可能是矩阵乘法所以通常特别指定是卷积的时候代表卷积意思。

  • 相当于将 Filter 放在Image 上,从左到右、从上到下地(默认一个像素)移动过整个Image,分别计算 ImageImage 被 Filter 盖住的部分与 Filter的逐元素乘积的和

在这个6×6 的图像中,左边一半像素的值全是 10,右边一半像素的值全是 0,中间是一条非常明显的垂直边缘。这个图像与过滤器卷积的结果中,中间两列的值都是 30,两边两列的值都是 0,即检测到了原 6×66×6 图像中的垂直边缘。

注:虽然看上去非常粗,是因为我们的图像太小,只有5个像素长、宽,所以最终得到结果看到的是两个像素位置,如果在一个500 x 500的图当中,就是一个竖直的边缘了。

随着深度学习的发展,我们需要检测更复杂的图像中的边缘,与其使用由人手工设计的过滤器,还可以将过滤器中的数值作为参数,通过反向传播来学习得到。算法可以根据实际数据来选择合适的检测目标,无论是检测水平边缘、垂直边缘还是其他角度的边缘,并习得图像的低层特征。

三 图片卷积实操

3.1 均值滤波

# 登月图
moon = plt.imread('./moonlanding.png')
print(moon.shape)    # (474, 630)
plt.figure(figsize=(10,  8))
plt.imshow(moon, cmap = 'gray')

# 均值滤波  # 平滑处理, 用卷积直接扫描
input_img = tf.constant(moon.reshape(1, 474, 630, 1), dtype = tf.float32)
filters = tf.constant(np.array([[1/9, 1/9, 1/9], [1/9, 1/9, 1/9], [1/9, 1/9, 1/9]]).reshape(3, 3, 1, 1),dtype = tf.float32)
strides = [1, 1, 1, 1]
conv2d = tf.nn.conv2d(input =  input_img, filters= filters, strides= strides, padding= 'SAME')
plt.figure(figsize= (10, 8))
plt.imshow(conv2d.numpy().reshape(474, 630), cmap = 'gray')

# 高斯滤波  # 平滑处理, 用卷积直接扫描
input_img = tf.constant(moon.reshape(1, 474, 630, 1), dtype = tf.float32)
filters = tf.constant(np.array([[1/9, 2/9, 1/9], [2/9, 3/9, 2/9], [1/9, 2/9, 1/9]]).reshape(3, 3, 1, 1), dtype = tf.float32)
strides = [1, 1, 1, 1]
conv2d = tf.nn.conv2d(input =  input_img, filters= filters, strides= strides, padding= 'SAME')
plt.figure(figsize= (10, 8))
plt.imshow(conv2d.numpy().reshape(474, 630), cmap = 'gray')

# 均值滤波  # 平滑处理, 用卷积直接扫描
input_img = tf.constant(moon.reshape(1, 474, 630, 1), dtype = tf.float32)
filters = tf.constant(np.array([[9/9, 9/9, 9/9, 9/9, 9/9], [9/9, 9/9, 9/9, 9/9, 9/9],[9/9, 9/9, 9/9, 9/9, 9/9], [9/9, 9/9, 9/9, 9/9, 9/9],[9/9, 9/9, 9/9, 9/9, 9/9]]).reshape(5, 5, 1, 1), dtype = tf.float32)
strides = [1, 1, 1, 1]
conv2d = tf.nn.conv2d(input =  input_img, filters= filters, strides= strides, padding= 'SAME')
plt.figure(figsize= (10, 8))
plt.imshow(conv2d.numpy().reshape(474, 630), cmap = 'gray')

3.2 边缘检测

cat = plt.imread('./cat.jpg')
plt.figure(figsize= (12, 8))
plt.imshow(cat)

# 把猫变成黑白图片
cat_gray = cat.mean(axis = 2)
plt.figure(figsize= (12, 8))
plt.imshow(cat_gray, cmap = 'gray')

# 边缘检测
input_img = tf.constant(cat_gray.reshape(1, 456, 730, 1), dtype = tf.float32)
filters = tf.constant(np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]]).reshape(3, 3, 1, 1), dtype = tf.float32)
strides = [1, 1, 1, 1]
conv2d = tf.nn.conv2d(input =  input_img, filters= filters, strides= strides, padding= 'SAME')
plt.figure(figsize= (10, 8))
plt.imshow(conv2d.numpy().reshape(456, 730), cmap = 'gray')

 3.3 锐化效果

# 边缘检测
input_img = tf.constant(cat_gray.reshape(1, 456, 730, 1), dtype = tf.float32)
filters = tf.constant(np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]]).reshape(3, 3, 1, 1), dtype = tf.float32)
strides = [1, 1, 1, 1]
conv2d = tf.nn.conv2d(input =  input_img, filters= filters, strides= strides, padding= 'SAME')
plt.figure(figsize= (10, 8))
plt.imshow(conv2d.numpy().reshape(456, 730), cmap = 'gray')

europe = plt.imread('./欧式.jpg')
plt.figure(figsize=(10, 8))
plt.imshow(europe)
print(europe.shape)   # (582, 1024, 3)

# 彩色图片
# 把每个通道当做一张图  # transpose通过索引调换维度位置
input_img = tf.constant(europe.reshape(1, 582, 1024, 3).transpose([3, 1, 2, 0]), dtype = tf.float32)
filters = tf.constant(np.array([[1/9, 1/9, 1/9], [1/9, 1/9, 1/9], [1/9, 1/9, 1/9]]).reshape(3, 3, 1, 1), dtype = tf.float32)
strides = [1, 1, 1, 1]
conv2d = tf.nn.conv2d(input =  input_img, filters= filters, strides= strides, padding= 'SAME')
print(conv2d.shape)   # (3, 582, 1024, 1)
plt.figure(figsize= (10, 8))
plt.imshow(conv2d.numpy().reshape(3, 582, 1024).transpose([1, 2, 0])/255)

相关文章:

25- 卷积神经网络(CNN)原理 (TensorFlow系列) (深度学习)

知识要点 卷积神经网络的几个主要结构: 卷积层(Convolutions): Valid :不填充,也就是最终大小为卷积后的大小. Same:输出大小与原图大小一致,那么N ​变成了​N2P. padding-零填充. 池化层(Subsampli…...

把数组里面数值排成最小的数

问题描述:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组{12, 567},则输出这两个能排成的最小数字12567。请给出解决问题的算法,并证明该算法。 思路:先将…...

云his系统源码 SaaS应用 基于Angular+Nginx+Java+Spring开发

云his系统源码 SaaS应用 功能易扩 统一对外接口管理 一、系统概述: 本套云HIS系统采用主流成熟技术开发,软件结构简洁、代码规范易阅读,SaaS应用,全浏览器访问前后端分离,多服务协同,服务可拆分&#xff…...

小红书场景营销怎么做?场景营销主要模式有哪些

小红书作为新兴媒体领域的佼佼者,凭借着生动,直观,代入感等元素的分享推荐收揽了巨额的流量。但是,随着时代的脚步逐渐加快,发展和变革随之涌来,传统的营销已经无法满足。所以场景营销就出现了。今天就来和…...

c++基础——数组

数组数组是存放相同类型对象的容器,数组中存放的对象没有名字,而是要通过其所在的位置访问。数组的大小是固定的,不能随意改变数组的长度。定义数组数组的声明形如 a[b],其中,a 是数组的名字,b 是数组中元素…...

odoo15 登录界面的标题自定义

odoo15 登录界面的标题自定义 原代码中查询:<title>Odoo<title> <html> <head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>Odoo</title><link rel="shortcut icon…...

【内网服务通过跳板机和公网通信】花生壳内网穿透+Nginx内网转发+mqtt服务搭建

问题&#xff1a;服务不能暴露公网 客户的主机不能连外网&#xff0c;服务MQTT服务部署在内网。记做&#xff1a;p1 (computer 1)堡垒机&#xff08;跳板机&#xff09;可以连外网&#xff0c;内网IP 和 MQTT服务在同一个网段。记做&#xff1a;p2 (computer 2)对他人而言&…...

【多线程常见面试题】

谈谈 volatile关键字的用法? volatile能够保证内存可见性,强制从主内存中读取数据,此时如果有其他线程修改被volatile修饰的变量,可以第一时间读取到最新的值 Java多线程是如何实现数据共享的? JVM把内存分成了这几个区域: 方法区,堆区,栈区,程序计数器&#xff1b; 其中堆区…...

深度剖析指针(下)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰的内容还是我们的指针呀&#xff0c;上两篇博客我们基本上已经把知识点过了一遍&#xff0c;这篇博客就让小雅兰来带大家看一些和指针有关的题目吧&#xff0c;现在&#xff0c;就让我们进入指针的世界吧 复习&#xff1a; 数组和…...

爬虫与反爬虫技术简介

互联网的大数据时代的来临&#xff0c;网络爬虫也成了互联网中一个重要行业&#xff0c;它是一种自动获取网页数据信息的爬虫程序&#xff0c;是网站搜索引擎的重要组成部分。通过爬虫&#xff0c;可以获取自己想要的相关数据信息&#xff0c;让爬虫协助自己的工作&#xff0c;…...

Pag的2D渲染执行流程

Pag的渲染 背景 根据Pag文章里面说的&#xff0c;Pag之前长时间使用的Skia库作为底层渲染引擎。但由于Skia库体积过大&#xff0c;为了保证通用型&#xff08;比如兼容CPU渲染&#xff09;做了很多额外的事情。所以Pag的工程师们自己实现了一套2D图形框架替换掉Skia&#xff…...

k8s 概念说明,k8s面试题

什么是Kubernetes&#xff1f; Kubernetes是一种开源容器编排系统&#xff0c;可自动化应用程序的部署、扩展和管理。 Kubernetes 中的 Master 组件有哪些&#xff1f; Kubernetes 中的 Master 组件包括 API Server、etcd、Scheduler 和 Controller Manager。 Kubernetes 中的…...

Docker--(四)--搭建私有仓库(registry、harbor)

私有仓库----registry官方提供registry仓库管理&#xff08;推送、删除、下载&#xff09;私有仓库----harbor私有镜像仓库1.私有仓库----registry官方提供 Docker hub官方已提供容器镜像registry,用于搭建私有仓库 1.1 镜像拉取、运行、查看信息、测试 (一) 拉取镜像 # dock…...

Invalid <url-pattern> [sso.action] in filter mapping

Tomcat 8.5.86版本启动web项目报错Caused by: java.lang.IllegalArgumentException: Invalid <url-pattern> [sso.action] in filter mapping 查看项目的web.xml文件相关片段 <filter-mapping><filter-name>SSOFilter</filter-name><url-pattern&g…...

【11】linux命令每日分享——useradd添加用户

大家好&#xff0c;这里是sdust-vrlab&#xff0c;Linux是一种免费使用和自由传播的类UNIX操作系统&#xff0c;Linux的基本思想有两点&#xff1a;一切都是文件&#xff1b;每个文件都有确定的用途&#xff1b;linux涉及到IT行业的方方面面&#xff0c;在我们日常的学习中&…...

Newman+Jenkins实现接口自动化测试

一、是什么Newman Newman就是纽曼手机这个经典牌子&#xff0c;哈哈&#xff0c;开玩笑啦。。。别当真&#xff0c;简单地说Newman就是命令行版的Postman&#xff0c;查看官网地址。 Newman可以使用Postman导出的collection文件直接在命令行运行&#xff0c;把Postman界面化运…...

MySQL:事务+@Transactional注解

事务 本章从了解为什么需要事务到讲述事务的四大特性和概念&#xff0c;最后讲述MySQL中的事务使用语法以及一些需要注意的性质。 再额外讲述一点Springboot中Transactional注解的使用。 1.为什么需要事务&#xff1f; 我们以用户转账为例&#xff0c;假设用户A和用户B的银行账…...

数字IC手撕代码--低功耗设计 Clock Gating

背景介绍芯片功耗组成中&#xff0c;有高达 40%甚至更多是由时钟树消耗掉的。这个结果的原因也很直观&#xff0c;因 为这些时钟树在系统中具有最高的切换频率&#xff0c;而且有很多时钟 buffer&#xff0c;而且为了最小化时钟 延时&#xff0c;它们通常具有很高的驱动强度。 …...

易基因|m6A RNA甲基化研究的数据挖掘思路:干货系列

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。关于m6A甲基化研究思路&#xff08;1&#xff09;整体把握m6A甲基化图谱特征&#xff1a;m6A peak数量变化、m6A修饰基因数量变化、单个基因m6A peak数量分析、m6A peak在基因元件上的分布…...

【微信小程序】-- 页面配置(十八)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…...

玩好 StarRocks,大厂 offer 接不完!|字节跳动、小红书、京东物流、唯品会、腾讯音乐要的就是你!

求职黄金季即将到来&#xff0c;你准备好迎接你的 dream offer 了吗&#xff1f;StarRocks 自创立以来&#xff0c;一直主张为用户创造极速统一的数据分析新范式&#xff0c;让数据驱动创新&#xff0c;而优秀的大数据人才对推动创新有着至关重要的作用。因此&#xff0c;我们推…...

C# IoC控制反转学习笔记

一、什么是IOC IoC-Invertion of Control&#xff0c;即控制反转&#xff0c;是一种程序设计思想。 先初步了解几个概念&#xff1a; 依赖&#xff08;Dependency&#xff09;&#xff1a;就是有联系&#xff0c;表示一个类依赖于另一个类。 依赖倒置原则&#xff08;DIP&a…...

Python解题 - CSDN周赛第33期

本期四道题全考过&#xff0c;题解在网上也都搜得到。。。没有想法&#xff0c;顺手水一份题解吧。 第一题&#xff1a;奇偶排序 给定一个存放整数的数组&#xff0c;重新排列数组使得数组左边为奇数&#xff0c;右边为偶数。 输入描述&#xff1a;第一行输入整数n。(1<n<…...

Session攻击

Session攻击Session攻击简介主要攻击方式会话预测会话劫持中间人攻击会话固定Session攻击简介 Session对于Web应用是最重要的&#xff0c;也是最复杂的。对于Web应用程序来说&#xff0c;加强安全性的首要原则就是:不要信任来自客户端的数据&#xff0c;一定要进行数据验证以及…...

【Linux】Shell详解

&#x1f60a;&#x1f60a;作者简介&#x1f60a;&#x1f60a; &#xff1a; 大家好&#xff0c;我是南瓜籽&#xff0c;一个在校大二学生&#xff0c;我将会持续分享Java相关知识。 &#x1f389;&#x1f389;个人主页&#x1f389;&#x1f389; &#xff1a; 南瓜籽的主页…...

汉字找不同隐私协议

本隐私信息保护政策版本&#xff1a;2021 V1 一、重要提示 请您&#xff08;以下亦称“用户”&#xff09;在使用本平台App时仔细阅读本协议之全部条款&#xff0c;并确认您已完全理解本协议之规定&#xff0c;尤其是涉及您的重大权益及义务的加粗或划线条款。如您对协议有任…...

CEC2017:斑马优化算法(Zebra Optimization Algorithm,ZOA)求解cec2017(提供MATLAB代码)

一、斑马优化算法 斑马优化算法&#xff08;Zebra Optimization Algorithm&#xff0c;ZOA&#xff09;Eva Trojovsk等人于2022年提出&#xff0c;其模拟斑马的觅食和对捕食者攻击的防御行为。 斑马因身上有起保护作用的斑纹而得名。没有任何动物比斑马的皮毛更与众不同。斑…...

【Linux要笑着学】进程创建 | 进程终止 | slab分派器

爆笑教程《看表情包学Linux》&#x1f448; 猛戳订阅&#xff01;​​​​​​​​​​​​&#x1f4ad; 写在前面&#xff1a;本章我们主要讲解进程的创建与终止。首先讲解进程创建&#xff0c;fork 函数是我们早在讲解 "进程的概念" 章节就提到过的一个函数&#…...

数据资产管理建设思考(二)

关于数据资产管理&#xff0c;近两年是数据治理行业中一个热点话题&#xff0c;当然有我们前面提到的国家的政策支持及方向指引的原因。另一方面我们做数据治理的同行们从学习吸收国外优秀的数据治理理论&#xff0c;进一步在实践中思考如何应用理论&#xff0c;并结合我们国家…...

微软发布多模态版ChatGPT!取名“宇宙一代”

文&#xff5c;CoCo酱Ludwig Wittgenstein曾说过&#xff1a;“我语言的局限&#xff0c;即是我世界的局限”。大型语言模型&#xff08;LLM&#xff09;已成功地作为各种自然语言任务的通用接口&#xff0c;只要我们能够将输入和输出转换为文本&#xff0c;就可以将基于LLM的接…...

公司做网站报价/网站推广基本方法是

1.首先&#xff0c;程序中头文件的选择&#xff0c;要选择<math.h>头文件&#xff0c;在<cmath>文件中是没有对M_PI 的定义的&#xff08;现在的<cmath>中对M_PI好像已有定义&#xff09;。 2.选择&#xff1a;项目——>”XXX属性"——>配置属性…...

政府单位网站建设方案/关键词搜索广告

java8的stream流学习(2) ***前言*** 之前也写过两三篇关于Stream相关的帖子,当然了,也是参考的.我感觉java8的新特性还是要深刻掌握的,因为这几个新特性的确能帮助我们让代码变得健壮,不说了,直接写案例,撸代码 参考网址: https://mp.weixin.qq.com/s/IHkpqdRLeEPAgdPbOnxsKw …...

中小企业建立网站最经济的方式/查关键词排名软件

最近在弄linux系统的环境&#xff0c;搭建vue环境&#xff0c;由于是第一次接触vue以前也没使用过&#xff0c;所以才搭建环境的时候还是挺闷逼的。记录一下&#xff0c;免得以后忘记了。 安装cnpm 由于不知道vue和npm的关系&#xff0c;所以自己想先安装npm并设置成阿里的cnpm…...

做灯箱到哪个网站找业务/商务网站建设

在从数据库中读取数据时最好直接在select语句中加入选择条件&#xff0c;从而直接限制筛选出符合条件的数据&#xff0c;而不建议读出所有的数据然后用ABAP代码来过滤筛选。 例如&#xff0c;不建议使用&#xff1a; Select * from zflight. Check : zflight-airln ‘LF’ a…...

韩国网站怎么打开/免费seo教程分享

本文同步发表于 个人博客。 前言 感觉 leetcodeleetcodeleetcode 周赛不花时间&#xff0c;做一做还能保持一下手感&#xff0c;最重要的是能让人在周末早起。于是以后可能就会多打打 leetcodeleetcodeleetcode 了。 周赛273 AK时间: 21min 最终排名&#xff1a; A 5963…...

食品网站建设策划/谷歌三件套一键安装

当我进行Python编程时&#xff0c;我总是使用制表符进行缩进。 但后来我在SO上遇到了一个问题&#xff0c;有人指出大多数Python程序员使用空格而不是制表符来最小化编辑器到编辑器的错误。这有什么不同&#xff1f; 还有其他原因可以使用空格而不是Python的制表符吗&#xff1…...