图神经网络基础与前沿代码(图神经网络综述)

网络设计 885
本篇文章给大家谈谈图神经网络基础与前沿代码,以及图神经网络综述对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 本文目录一览: 1、从零开始用Python构建神经网络

本篇文章给大家谈谈图神经网络基础与前沿代码,以及图神经网络综述对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

从零开始用Python构建神经网络

从零开始用Python构建神经网络

动机:为了更加深入的理解深度学习,我们将使用 python 语言从头搭建一个神经网络,而不是使用像 Tensorflow 那样的封装好的框架。我认为理解神经网络的内部工作原理,对数据科学家来说至关重要。

这篇文章的内容是我的所学,希望也能对你有所帮助。

神经网络是什么?

介绍神经网络的文章大多数都会将它和大脑进行类比。如果你没有深入研究过大脑与神经网络的类比,那么将神经网络解释为一种将给定输入映射为期望输出的数学关系会更容易理解。

神经网络包括以下组成部分

? 一个输入层,x

? 任意数量的隐藏层

? 一个输出层,?

? 每层之间有一组权值和偏置,W and b

? 为隐藏层选择一种激活函数,σ。在教程中我们使用 Sigmoid 激活函数

下图展示了 2 层神经网络的结构(注意:我们在计算网络层数时通常排除输入层)

2 层神经网络的结构

用 Python 可以很容易的构建神经网络类

训练神经网络

这个网络的输出 ? 为:

你可能会注意到,在上面的等式中,输出 ? 是 W 和 b 函数。

因此 W 和 b 的值影响预测的准确率. 所以根据输入数据对 W 和 b 调优的过程就被成为训练神经网络。

每步训练迭代包含以下两个部分:

? 计算预测结果 ?,这一步称为前向传播

? 更新 W 和 b,,这一步成为反向传播

下面的顺序图展示了这个过程:

前向传播

正如我们在上图中看到的,前向传播只是简单的计算。对于一个基本的 2 层网络来说,它的输出是这样的:

我们在 NeuralNetwork 类中增加一个计算前向传播的函数。为了简单起见我们***设偏置 b 为0:

但是我们还需要一个方法来评估预测结果的好坏(即预测值和真实值的误差)。这就要用到损失函数。

损失函数

常用的损失函数有很多种,根据模型的需求来选择。在本教程中,我们使用误差平方和作为损失函数。

误差平方和是求每个预测值和真实值之间的误差再求和,这个误差是他们的差值求平方以便我们观察误差的绝对值。

训练的目标是找到一组 W 和 b,使得损失函数最好小,也即预测值和真实值之间的距离最小。

反向传播

我们已经度量出了预测的误差(损失),现在需要找到一种方法来传播误差,并以此更新权值和偏置。

为了知道如何适当的调整权值和偏置,我们需要知道损失函数对权值 W 和偏置 b 的导数。

回想微积分中的概念,函数的导数就是函数的斜率。

梯度下降法

如果我们已经求出了导数,我们就可以通过增加或减少导数值来更新权值 W 和偏置 b(参考上图)。这种方式被称为梯度下降法。

但是我们不能直接计算损失函数对权值和偏置的导数,因为在损失函数的等式中并没有显式的包含他们。因此,我们需要运用链式求导发在来帮助计算导数。

链式法则用于计算损失函数对 W 和 b 的导数。注意,为了简单起见。我们只展示了***设网络只有 1 层的偏导数。

这虽然很简陋,但是我们依然能得到想要的结果—损失函数对权值 W 的导数(斜率),因此我们可以相应的调整权值。

现在我们将反向传播算法的函数添加到 Python 代码中

为了更深入的理解微积分原理和反向传播中的链式求导法则,我强烈推荐 3Blue1Brown 的如下教程:

Youtube:

整合并完成一个实例

既然我们已经有了包括前向传播和反向传播的完整 Python 代码,那么就将其应用到一个例子上看看它是如何工作的吧。

神经网络可以通过学习得到函数的权重。而我们仅靠观察是不太可能得到函数的权重的。

让我们训练神经网络进行 1500 次迭代,看看会发生什么。 注意观察下面每次迭代的损失函数,我们可以清楚地看到损失函数单调递减到最小值。这与我们之前介绍的梯度下降法一致。

让我们看看经过 1500 次迭代后的神经网络的最终预测结果:

经过 1500 次迭代训练后的预测结果

我们成功了!我们应用前向和方向传播算法成功的训练了神经网络并且预测结果收敛于真实值。

注意预测值和真实值之间存在细微的误差是允许的。这样可以防止模型过拟合并且使得神经网络对于未知数据有着更强的泛化能力。

下一步是什么?

***的是我们的学习之旅还没有结束,仍然有很多关于神经网络和深度学习的内容需要学习。例如:

? 除了 Sigmoid 以外,还可以用哪些激活函数

? 在训练网络的时候应用学习率

? 在面对图像分类任务的时候使用卷积神经网络

我很快会写更多关于这个主题的内容,敬请期待!

最后的想法

我自己也从零开始写了很多神经网络的代码

虽然可以使用诸如 Tensorflow 和 Keras 这样的深度学习框架方便的搭建深层网络而不需要完全理解其内部工作原理。但是我觉得对于有追求的数据科学家来说,理解内部原理是非常有益的。

这种练习对我自己来说已成成为重要的时间投入,希望也能对你有所帮助

如何自己动手写卷积神经网络代码

没有卷积神经网络的说法,只有卷积核的说法。电脑图像处理的真正价值在于:一旦图像存储在电脑上,就可以对图像进行各种有效的处理。如减小像素的颜色值,可以解决曝光过度的问题,模糊的图像也可以进行锐化处理,清晰的图像可以使用模糊处理模拟摄像机滤色镜产生的柔和效果。用Photoshop等图像处理,施展的魔法几乎是无止境的。四种基本图像处理效果是模糊、锐化、浮雕和水彩。?这些效果是不难实现的,它们的奥妙部分是一个称为卷积核的小矩阵。这个3*3的核含有九个系数。为了变换图像中的一个像素,首先用卷积核中心的系数乘以这个像素值,再用卷积核中其它八个系数分别乘以像素周围的八个像素,最后把这九个乘积相加,结果作为这个像素的值。对图像中的每个像素都重复这一过程,对图像进行了过滤。***用不同的卷积核,就可以得到不同的处理效果。?用PhotoshopCS6,可以很方便地对图像进行处理。模糊处理——模糊的卷积核由一组系数构成,每个系数都小于1,但它们的和恰好等于1,每个像素都吸收了周围像素的颜色,每个像素的颜色分散给了它周围的像素,最后得到的图像中,一些刺目的边缘变得柔和。锐化卷积核中心的系数大于1,周围八个系数和的绝对值比中间系数小1,这将扩大一个像素与之周围像素颜色之间的差异,最后得到的图像比原来的图像更清晰。浮雕卷积核中的系数累加和等于零,背景像素的值为零,非背景像素的值为非零值。照片上的图案好像金属表面的浮雕一样,轮廓似乎凸出于其表面。要进行水彩处理,首先要对图像中的色彩进行平滑处理,把每个像素的颜色值和它周围的二十四个相邻的像素颜色值放在一个表中,然后由小到大排序,把表中间的一个颜色值作为这个像素的颜色值。然后用锐化卷积核对图像中的每个像素进行处理,以使得轮廓更加突出,最后得到的图像很像一幅水彩画。我们把一些图像处理技术结合起来使用,就能产生一些不常见的光学效果,例如光晕等等。希望我能帮助你解疑释惑。

求基于BP神经网络的图像复原算法的matlab代码

function Solar_SAE

tic;

n = 300;

m=20;

train_x = [];

test_x = [];

for i = 1:n

%filename = strcat(['D:\Program Files\MATLAB\R2012a\work\DeepLearn\Solar_SAE\64_64_3train\' num2str(i,'%03d') '.bmp']);

%filename = strcat(['E:\matlab\work\c0\TrainImage' num2str(i,'%03d') '.bmp']);

filename = strcat(['E:\image restoration\3-(' num2str(i) ')-4.jpg']);

b = imread(filename);

%c = rgb2gray(b);

c=b;

[ImageRow ImageCol] = size(c);

c = reshape(c,[1,ImageRow*ImageCol]);

train_x = [train_x;c];

end

for i = 1:m

%filename = strcat(['D:\Program Files\MATLAB\R2012a\work\DeepLearn\Solar_SAE\64_64_3test\' num2str(i,'%03d') '.bmp']);

%filename = strcat(['E:\matlab\work\c0\TestImage' num2str(i+100,'%03d') '-1.bmp']);

filename = strcat(['E:\image restoration\3-(' num2str(i+100) ').jpg']);

b = imread(filename);

%c = rgb2gray(b);

c=b;

[ImageRow ImageCol] = size(c);

c = reshape(c,[1,ImageRow*ImageCol]);

test_x = [test_x;c];

end

train_x = double(train_x)/255;

test_x = double(test_x)/255;

%train_y = double(train_y);

%test_y = double(test_y);

% Setup and train a stacked denoising autoencoder (SDAE)

rng(0);

%sae = saesetup([4096 500 200 50]);

%sae.ae{1}.activation_function = 'sigm';

%sae.ae{1}.learningRate = 0.5;

%sae.ae{1}.inputZeroMaskedFraction = 0.0;

%sae.ae{2}.activation_function = 'sigm';

%sae.ae{2}.learningRate = 0.5

%%sae.ae{2}.inputZeroMaskedFraction = 0.0;

%sae.ae{3}.activation_function = 'sigm';

%sae.ae{3}.learningRate = 0.5;

%sae.ae{3}.inputZeroMaskedFraction = 0.0;

%sae.ae{4}.activation_function = 'sigm';

%sae.ae{4}.learningRate = 0.5;

%sae.ae{4}.inputZeroMaskedFraction = 0.0;

%opts.numepochs = 10;

%opts.batchsize = 50;

%sae = saetrain(sae, train_x, opts);

%visualize(sae.ae{1}.W{1}(:,2:end)');

% Use the SDAE to initialize a FFNN

nn = nnsetup([4096 1500 500 200 50 200 500 1500 4096]);

nn.activation_function = 'sigm';

nn.learningRate = 0.03;

nn.output = 'linear'; % output unit 'sigm' (=logistic), 'softmax' and 'linear'

%add pretrained weights

%nn.W{1} = sae.ae{1}.W{1};

%nn.W{2} = sae.ae{2}.W{1};

%nn.W{3} = sae.ae{3}.W{1};

%nn.W{4} = sae.ae{3}.W{2};

%nn.W{5} = sae.ae{2}.W{2};

%nn.W{6} = sae.ae{1}.W{2};

%nn.W{7} = sae.ae{2}.W{2};

%nn.W{8} = sae.ae{1}.W{2};

% Train the FFNN

opts.numepochs = 30;

opts.batchsize = 150;

tx = test_x(14,:);

nn1 = nnff(nn,tx,tx);

ty1 = reshape(nn1.a{9},64,64);

nn = nntrain(nn, train_x, train_x, opts);

toc;

tic;

nn2 = nnff(nn,tx,tx);

toc;

tic;

ty2 = reshape(nn2.a{9},64,64);

tx = reshape(tx,64,64);

tz = tx - ty2;

tz = im2bw(tz,0.1);

%imshow(tx);

%figure,imshow(ty2);

%figure,imshow(tz);

ty = cat(2,tx,ty2,tz);

montage(ty);

filename3 = strcat(['E:\image restoration\3.jpg']);

e=imread(filename3);

f= rgb2gray(e);

f=imresize(f,[64,64]);

%imshow(ty2);

f=double (f)/255;

[PSNR, MSE] = psnr(ty2,f)

imwrite(ty2,'E:\image restoration\bptest.jpg','jpg');

toc;

%visualize(ty);

%[er, bad] = nntest(nn, tx, tx);

%assert(er 0.1, 'Too big error');

卷积神经网络之GAN(附完整代码)

不管何种模型,其损失函数(Loss Function)选择,将影响到训练结果质量,是机器学习模型设计的重要部分。对于判别模型,损失函数是容易定义的,因为输出的目标相对简单。但对于生成模型,损失函数却是不容易定义的。

GAN算法原理:

1)G是一个生成图片的网络,它接收一个随机的噪声z,通过这个噪声生成图片,记做G(z)。

3)在最理想的状态下,G可以生成足以“以***乱真”的图片G(z)。对于D来说,它难以判定G生成的图片究竟是不是真实的,因此D(G(z)) = 0.5。

4)这样目的就达成了:得到了一个生成式的模型G,它可以用来生成图片。

在训练过程中,生成网络G的目标就是尽量生成真实的图片去欺骗判别网络D。而判别网络D的目标就是尽量把G生成的图片和真实的图片分别开来。这样,G和D构成了一个动态的“博弈过程”。

2.再以理论抽象进行说明:

GAN是一种通过对抗过程估计生成模型的新框架。框架中同时训练两个模型:捕获数据分布的生成模型G,和估计样本来自训练数据的概率的判别模型D。G的训练程序是将D错误的概率最大化。可以证明在任意函数G和D的空间中,存在唯一的解决方案,使得G重现训练数据分布,而D=0.5(D判断不出真***,50%概率,跟抛硬币决定一样)。在G和D由多层感知器定义的情况下,整个系统可以用反向传播进行训练。在训练或生成样本期间,不需要任何马尔科夫链或展开的近似推理网络。实验通过对生成的样品的定性和定量评估,证明了GAN框架的潜在优势。

Goodfellow从理论上证明了该算法的收敛性。在模型收敛时,生成数据和真实数据具有相同分布,从而保证了模型效果。

GAN公式形式如下:

1)公式中x表示真实图片,z表示输入G网络的噪声,G(z)表示G网络生成的图片;

2)D(x)表示D网络判断图片是否真实的概率,因为x就是真实的,所以对于D来说,这个值越接近1越好。

3)G的目的:D(G(z))是D网络判断G生成的图片的是否真实的概率。G应该希望自己生成的图片“越接近真实越好”。也就是说,G希望D(G(z))尽可能得大,这时V(D, G)会变小。因此公式的最前面记号是min_G。

4)D的目的:D的能力越强,D(x)应该越大,D(G(x))应该越小。这时V(D,G)会变大。因此式子对于D来说是求最大max_D。

GAN训练过程:

GAN通过随机梯度下降法来训练D和G。

1)首先训练D,D希望V(G, D)越大越好,所以是加上梯度(ascending)

2)然后训练G时,G希望V(G, D)越小越好,所以是减去梯度(descending);

GAN训练具体过程如下:

GAN算法优点:

1)使用了latent code,用以表达latent dimension、控制数据隐含关系等;

2)数据会逐渐统一;

3)不需要马尔可夫链;

4)被认为可以生成最好的样本(不过没法鉴定“好”与“不好”);

5)只有反向传播被用来获得梯度,学习期间不需要推理;

6)各种各样的功能可以被纳入到模型中;

7)可以表示非常尖锐,甚至退化的分布。

GAN算法缺点:

1)Pg(x)没有显式表示;

2)D在训练过程中必须与G同步良好;

3)G不能被训练太多;

4)波兹曼机必须在学习步骤之间保持最新。

GAN的应用范围较广,扩展性也强,可应用于图像生成、数据增强和图像处理等领域。

1)图像生成:

目前GAN最常使用的地方就是图像生成,如超分辨率任务,语义分割等。

2)数据增强:

用GAN生成的图像来做数据增强。主要解决的问题是a)对于小数据集,数据量不足,可以生成一些数据;b)用原始数据训练一个GAN,GAN生成的数据label不同类别。

GAN生成式对抗网络是一种深度学习模型,是近年来复杂分布上无监督学习最具有前景的方法之一,值得深入研究。GAN生成式对抗网络的模型至少包括两个模块:G模型-生成模型和D模型-判别模型。两者互相博弈学习产生相当好的输出结果。GAN算法应用范围较广,扩展性也强,可应用于图像生成、数据增强和图像处理等领域。

图神经网络和超图神经网络在多标签分类中的优势对比

在目前的基于图结构的多标签图像分类方法中,图神经网络和超图神经网络都是用于学习多标签之间的标签依赖关系的方法。那么这两种方法在学习标签之间的依赖关系上有什么对比优势?本文尝试简要分析。

首先需要简单介绍图神经网络和超图神经网络的网络结构:

1.图神经网络

对于每个标签类别,首先通过外部知识(通常是通过词向量模型)获取初始的词向量,每个标签类别作为图中的一个结点,结点的初始表示就是对应的标签的词向量。然后,通过公式:

超图神经网络与图神经网络很不同的一点是他的结构表示。超图的矩阵表示和图不一样,不再是结点和结点的关系,而是边和结点的关系。即每条边有几个结点,或者说当前结点属于哪几条边。而且,超图神经网络的卷积过程相比图神经网络的复杂:

图卷积神经网络的数学原理详解——笔记(更新中)

Image是Graph在欧式空间中的一种特例。Graph是相较于Image来说更加广义的一种拓扑结构。Graph由点和边组成它可以表示任意的事物与事物之间的关系。而Image是表示在欧式空间中的事物与事物之间的关系。我们可以根据Image来构建对应的Graph,将每一个像素作为节点,像素之间的关系作为边。

现实生活中能够建图的场景非常之多,社交关系,词汇搜索等等。

图神经网络就是专门用来处理图数据的神经网络架构。具体来说,会给定图的每个邻接矩阵和节点特征,通过将这两个输入进行某种图上的映射。从而得到每个节点下一层的特征。

图神经网络的聚合模式:

合理性:比如社交网络中我们想要获得某一个用户的特征,可以搜集与他相近的人的特征,他们会具有一定的相关性。(近朱者赤,近墨者黑)

许多GNN相关的模型其实都是在设计函数“ f ”

这里我们只讨论简单无向图(图无自环、无重边,边无方向)

公式中的 是邻接矩阵+单位矩阵,相当于给每一个节点添加一个自环。 是对角阵+单位阵。表示添加自环后每一个节点的度值。 代表了每一个节点的度的值。对于对角阵求幂,只要对对角线上的每一个元素求幂即可。

是可训练的参数,是对输入的feature进行线性变换。 是非线性的激活函数。

简单理解GCN在做什么:对图的邻接矩阵加了一个自环,做了对称归一化。然后用得到的结果对输入的特征进行聚合。每个节点都聚合到了自己和周边节点加权求和的feature信息。

研究与图的邻接矩阵相关的一些性质的领域。将线性代数研究矩阵性质限定在了研究图的邻接矩阵的范围内。谱图理论是线性代数的子领域。

对于一个矩阵 ,如果有 其中 为标量、 。就称 是 的特征向量, 是A的特征值。

如果一个矩阵是一个实对称阵,那么它一定有N个特征值,对应着N个互相正交的特征向量。

,其中 , 除了对角线上以外其他元素都是0。对角线上的元素都是一个特征值。

半正定矩阵就是所有的特征值都大于等于0。

给定一个矩阵A,左乘x转置,右乘x。 就称为向量x对矩阵A的二次型。

瑞利熵就是一个向量关于矩阵A的二次型与这个向量关于单位矩阵的二次型的比值 。

为什么需要研究瑞利熵:因为其与矩阵的特征值有着密切的联系。如我们***定 是矩阵A的一个特征向量,那么瑞利熵就是矩阵对应的特征值。

因此瑞利熵是我们研究特征值的重要手段。

是图的拉普拉斯矩阵, 。

是拉普拉斯矩阵的对称规范化, 。

与 都是实对称阵。因此他们都有N个特征值和N个互相正交的特征向量。可以分解为上述的 的形式。且这两个矩阵都是半正定的,其特征值都是大于等于0的。

一个更加强的性质: 不仅 而且 。

由上述证明我们得出 的瑞利熵是 的。因此 的特征值也是恒 的。

傅里叶变换其实就是“去研究同一个事物在不同的域之间不同的视角”是怎样的,以及在不同的域之间进行变换。

关于图神经网络基础与前沿代码和图神经网络综述的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

扫码二维码