人工智能教程007:创建一个卷积神经网络(2)

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

我们如何对图像应用卷积

当我们在图像上应用卷积时,我们在两个维度上执行卷积——水平和竖直方向。我们混合两桶信息:第一桶是输入的图像,由三个矩阵构成——RGB三通道,其中每个元素都是0到255之间的一个整数。第二个桶是卷积核(kernel),单个浮点数矩阵。可以将卷积核的大小和模式想象成一个搅拌图像的方法。卷积核的输出是一幅修改后的图像,在深度学习中经常被称作feature map。对每个颜色通道都有一个feature map。

convolution.png

边缘检测卷积核的效果

这是怎么做到的呢,我们现在演示一下如何通过卷积来混合这两种信息。一种方法是从输入图片中取出一个与卷积核大小相同的区块——这里假设图片为100×100100×100,卷积核大小为3×33×3,那么我们取出的区块大小就是3×33×3——然后对每对相同位置的元素执行乘法后求和(不同于矩阵乘法,却类似向量内积,这里是两个相同大小的矩阵的“点乘”)。乘积的和就生成了feature map中的一个像素。当一个像素计算完毕后,移动一个像素取下一个区块执行相同的运算。当无法再移动取得新区块的时候对feature map的计算就结束了。这个流程可以用如下的动画演示:

aa-convolution-02.gif

RAM是输入图片,Buffer是feature map

你可能注意到这里有个正规化因子m,这里m的值为kernel的大小9;这是为了保证输入图像和feature map的亮度相同。

为什么机器学习中图像卷积有用

图像中可能含有很多我们不关心的噪音。一个好例子是针对时尚图像用深度编码器做的搜索引擎:你上传一幅时尚服饰的图片,编码器自动找出款式类似的服饰。

如果你想要区分衣服的式样,那么衣服的颜色就不那么重要了;另外像商标之类的细节也不那么重要。最重要的可能是衣服的外形。一般来讲,女装衬衫的形状与衬衣、夹克和裤子的外观非常不同。如果我们过滤掉这些多余的噪音,那我们的算法就不会因颜色、商标之类的细节分心了。我们可以通过卷积轻松地实现这项处理。

我们通过索贝尔边缘检测滤波器(与上上一幅图类似)去掉了图像中除了边缘之外的所有信息——这也是为什么卷积应用经常被称作滤波而卷积核经常被称作滤波器(更准确的定义在下面)的原因。由边缘检测滤波器生成的feature map对区分衣服类型非常有用,因为只有外形信息被保留下来。

autoencoder_fashion_features_and_results.png

彩图的左上角是搜索query,其他是搜索结果,你会发现自动编码器真的只关注衣服的外形,而不是颜色。

再进一步:有许多不同的核可以产生多种feature map,比如锐化图像(强调细节),或者模糊图像(减少细节),并且每个feature map都可能帮助算法做出决策(一些细节,比如衣服上有3个纽扣而不是两个,可能可以区分一些服饰)。

使用这种手段——读入输入、变换输入、然后把feature map喂给某个算法——被称为特征工程。特征工程非常难,很少有资料帮你上手。造成的结果是,很少有人能熟练地在多个领域应用特征工程。特征工程是——纯手工——也是Kaggle比赛中最重要的技能。特征工程这么难的原因是,对每种数据每种问题,有用的特征都是不同的:图像类任务的特征可能对时序类任务不起作用;即使两个任务都是图像类的,也很难找出相同的有效特征,因为视待识别的物体的不同,有用的特征也不同。这非常依赖经验。

所以特征工程对新手来讲特别困难。不过对图像而言,是否可以利用卷积核自动找出某个任务中最适合的特征?

进入卷积神经网络crosscorrelation_example.pngconvolution_quiz.png

卷积神经网络就是干这个的。不同于刚才使用固定数字的卷积核,我们赋予参数给这些核,参数将在数据上得到训练。随着卷积神经网络的训练,这些卷积核为了得到有用信息,在图像或feature map上的过滤工作会变得越来越好。这个过程是自动的,称作特征学习。特征学习自动适配新的任务:我们只需在新数据上训练一下自动找出新的过滤器就行了。这是卷积神经网络如此强大的原因——不需要繁重的特征工程了!

通常卷积神经网络并不学习单一的核,而是同时学习多层级的多个核。比如一个32x16x16的核用到256×256的图像上去会产生32个241×241(latex.png)的feature map。所以自动地得到了32个有用的新特征。这些特征可以作为下个核的输入。一旦学习到了多级特征,我们简单地将它们传给一个全连接的简单的神经网络,由它完成分类。这就是在概念上理解卷积神经网络所需的全部知识了(池化也是个重要的主题,但还是在另一篇博客中讲吧)。

第二部分:高级概念

我们现在对卷积有了一个良好的初步认识,也知道了卷积神经网络在干什么、为什么它如此强大。现在让我们深入了解一下卷积运算中到底发生了什么。我们将认识到刚才对卷积的讲解是粗浅的,并且这里有更优雅的解释。通过深入理解,我们可以理解卷积的本质并将其应用到许多不同的数据上去。万事开头难,第一步是理解卷积原理。

卷积定理

要理解卷积,不得不提convolution theorem,它将时域和空域上的复杂卷积对应到了频域中的元素间简单的乘积。这个定理非常强大,在许多科学领域中得到了广泛应用。卷积定理也是快速傅里叶变换算法被称为20世纪最重要的算法之一的一个原因。

convolution-theorem1.png

第一个等式是一维连续域上两个连续函数的卷积;第二个等式是二维离散域(图像)上的卷积。这里latex (1).png指的是卷积,latex (2).png指的是傅里叶变换,latex (3).png表示傅里叶逆变换,latex (4).png是一个正规化常量。这里的“离散”指的是数据由有限个变量构成(像素);一维指的是数据是一维的(时间),图像则是二维的,视频则是三维的。

为了更好地理解卷积定理,我们还需要理解数字图像处理中的傅里叶变换。

快速傅里叶变换

快速傅里叶变换是一种将时域和空域中的数据转换到频域上去的算法。傅里叶变换用一些正弦和余弦波的和来表示原函数。必须注意的是,傅里叶变换一般涉及到复数,也就是说一个实数被变换为一个具有实部和虚部的复数。通常虚部只在一部分领域有用,比如将频域变换回到时域和空域上;而在这篇博客里会被忽略掉。你可以在下面看到一个信号(一个以时间为参数的有周期的函数通常称为信号)是如何被傅里叶变换的:

fourier_transform_time_and_frequency_domains.gif

红色是时域,蓝色为频域

你也许会说从没见过这些东西,但我敢肯定你在生活中是见过的:如果红色是一首音乐的话,那么蓝色值就是你在你的MP3播放器屏幕上看到的频谱:

hankcs.com-2017-03-22-下午10.31.42.png

傅里叶域上的图像

fourier-transforms.png

我们如何想象图片的频率呢?想象一张只有两种模式的纸片,现在把纸片竖起来顺着线条的方向看过去,就会看到一个一个的亮点。这些以一定间隔分割黑白部分的波就代表着频率。在频域中,低频率更接近中央而高频率更接近边缘。频域中高强度(亮度、白色)的位置代表着原始图像亮度改变的方向。这一点在接下来这张图与其对数傅里叶变换(对傅里叶变换的实部取对数,这样可以减小像素亮度的差别,便于观察更广的亮度区域)中特别明显:

fourier_direction_detection.png

我们马上就可以发现傅里叶变换包含了关于物体朝向的信息。如果物体被旋转了一个角度,从图像像素上可能很难判断,但从频域上可以很明显地看出来。

这是个很重要的启发,基于傅里叶定理,我们知道卷积神经网络在频域上检测图像并且捕捉到了物体的方向信息。于是卷积神经网络就比传统算法更擅长处理旋转后的图像(虽然还是比不上人类)。

频率过滤与卷积

为什么卷积经常被描述为过滤,为什么卷积核经常被称为过滤器呢?通过下一个例子可以解释:

filtered-image1.png

如果我们对图像执行傅里叶变换,并且乘以一个圆形(背景填充黑色,也就是0),我们可以过滤掉所有的高频值(它们会成为0,因为填充是0)。注意过滤后的图像依然有条纹模式,但图像质量下降了很多——这就是jpeg压缩算法的工作原理(虽然有些不同但用了类似的变换),我们变换图形,然后只保留部分频率,最后将其逆变换为二维图片;压缩率就是黑色背景与圆圈的比率。

我们现在将圆圈想象为一个卷积核,然后就有了完整的卷积过程——就像在卷积神经网络中看到的那样。要稳定快速地执行傅里叶变换还需要许多技巧,但这就是基本理念了。

现在我们已经理解了卷积定理和傅里叶变换,我们可以将这些理念应用到其他科学领域,以加强我们对深度学习中的卷积的理解。

流体力学的启发

流体力学为空气和水创建了大量的微分方程模型,傅里叶变换不但简化了卷积,也简化了微分,或者说任何利用了微分方程的领域。有时候得到解析解的唯一方法就是对微分方程左右同时执行傅里叶变换。在这个过程中,我们常常将解写成两个函数卷积的形式,以得到更简单的表达。这是在一个维度上的应用,还有在两个维度上的应用,比如天文学。

扩散

你可以混合两种液体(牛奶和咖啡),只要施加一个外力(汤勺搅拌)——这被称为对流,而且是个很快的过程。你也可以耐心等待两种液体自然混合——这被称为扩散,通常是很慢的过程。

想象一下,一个鱼缸被一块板子隔开,两边各有不同浓度的盐水。抽掉板子后,两边的盐水会逐步混合为同一个浓度。浓度差越大,这个过程越剧烈。

现在想象一下,一个鱼缸被 256×256 个板子分割为 256×256 个部分,每个部分都有不同浓度的盐水。如果你去掉所有的挡板,浓度类似的小块间将不会有多少扩散,但浓度差异大的区块间有巨大的扩散。这些小块就是像素点,而浓度就是像素的亮度。浓度的扩散就是像素亮度的扩散。

这说明,扩散现象与卷积有相似点——初始状态下不同浓度的液体,或不同强度的像素。为了完成下一步的解释,我们还需要理解传播子。

理解传播子

传播子就是密度函数,表示流体微粒应该往哪个方向传播。问题是神经网络中没有这样的概率函数,只有一个卷积核——我们要如何统一这两种概念呢?

我们可以通过正规化来讲卷积核转化为概率密度函数。这有点像计算输出值的softmax。下面就是对第一个例子中的卷积核执行的softmax结果:

softmax.png

现在我们就可以从扩散的角度来理解图像上的卷积了。我们可以把卷积理解为两个扩散流程。首先,当像素亮度改变时(黑色到白色等)会发生扩散;然后某个区域的扩散满足卷积核对应的概率分布。这意味着卷积核正在处理的区域中的像素点必须按照这些概率来扩散。

在上面那个边缘检测器中,几乎所有临近边缘的信息都会聚集到边缘上(这在流体扩散中是不可能的,但这里的解释在数学上是成立的)。比如说所有低于0.0001的像素都非常可能流动到中间并累加起来。与周围像素区别最大的区域会成为强度的集中地,因为扩散最剧烈。反过来说,强度最集中的地方说明与周围对比最强烈,这也就是物体的边缘所在,这解释了为什么这个核是一个边缘检测器。

所以我们就得到了物理解释:卷积是信息的扩散。我们可以直接把这种解释运用到其他核上去,有时候我们需要先执行一个softmax正规化才能解释,但一般来讲核中的数字已经足够说明它想要干什么。比如说,你是否能推断下面这个核的的意图?

softmax_quiz.png

等等,有点迷惑

对一个概率化的卷积核,怎么会有确定的功能?我们必须根据核对应的概率分布也就是传播子来计算单个粒子的扩散不是吗?

是的,确实如此。但是,如果你取一小部分液体,比如一滴水,你仍然有几百万水分子。虽然单个分子的随机移动满足传播子,但大量的分子宏观上的表现是基本确定的。这是统计学上的解释,也是流体力学的解释。我们可以把传播子的概率分布解释为信息或说像素亮度的平均分布;也就是说我们的解释从流体力学的角度来讲是没问题的。话说回来,这里还有一个卷积的随机解释。

量子力学的启发

传播子是量子力学中的重要概念。在量子力学中,一个微粒可能处于一种叠加态,此时它有两个或两个以上属性使其无法确定位于观测世界中的具体位置。比如,一个微粒可能同时存在于两个不同的位置。

但是如果你测量微粒的状态——比如说现在微粒在哪里——它就只能存在于一个具体位置了。换句话说,你通过观测破坏了微粒的叠加态。传播子就描述了微粒出现位置的概率分布。比如说在测量后一个微粒可能——根据传播子的概率函数——30%在A,70%在B。

通过量子纠缠,几个粒子就可以同时储存上百或上百万个状态——这就是量子计算机的威力。

如果我们将这种解释用于深度学习,我们可以把图片想象为位于叠加态,于是在每个3*3的区块中,每个像素同时出现在9个位置。一旦我们应用了卷积,我们就执行了一次观测,然后每个像素就坍缩到满足概率分布的单个位置上了,并且得到的单个像素是所有像素的平均值。为了使这种解释成立,必须保证卷积是随机过程。这意味着,同一个图片同一个卷积核会产生不同的结果。这种解释没有显式地把谁比作谁,但可能启发你如何把卷积用成随机过程,或如何发明量子计算机上的卷积网络算法。量子算法能够在线性时间内计算出卷积核描述的所有可能的状态组合。

概率论的启发

卷积与互相关紧密相连。互相关是一种衡量小段信息(几秒钟的音乐片段)与大段信息(整首音乐)之间相似度的一种手段(youtube使用了类似的技术检测侵权视频)。

cross-correlation2.png

虽然互相关的公式看起来很难,但通过如下手段我们可以马上看到它与深度学习的联系。在图片搜索中,我们简单地将query图片上下颠倒作为核然后通过卷积进行互相关检验,结果会得到一张有一个或多个亮点的图片,亮点所在的位置就是人脸所在的位置。

crosscorrelation_example.png

这个例子也展示了通过补零来使傅里叶变换稳定的一种技巧,许多版本的傅里叶变换都使用了这种技巧。另外还有使用了其他padding技巧:比如平铺核,分治等等。我不会展开讲,关于傅里叶变换的文献太多了,里面的技巧特别多——特别是对图像来讲。

在更底层,卷积网络第一层不会执行互相关校验,因为第一层执行的是边缘检测。后面的层得到的都是更抽象的特征,就有可能执行互相关了。可以想象这些亮点像素会传递给检测人脸的单元(Google Brain项目的网络结构中有一些单元专门识别人脸、猫等等;也许用的是互相关?)

统计学的启发

统计模型和机器学习模型的区别是什么?统计模型只关心很少的、可以解释的变量。它们的目的经常是回答问题:药品A比药品B好吗?

机器学习模型是专注于预测效果的:对于年龄X的人群,药品A比B的治愈率高17%,对年龄Y则是23%。

机器学习模型通常比统计模型更擅长预测,但它们不是那么可信。统计模型更擅长得到准确可信的结果:就算药品A比B好17%,我们也不知道这是不是偶然,我们需要统计模型来判断。

对时序数据,有两种重要的模型:weighted moving average 和autoregressive模型,后者可归入ARIMA model (autoregressive integrated moving average model)。比起LSTM,ARIMA很弱。但在低维度数据(1-5维)上,ARIMA非常健壮。虽然它们有点难以解释,但ARIMA绝不是像深度学习算法那样的黑盒子。如果你需要一个可信的模型,这是个巨大的优势。

我们可以将这些统计模型写成卷积的形式,然后深度学习中的卷积就可以解释为产生局部ARIMA特征的函数了。这两种形式并不完全重合,使用需谨慎。

autoregression_weighted_average.png

C是一个以核为参数的函数,white noise是正规化的均值为0方差为1的互不相关的数据。

当我们预处理数据的时候,经常将数据处理为类似white noise的形式:将数据移动到均值为0,将方差调整为1。我们很少去除数据的相关性,因为计算复杂度高。但是在概念上是很简单的,我们旋转坐标轴以重合数据的特征向量:

eigenvector_decorrelation1.png

现在如果我们将C作为bias,我们就会觉得这与卷积神经网络很像。所以卷积层的输出可被解释为白噪音数据经过autoregressive model的输出。

weighted moving average的解释更简单:就是输入数据与某个固定的核的卷积。看看文末的高斯平滑核就会明白这个解释。高斯平滑核可以被看做每个像素与其邻居的平均,或者说每个像素被其邻居平均(边缘模糊)。

虽然单个核无法同时创建autoregressive 和 weighted moving average 特征,但我们可以使用多个核来产生不同的特征。

监督学习的概念

监督学习是用正确答案已知的例子来训练神经网络,也就是用标记过的数据。如果我们想设计一个系统——从相册中找出包含你的父母的照片,基本的步骤如下:

第一步:数据的生成和分类

首先,需要将你所有的照片看一遍,记录下来哪些照片上有你的父母。然后把照片分为两组。第一组叫做训练集,用来训练神经网络。第二组叫做验证集,用来检验训练好的神经网络能否认出你的父母,正确率有多少。

之后,这些数据会作为神经网络的输入,得到一些输出。用数学语言表示就是:找到一个函数,该函数的输入是一幅照片。当照片上有你的父母的时候,输出为1;没有的时候,输出为0。

这种问题通常叫做分类。因为这个例子中,输出只有两个可能,是或者不是。

当然,监督学习的输出也可以是任意值,而不仅仅是0或者1。举另一个例子,我们的神经网络可以预测一个人还信用卡的概率。这个概率可以是0到100的任意一个数字。这种问题通常叫做回归。

第二步:训练

在进行训练这一步时,每一幅图像都会作为神经网络的输入,根据一定的规则(激活函数),决定某个神经元的输出,进而得到某一层的输出。当计算完所有神经元的时候,最后得到了最右边的神经元(输出节点)的输出,是0还是1。

上一步中,我们已对照片上是否有你父母做过标记。这样,我们就能知道神经网络所预测的结果是否正确,并把这一信息反馈回神经网络。

这里所反馈的,是成本函数的计算结果,即神经网络计算结果与实际情况的偏差。这个函数也叫做目标函数、效用函数或者适应度函数。这一结果用来调整神经元的权重和偏差,这就是BP算法,即反向传播算法,因为该信息是从后向前传递的。

刚才针对的是一个照片。你需要对每张照片不断重复这个过程。每个过程中都要最小化成本函数。

BP算法有很多实现方法,最常用还是梯度递减的方法。

Algobeans 非常通俗易懂的解释了这个方法。Michael Nielsen 在此基础上,加上了积分和线性代数,也给出了形象生动的演示。

24164222_FGnO.png

第三步:验证

至此,第一组中的数据已经全部用完。接下来我们会用第二组数据验证训练得到的模型的准确率。

优化模型的许多参数(超参)需要优化,因此导致第二步和第三步通常会交叉进行。常用的超参有神经网络有多少个神经元,有多少层神经元,哪个函数用来激活一个神经元(激活函数),用多快的速度来训练网络(学习速率)等等。Quora 工程师主管的这一回复很好的解释了这些超参。

第四步:应用

完成以上三步,模型就训练好了。接下来,我们可以把模型融合到程序中。模型可以提供一个 API,例如 ParentsInPicture(photo)。当应用程序调用该 API 的时候,模型会计算得到结果,并返回给应用程序。

稍后,我们将用同样的方法步骤,在 iPhone 上制作一个 APP,用来识别名片。

对数据集进行标记的成本是非常高的。因此,必须确保使用网络得到的收益比标记数据和训练模型的消耗要更高。

举例来说,在医学领域,根据X光照片标记病人是否患有癌症成本是很高的,但能以极高的准确率来诊断病人是否患癌的系统则又非常有价值。

无监督学习

无监督学习 中使用的数据是没有标记过的,即不知道输入数据对应的输出结果是什么。无监督学习只能默默的读取数据,自己寻找数据的模型和规律,比如聚类(把相似数据归为一组)和异常检测(寻找异常)。

  • 假设你要生产T恤,却不知道 XS、S、M、L 和 XL 的尺寸到底应该设计多大。你可以根据人们的体测数据,用聚类算法把人们分到不同的组,从而决定尺码的大小。

  • 假如你是初创的安全相关公司的 CTO。你想从网络连接情况找到一些蛛丝马迹:突然增大的数据流量可能意味着有快要离职的员工下载所有的 CRM 历史数据,或者有人往新开账户里面转了一大笔钱。如果你对这类事情感兴趣,可以参考无监督异常检测算法概览:

24164222_3sIx.png

▍半监督学习

半监督学习训练中使用的数据,只有一小部分是标记过的,而大部分是没有标记的。因此和监督学习相比,半监督学习的成本较低,但是又能达到较高的准确度。举例来说,我们在 AI 咨询公司 Joostware 工作的朋友 Delip Rao,用半监督学习方法对每类只标记30个数据,和用监督学习对每个类标记1360个数据,取得了一样的效果。并且这使得他们的客户可以标记更多的类,从20个类迅速扩展到了110个类。

一个直观的解释为什么无标记也能提高准确率:即使不知道正确的答案,但是可以知道输入数据长什么样,有什么可能的取值。

喜欢数学的可以读读朱晓进教授长达135页的教程和他2008年那篇半监督学习纵览。

半监督学习教程

http://pages.cs.wisc.edu/~jerryzhu/pub/sslicml07.pdf

半监督学习纵览

http://pages.cs.wisc.edu/~jerryzhu/pub/ssl_survey.pdf

强化学习

强化学习也是使用未标记的数据,但是可以通过某种方法知道你是离正确答案越来越近还是越来越远(即奖惩函数)。传统的“冷热游戏”(hotter or colder,是美版捉迷藏游戏 Huckle Buckle Beanstalk 的一个变种)很生动的解释了这个概念。你的朋友会事先藏好一个东西,当你离这个东西越来越近的时候,你朋友就说热,越来越远的时候,你朋友会说冷。冷或者热就是一个奖惩函数。半监督学习算法就是最大化奖惩函数。可以把奖惩函数想象成正确答案的一个延迟的、稀疏的形式。

在监督学习中,能直接得到每个输入的对应的输出。强化学习中,训练一段时间后,你才能得到一个延迟的反馈,并且只有一点提示说明你是离答案越来越远还是越来越近。

 

转载于:https://my.oschina.net/weidongpei/blog/1815288

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283210.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【系统知识点】linux入门基础命令

大概总结了一下一些基础命令,仅仅是帮助基础使用linux文件系统,如果还有相关基础命令,希望大家留言一起补充汇总一下!命令的基本格式:格式:command [-options] parameter1 parameter2 …ps:第一…

Blazor University (48)依赖注入 —— Scoped 依赖

原文链接:https://blazor-university.com/dependency-injection/dependency-lifetimes-and-scopes/scoped-dependencies/Scoped 依赖Scoped 依赖项类似于 Singleton 依赖项,因为 Blazor 会将相同的实例注入到依赖它的每个对象中,但不同之处在…

c 连接mysql怎么增删改_C++ API方式连接mysql数据库实现增删改查

这里复制的http://www.bitscn.com/pdb/mysql/201407/226252.html一、环境配置1,装好mysql,新建一个C控制台工程(从最简单的弄起,这个会了,可以往任何c工程移植),在vs2010中设置,工程--属性--VC目录--包含目…

阿里云如何实现海量短视频的极速分发?答案在这里!

摘要:短视频行业目前比较火热,但是如何快速的实现海量短视频的极速分发,对于短视频业务提供方来讲是一个比较棘手的问题。阿里云技术专家将带领大家从视频的上传、采集、存储和CDN分发等方面为我们介绍阿里云的整体方案,并且重点讲…

GitHub项目管理维护实用教程

GitHub项目维护教程 1)注册GitHub账户并登陆; 2)在Windows cmd(或Ubuntu中的terminal)中cd到自己的工作目录,将仓库clone下来: 命令: 1 git clone https://github.com/... #项目地址…

图文详解cacti的安装和使用

简介: 1.cacti介绍2.安装服务端3.安装客户端4.添加监控的设备cacti的介绍Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具Cacti是通过 snmpget来获取数据,使用 RRDtool绘画图形,而且你完全可以不需要了解RRDtool复杂…

记一次 .NET 某金融企业 WPF 程序卡死分析

一:背景 1. 讲故事前段时间遇到了一个难度比较高的 dump,经过几个小时的探索,终于给找出来了,在这里做一下整理,希望对大家有所帮助,对自己也是一个总结,好了,老规矩,上 …

如何将图片放到mysql_怎么将图片添加到mysql中

将图片添加到mysql中的方法:首先将数据库存储图片的字段类型设置为blob二进制大对象类型;然后将图片流转化为二进制;最后将图片插入数据库即可。正常的图片储存要么放进本地磁盘,要么就存进数据库。存入本地很简单,现在…

Java线程与Linux内核线程的映射关系

http://blog.sina.com.cn/s/blog_605f5b4f010198b5.html Linux从内核2.6開始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程。Java里的线程是由JVM来管理的。它怎样相应到操作系统的线程是由JVM的实现来确定的。L…

YoursLC 有源 低代码 项目介绍

YoursLC 是我们独立研发的一款低代码产品,YoursLC-yours你们的、LC是低代码low-code的缩写,中文名称:有源低代码, 是一套双输出的低代码产品:既能完整输出功能又能100%输出源码。满足用户高效率、低成本和个性化的需求…

stm32电机控制定时器1_STM32通过PWM控制电机速度

做STM32智能小车的实验中会用到定时器PWM输出,来改变直流电机的转速。分享本文了解如何通过PWM实现对电机速度的控制。PWM控制电机速度的基本原理PWM(Pulse Width Modulation),也就是脉冲宽度调制。PWM中有一个比较重要的概念,占空比&#xf…

走向无后端的系统开发实践:CRUD自动化与强约定的REST接口

2019独角兽企业重金招聘Python工程师标准>>> ttp://mp.weixin.qq.com/s?__bizMzAwMDU1MTE1OQ&idx1&mid2653548079&sn2377b625db58b2ea93c3ef2d87e4c395 转载于:https://my.oschina.net/yunjie/blog/806130

mysql char varchar 性能_Mysql小细节:varchar与char在性能上的特点

varchar与char的一个主要区别是存储方式的不同varchar 是变长存储占用的存储空间 存储内容实际大小 长度记录位char 是定长存储占用的存储空间 字段声明的宽度存储方式对性能是有影响的例如分别使用 varchar(10) 与 varchar(255) 定义一个字段,实际存储的字符串为…

Dubbo源码解析之Zookeeper连接

2019独角兽企业重金招聘Python工程师标准>>> 注:Dubbo的版本是2.5.7。 图1 RegistryProtocol的export时序图 注册中心有Zookeeper、Redis、Dubbo,分别对应ZookeeperRegistry、RedisRegistry、MulticastRegistry。 连接Dubbo的客户端有俩种&am…

SHELL 脚本小技巧

脚本很简单,直接上功能介绍及脚本,可以做模板使用: 记录日志,记录脚本开始执行时间、结束时间usage 函数,脚本需接参数执行,避免误执行,告诉用户,这个脚本的使用方法加锁,创建锁文件…

WinForm(十)项目框架结构

看到下面的项目结构,是否曾经相识?不要笑,这也是一种项目结构,极简主义。项目结构没有对错,合适就好,但也要有几个要求,至少要做到结构明确,清晰,当然上图的结构清晰&…

mysql索引有哪些了解_Mysql索引(简单了解)

Mysql的存储引擎,可以针对不同的表使用不同的存储引擎MyISAM:插入,查血速度快,但是不支持事物,所以适用于数据仓库,Web等InnoDB:支持事物,所以适合于事物型数据库Memory:…

使用Spring发送带附件的电子邮件(站内和站外传送)

1.使用Spring发送带附件的电子邮件 <?xml version"1.0" encoding"UTF-8"?> <beansxmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:p"http://www.spr…

vmware 克隆后Linux没有eth网卡只有lo

想试着在虚拟机上搭下主从&#xff0c;&#xff0c;&#xff0c;结果&#xff0c;克隆出来的虚拟机没有网卡。。。只有lo 于是跟着别人的来添加一个网卡 第一步&#xff1a;打开克隆的虚拟机 第二步&#xff1a; 第三步 第四步&#xff1a; 最后&#xff1a; 之后执行reboot重启…

聊一聊 C++ 中的 namespace

一&#xff1a;背景 相信大家在分析 dump 时&#xff0c;经常会看到 WKS 和 SRV 这样的字眼&#xff0c;如下代码所示&#xff1a;00007ffa778a07b8 coreclr!WKS::gc_heap::segment_standby_list 0x0000000000000000 00007ffa778a3870 coreclr!WKS::qpf 0x989680 00007ffa778…