MATLAB手动修改神经网络权值的方法

文章目录

  • 一、问题描述
  • 二、解决方法
  • 三、简单的测试


一、问题描述

我在MATLAB上用deepNetworkDesigner做了一个简单的网络:

MATLAB手动修改神经网络权值的方法_第1张图片
现在我想手动修改网络的权值矩阵。
网络的存储格式如下:

网络名称为net,它的格式是1x1 SeriesNetwork,它只有一个元素Layers,格式是5x1Layer。
MATLAB手动修改神经网络权值的方法_第2张图片

net.Layers有5个元素,分别为net.Layers(1,1),net.Layers(2,1),net.Layers(3,1),net.Layers(4,1),net.Layers(5,1)。

MATLAB手动修改神经网络权值的方法_第3张图片
以net.Layers(2,1)为例,它的内容是这样的:

MATLAB手动修改神经网络权值的方法_第4张图片
我想要修改的就是这里的RecurrentWeights,也就是LSTM层四个门的权值矩阵。

首先想到

 net.Layers(2,1).RecurrentWeights = single(zeros(512, 128));

但这是不被允许的,因为这个格式是只读的。

在这里插入图片描述

二、解决方法

在mathworks官网的问答区找到了解决方法,原文:how-to-manually-modify-weights-in-a-seriesnetwork。
即先把SeriesNetwork格式的net保存为struct格式,修改后再加载为SeriesNetwork格式。
代码:

modify_able_net = net.saveobj;

Modified_net = net.loadobj(modify_able_net);

三、简单的测试

clear
clc

load('.\mnist_data_mat\XTest')%加载测试数据
load('.\mnist_data_mat\YTest')
load('.\net_data\net')%加载一个训练好的网络

modify_able_net = net.saveobj;%保存为struct
RecurrentWeights = modify_able_net.Layers(2,1).RecurrentWeights;%要修改的权值
modify_able_net.Layers(2,1).RecurrentWeights = single(zeros(size(RecurrentWeights)));%修改为0
Modified_net = net.loadobj(modify_able_net);%保存为net的格式

Y_pred = classify(Modified_net, XTest);     %使用修改过的网络进行分类
accy = sum(Y_pred == YTest) / length(YTest) %准确度

修改前的RecurrentWeights:

MATLAB手动修改神经网络权值的方法_第5张图片
修改后:

MATLAB手动修改神经网络权值的方法_第6张图片
修改后的网络可以正常地调用classify函数进行推断:

在这里插入图片描述

你可能感兴趣的:(MATLAB,matlab,神经网络)