我可以编写没有后向函数的深度学习层吗?
Can I code a deep learning layer without a backward function?
我想创建一个图层来制作前一层(输入层)的两个副本,这是我的代码:
classdef CopyLayer < nnet.layer.Layer
methods
function layer = CopyLayer(numOutputs,name)
% Set number of inputs.
layer.NumOutputs = numOutputs;
% Set layer name.
layer.Name = name;
% Set layer description.
layer.Description = "Make " + numOutputs + ...
" copies of the input layer";
end
function [varargout] = predict(X)
% Layer forward function for prediction goes here.
numOutputs = layer.NumOutputs;
[h,w,c] = size(X);
Z = zeros(h,w,c,numOutputs);
for i= 1 : numOutputs
Z(:,:,:,i) = X;
end
varargout = Z;
end
% function [] = backward()
% end
end
end
当我尝试通过以下方式创建图层时:
layer = CopyLayer(2,'copy');
出现以下错误:
Abstract classes cannot be instantiated. Class 'CopyLayer' inherits
abstract methods or properties but does not implement them.
See the list of methods and properties that 'CopyLayer' must implement
if you do not intend the class to be abstract.
Error in SplitLayer (line 1)
layer = CopyLayer(2,'copy');
我认为是因为不存在后向功能。那是对的吗?我该如何解决这个错误?
错误消息很清楚 -- 如果您习惯于阅读错误消息,并且熟悉摘要 classes。
如果 class 包含尚未以可以实例化的方式定义的元素,则它是抽象的。它们特别旨在成为用户可以填写以获得所需实施细节的模板。 nn.layer.layer
就是这样一个抽象 class.
当您实例化一个抽象 class,但未能定义 每个 模板元素时,结果是另一个抽象 class —— 只是更少"template" 个元素。这就是您所做的:CopyLayer 没有实现 backward
,所以它仍然是抽象的。当你用 layer = CopyLayer(2,'copy')
实例化时,你仍然有开放元素,所以你 不能 从 class 中创建一个具体对象。因此出现错误消息。
您可以通过多种方式解决此问题:
- 实现你自己的层 class,一个甚至没有提到反向传播函数的层。你将有额外的连接工作要做,因为你放弃了从
nn.layer
. 的继承
- 实施
backward
,但让正文不起作用(空)。这将使编译器满意,并给你一个非常无聊(但很快)的反向传播阶段。
感谢 @Prune 先生
修改后的代码如下:
classdef CopyLayer < nnet.layer.Layer
properties
% (Optional) Layer properties.
NumOutputs
end
methods
function layer = CopyLayer(numOutputs,name)
% Set number of inputs.
layer.NumOutputs = numOutputs;
% Set layer name.
layer.Name = name;
% Set layer description.
layer.Description = "Make " + numOutputs + ...
" copies of the input layer";
end
function varargout = predict(layer,X)
numOutputs = layer.NumOutputs;
[h,w,c] = size(X);
Z = zeros(h,w,c,numOutputs);
for i= 1 : numOutputs
Z(:,:,:,i) = X;
end
varargout = Z;
end
function [dLdX] = backward(~,~,~,~,~)
end
end
end
我想创建一个图层来制作前一层(输入层)的两个副本,这是我的代码:
classdef CopyLayer < nnet.layer.Layer
methods
function layer = CopyLayer(numOutputs,name)
% Set number of inputs.
layer.NumOutputs = numOutputs;
% Set layer name.
layer.Name = name;
% Set layer description.
layer.Description = "Make " + numOutputs + ...
" copies of the input layer";
end
function [varargout] = predict(X)
% Layer forward function for prediction goes here.
numOutputs = layer.NumOutputs;
[h,w,c] = size(X);
Z = zeros(h,w,c,numOutputs);
for i= 1 : numOutputs
Z(:,:,:,i) = X;
end
varargout = Z;
end
% function [] = backward()
% end
end
end
当我尝试通过以下方式创建图层时:
layer = CopyLayer(2,'copy');
出现以下错误:
Abstract classes cannot be instantiated. Class 'CopyLayer' inherits abstract methods or properties but does not implement them. See the list of methods and properties that 'CopyLayer' must implement if you do not intend the class to be abstract. Error in SplitLayer (line 1) layer = CopyLayer(2,'copy');
我认为是因为不存在后向功能。那是对的吗?我该如何解决这个错误?
错误消息很清楚 -- 如果您习惯于阅读错误消息,并且熟悉摘要 classes。
如果 class 包含尚未以可以实例化的方式定义的元素,则它是抽象的。它们特别旨在成为用户可以填写以获得所需实施细节的模板。 nn.layer.layer
就是这样一个抽象 class.
当您实例化一个抽象 class,但未能定义 每个 模板元素时,结果是另一个抽象 class —— 只是更少"template" 个元素。这就是您所做的:CopyLayer 没有实现 backward
,所以它仍然是抽象的。当你用 layer = CopyLayer(2,'copy')
实例化时,你仍然有开放元素,所以你 不能 从 class 中创建一个具体对象。因此出现错误消息。
您可以通过多种方式解决此问题:
- 实现你自己的层 class,一个甚至没有提到反向传播函数的层。你将有额外的连接工作要做,因为你放弃了从
nn.layer
. 的继承
- 实施
backward
,但让正文不起作用(空)。这将使编译器满意,并给你一个非常无聊(但很快)的反向传播阶段。
感谢 @Prune 先生
修改后的代码如下:
classdef CopyLayer < nnet.layer.Layer
properties
% (Optional) Layer properties.
NumOutputs
end
methods
function layer = CopyLayer(numOutputs,name)
% Set number of inputs.
layer.NumOutputs = numOutputs;
% Set layer name.
layer.Name = name;
% Set layer description.
layer.Description = "Make " + numOutputs + ...
" copies of the input layer";
end
function varargout = predict(layer,X)
numOutputs = layer.NumOutputs;
[h,w,c] = size(X);
Z = zeros(h,w,c,numOutputs);
for i= 1 : numOutputs
Z(:,:,:,i) = X;
end
varargout = Z;
end
function [dLdX] = backward(~,~,~,~,~)
end
end
end