离散型Hopfield神经网络在联想和识别上的应用

2023-10-29 11:59

本文主要是介绍离散型Hopfield神经网络在联想和识别上的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、离散型Hopfield处理数字图片,并比较外积法直接求得的网络和通过自带工具箱newhop函数创建的网络有何不同

程序如下:

clear

clc

load data1 array_one

load data2 array_two

%这里加载的两个数组都是10X10的数组,里面的值为-1和+1两种情况。据目前对离散型Hopfield的使用,数据都是-1或者+1,因为这个要求和设定激励函数为取符号函数还有能量函数有很大关系。

%这两个数组将会在后面的结果里面显示出来,+1的地方会表示为白色,-1的地方表示为黑色。

T=[array_one;array_two]';%这个地方将两个图片堆叠起来,并进行了转置。至于数据为什么要进行转置上不太清楚。现在T是一个10X20的数组

net=newhop(T);%通过自带的newhop函数创建一个Hopfield网络。

%接下来应该检查T中两组数据是否是在稳定点上,也就是将T中的数据输入到net中,观察输出的数据,是否和T一样,如果一样,就说明两组数据是在稳定点。

[Y,Pf,Af]=sim(net,{10,5},{},T(:,1:10));

%然后观察Y中一共有5个元包,每个元包是一个10X10的数组,就是把T中的第一个数据T(:,1:10)输入net中,经过5步的变化,每一步的结果都放在了对应的元包当中,观察每个元宝中的数组,和T对照会发现完全相同,因为数字1的对称性非常好。

%下面是原始数据和输出结果Y中每个元包中数据的比照

imshow(imresize(T(:,1:10)',20));


imshow(imresize(Y{1}',20));

imshow(imresize(Y{2}',20));

imshow(imresize(Y{3}',20));

imshow(imresize(Y{4}',20));

imshow(imresize(Y{5}',20));


会发现这些图片都一样,说明第一个数据也就是表示1的图片数据是稳定的。

下面看第二组数据的稳定性,观察输出结果和输入结果是否相同:

[Y,Pf,Af]=sim(net,{10,5},{},T(:,11:20));

为了方便,不在显示T中表示2数字的图片,也不再显示5个步骤中没步骤的结果只显示最后一步的结果

imshow(imresize(Y{5}',20));


%然后我们可以看到结果发现输入和输出完全相同,说明目标数据(T中的两组数据是稳定的),然后处理带有噪声的数据。看看net能否联想到目标数据。

noisy_array_one=array_one;
for i = 1:100
    a = rand;
    if a < 0.2
       noisy_array_one(i) = -array_one(i);
    end
end


noisy_array_two=array_two;
for i = 1:100
    a = rand;
    if a < 0.2
       noisy_array_two(i) = -array_two(i);
    end
end

% 在上面的程序中,噪声的比率为20%

%然后比照目标图片,噪声图片,和处理过的噪声图片

noisy_one = {(noisy_array_one)'};
identify_one = sim(net,{10,10},{},noisy_one);%这里面{10,10}中的第二个10代表的是步骤,和前面的5是一个意思
identify_one{10}';
noisy_two = {(noisy_array_two)'};
identify_two = sim(net,{10,10},{},noisy_two);%这里面{10,10}中的第二个10代表的是步骤,和前面的5是一个意思
identify_two{10}';


%% ????????
Array_one = imresize(array_one,20);
subplot(3,2,1)
imshow(Array_one)
title('????(????1)') 
Array_two = imresize(array_two,20);
subplot(3,2,2)
imshow(Array_two)
title('????(????2)') 
subplot(3,2,3)
Noisy_array_one = imresize(noisy_array_one,20);
imshow(Noisy_array_one)
title('????(????1)') 
subplot(3,2,4)
Noisy_array_two = imresize(noisy_array_two,20);
imshow(Noisy_array_two)
title('????(????2)')
subplot(3,2,5)
imshow(imresize(identify_one{10}',20))
title('????(????1)')
subplot(3,2,6)
imshow(imresize(identify_two{10}',20))
title('????(????2)')

结果如下:


因为我们不太清楚运行10步,是否达到了稳定点。所以我们在运行20步试试,如果结果相同,说明在10步的时候就已经达到了稳定点。

 noisy_one = {(noisy_array_one)'};
identify_one = sim(net,{10,20},{},noisy_one);
identify_one{10}';
noisy_two = {(noisy_array_two)'};
identify_two = sim(net,{10,20},{},noisy_two);
identify_two{10}';
Array_one = imresize(array_one,20);
subplot(3,2,1)
imshow(Array_one)
title('????(????1)') 
Array_two = imresize(array_two,20);
subplot(3,2,2)
imshow(Array_two)
title('????(????2)') 
subplot(3,2,3)
Noisy_array_one = imresize(noisy_array_one,20);
imshow(Noisy_array_one)
title('????(????1)') 
subplot(3,2,4)
Noisy_array_two = imresize(noisy_array_two,20);
imshow(Noisy_array_two)
title('????(????2)')
subplot(3,2,5)
imshow(imresize(identify_one{20}',20))
title('????(????1)')
subplot(3,2,6)
imshow(imresize(identify_two{20}',20))
title('????(????2)')

结果如下:


观察发现结果和上一个结果一样,所以网络10步的时候已经到达了稳定点,输出结果为第三行图片。我们通过让网络观察第一行的两个图片,然后对网络输入有噪声的第二行的图片,网络通过联想出了第三行的图片。

这是通过自带的程序newhop函数创建的网络。还有一种简单的方法,通过外积法用目标数据来求取权值的。下面介绍这种方法,并比照结果

接着上面的程序

T = array_two; 


%% ????????????????????
[m,n] = size(T);
w = zeros(m);
for i = 1:n
    w = w + T(:,i) * T(:,i)' - eye(m);
end

noisy_array=noisy_array_two;

v0 = noisy_array;
v = zeros(m,n);
for k = 1:10
    for i = 1:m
        v(i,:) = sign(w(i,:)*v0);
    end
    v0 = v;
end


%% ????
subplot(3,1,1)
t = imresize(T,20);
imshow(t)
title('????')
subplot(3,1,2)
Noisy_array = imresize(noisy_array,20);
imshow(Noisy_array)
title('????')
subplot(3,1,3)
V = imresize(v,20);
imshow(V)
title('????')

结果如下:


通过观察发现,外积法的网络只观察了一组目标数据,按照道理来说联想的结果应该联想的更好一些。但是效果并不怎么理想。还没有用newhop函数创建的网络效果好,newhop函数是封装好的,里面具体实现的机制也不是很清楚,不过可以肯定使用的方法肯定比简单的外积法求取权值高大上的多,外积法求取权值,连阀值都没有(也就是默认为零)

二、一个简单的对二维坐标进行联想的程序

T = [+1 -1; ...
      -1 +1];


%%
% Here is a plot where the stable points are shown at the corners.  All possible
% states of the 2-neuron Hopfield network are contained within the plots
% boundaries.


plot(T(1,:),T(2,:),'r*')
axis([-1.1 1.1 -1.1 1.1])
title('Hopfield Network State Space')
xlabel('a(1)');
ylabel('a(2)');


上图中为目标数据中的两个点,也就是让网络观察的两个点。之后网络会对输入数据向这两个数据联想

net = newhop(T);


%%
% First we check that the target vectors are indeed stable.  We check this by
% giving the target vectors to the Hopfield network.  It should return the two
% targets unchanged, and indeed it does.


[Y,Pf,Af] = net([],[],T);%这一部分就是对目标数据进行验证,看目标数据是否稳定。其实对于这么简单的数据都一样,在这里我就不再显示Y了和T一模一样



a = {rands(2,1)};%这里随机了一个坐标点
[y,Pf,Af] = net({20},{},a);%将a输入网络,并运行20步

record = [cell2mat(a) cell2mat(y)];
start = cell2mat(a);
hold on
plot(start(1,1),start(2,1),'bx',record(1,:),record(2,:))%画出点a在逐步往目标数据联想的过程


color = 'rgbmy';
for i=1:25
   a = {rands(2,1)};
   [y,Pf,Af] = net({20},{},a);
   record=[cell2mat(a) cell2mat(y)];
   start=cell2mat(a);
   plot(start(1,1),start(2,1),'kx',record(1,:),record(2,:),color(rem(i,5)+1))
end

上面的这段程序就是随机找到25个点,并观察这25个点每一步是如何靠近(联想)目标数据的。



三、总结

        虽然第一个程序处理的是二维图片,但是中间逐步变化的过程没有表现出来,其实在我实验的时候,我曾把每一步的结果都画了出来,也就是从原来带有噪声的输入如何逐步向目标的两组数据靠近的,不过碍于篇幅,并没有像第二个程序那么把中间的过程完全显示出来。但是相对来说第一个程序显然是更复杂一点的。因为第一个程序处理的是二维的图像,每组数据有100个数值。第二个程序处理的就相对来说简单了好多。但是遗憾的是一直弄不明白newhop函数是如何求取权值和阀值的。这其实才是问题的真正求解过程。在前一篇博客上描述到求取权值和阀值有多中方法,但是始终不理解newhop具体使用的是哪一种。但是可以看到效果还是非常明显的,非常好的,比简单的外积法求取权值要好的多。唯一美中不足的地方应该就是newhop函数的细节没有弄明白了。

       其实准确的来说,离散型的Hopfield网络并没有识别的能力,不像是SVM和一些其他的神经网络一样,可以做模式识别。它的作用只是联想而已,其实这样的联想可以用在模式识别前的降噪处理。用处还是非常大的。

下篇博客会介绍连续型hopfleld网络在优化旅行商问题上的应用。

这篇关于离散型Hopfield神经网络在联想和识别上的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/300498

相关文章

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

Java Stream 的 Collectors.toMap高级应用与最佳实践

《JavaStream的Collectors.toMap高级应用与最佳实践》文章讲解JavaStreamAPI中Collectors.toMap的使用,涵盖基础语法、键冲突处理、自定义Map... 目录一、基础用法回顾二、处理键冲突三、自定义 Map 实现类型四、处理 null 值五、复杂值类型转换六、处理

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.