classdef Linear_0521
% 这个类的作用是,构建起线性变换的查名、随机初始化、正向传播、反向传播、反函数等功能
properties
class_name; % 记录这个类的名字
class_type; % 类的类型,分为激活函数、处理函数(线性和卷积等)、损失函数
from_I; % 记录要经过线性变换的向量的维数
to_J; % 记录经过线性变换后的向量的维数
W_JI; % 记录线性变换的权重矩阵
B_J; % 记录线性变换的偏置
B_yes; % 记录线性变换是否存在偏置,为真则存在,为假则不存在
W_grad; % 记录权重矩阵的导数
B_grad; % 记录偏置向量的倒数
A_Ibs; % 记录前一层的激活值,方便求导的时候用.size是from_I*batchsize。是已经经过求平均值的
end
methods
% 下面是构造函数
function obj = Linear_0521(from_I, to_J, B_yes)
% A_yes是可选参数,默认为True
% A_yes为True代表有偏置。为False代表无偏置
if(nargin < 3)
B_yes = true;
end
obj.class_name = 'linear_layer';
obj.class_type = 'manipulation_layer';
obj.from_I = from_I;
obj.to_J = to_J;
obj.B_yes = B_yes;
% 下面,初始化偏置向量及其导数
if(obj.B_yes)
obj.B_J = zeros(obj.to_J, 1);
obj.B_grad = zeros(obj.to_J, 1);
else
obj.B_J = nan;
obj.B_grad = nan;
end
% 下面,初始化权重矩阵及其导数
obj.W_JI = zeros(obj.to_J, obj.from_I);
obj.W_grad = zeros(obj.to_J, obj.from_I);
end
% 下面是随机初始化函数
function obj = random_init(obj, type)
% 这个函数的作用是根据type随机初始化权重和偏置
if(strcmp(type, 'normal'))
% 如果是正态分布的话就正太初始化
obj.W_JI = normrnd(0.5, 0.5, [obj.to_J, obj.from_I]);
if(obj.B_yes)
obj.B_J = normrnd(0.5, 0.5, [obj.to_J, 1]);
end
else
disp('没有这种初始化方式!')
return;
end
end
% 下面是正向传播函数
function [obj, output] = forward(obj, input)
% 这个函数的作用是求解线性函数前向计算
% 这里的input应该是前一层的激活值或者是样本值
% 这里的output应该是这一层尚未经过激活的Z值
% obj.A_I = mean(input, 2); % 记录输入的均值
obj.A_Ibs = input; % 为后面的backward做准备
in_size = size(input);
if(max(size(in_size)) >2)
% 如果输入的维数超过2维
disp('输入的维数超过2维!');
return;
end
if(in_size(1) ~= obj.from_I)
if(in_size(2) == obj.from_I)
input = input';
else
disp('输入的维数不匹配');
return;
end
end
output = obj.W_JI * input; % 此时output已经是J*batchsize了
if(obj.B_yes)
% 如果偏置存在还要加上偏置
out_size = size(output);
for i = 1:out_size(2)
output(:, i) = output(:, i) + obj.B_J;
end
end
end
% 下面是反向传播函数
function [obj, output] = backward(obj, input)
% 这个函数的作用是,计算反向传播的值,并将其存储在grad中
% 其中,input是这一层的Z值(也就是下一步就要进行激活操作的值)的残差,size是to_J*batchsize的
% 其中,output是上一层的激活值的残差,是from_I*batchsize的
% 要计算的是权重和偏置的残差,并存储在相应的grad里面
in_size = size(input);
for bs = 1:in_size(2)
for j = 1:obj.to_J
obj.W_grad(j, :) = obj.W_grad(j, :) + (obj.A_Ibs(:, bs))'*input(j, bs)/in_size(2);
end
end
if(obj.B_yes)
obj.B_grad = obj.B_grad + mean(input, 2);
end
% 接下来是要求解上一层激活值的残差了
output = input'*obj.W_JI;
output = output'; % output的size是I*batchsize
end
% 下面是计算反函数的函数
function output = anti_function(obj, input)
% 这个函数的作用是求解反函数
% input指当前层的待激活值Z值,size为J*batchsize
% output指上一层的激活值,size为I*batchsize
in_size = size(input);
for bs = 1:in_size(2)
input(:, bs) = input(:, bs) - obj.B_J;
end
output = pinv(obj.W_JI)*input;
end
% 下面是更新权重和偏置的函数
function obj = update_grad(obj, learning_speed)
% 这个函数的作用是更新权重
% learning_speed指代学习率
if(nargin < 2)
learning_speed = 0.02; % 学习率默认是0.02
end
obj.W_JI = obj.W_JI - obj.W_grad .* learning_speed;
if(obj.B_yes)
obj.B_J = obj.B_J - obj.B_grad .* learning_speed;
end
end
% 下面是重置权重和偏置的导数的函数
function obj = set_zero(obj)
% 这个函数的作用是将各个权重的导数置为0
obj.W_grad = zeros(obj.to_J, obj.from_I);
if(obj.B_yes)
obj.B_grad = zeros(obj.to_J, 1);
end
end
end
end
没有合适的资源?快使用搜索试试~ 我知道了~
预测-AE-1.rar
共22个文件
m:22个
需积分: 5 0 下载量 189 浏览量
2024-03-29
16:10:30
上传
评论
收藏 16KB RAR 举报
温馨提示
预测-AE-1.rar
资源推荐
资源详情
资源评论
收起资源包目录
AE-1.rar (22个子文件)
AE-1
testBP.m 3KB
sparseAutoencoderCost.m 4KB
network_0521.m 3KB
AUC_ROC.m 549B
relu_0521.m 1KB
Linear_0521.m 5KB
train_BP.m 2KB
ReadCsv_TrainSaveAe.m 3KB
train_BP_lzb.m 1KB
testBP_lzb.m 3KB
sigmod_0521.m 1KB
MSEloss_0521.m 2KB
MinGanXing.m 221B
f_del.m 104B
ZhengQueLv.m 221B
PCA.m 350B
MLEloss_0521.m 2KB
sparseloss_0521.m 2KB
test_0521.m 483B
test_encoder_sig.m 287B
Prelu_0521.m 2KB
test_encoder.m 287B
共 22 条
- 1
资源评论
lltanwh
- 粉丝: 226
- 资源: 38
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功