定义带有格式化输入的自定义深度学习层
如果深度学习工具箱™没有为您的任务提供所需的层,那么您可以使用此示例作为指导定义自己的自定义层。有关内置层的列表,请参见深度学习层列表.
要定义自定义深度学习层,您可以使用本例中提供的模板,该模板将带您完成以下步骤:
命名层-给层一个名字,这样你可以在MATLAB中使用它®.
声明层属性——指定层的属性,包括可学习参数和状态参数。
创建一个构造函数(可选)-指定如何构造层并初始化其属性。如果没有指定构造函数,则在创建时,软件将初始化构造函数
的名字
,描述
,类型
属性与[]
并设置层输入和输出的数量为1。创建初始化函数(可选)-指定软件初始化网络时如何初始化可学习参数和状态参数。如果没有指定初始化函数,则软件在初始化网络时不会初始化参数。
创建前向函数——指定数据在预测时间和训练时间如何通过层向前传递(前向传播)。
创建重置状态函数(可选)-指定如何重置状态参数。
创建反向函数(可选)——指定损失相对于输入数据和可学习参数的导数(反向传播)。如果没有指定向后函数,则向前函数必须支持金宝app
dlarray
对象。
在定义层函数时,可以使用dlarray
对象。使用dlarray
对象允许您标记维度,从而更容易处理高维数据。属性标记哪些维度对应于空间、时间、通道和批处理维度“S”
,“T”
,“C”
,“B”
标签,分别。对于未指定的维度和其他维度,使用“U”
标签。为dlarray
对象的函数在特定维度上操作时,可以通过格式化dlarray
对象,或者使用DataFormat
选择。
使用格式化的dlarray
自定义层中的对象还允许您定义输入和输出具有不同格式的层,例如排列、添加或删除维度的层。例如,您可以定义一个层,该层以该格式的小批量图像作为输入“SSCB”
(空间,空间,通道,批),并输出具有该格式的小批序列“认知行为治疗”
(通道,批次,时间)。使用格式化的dlarray
对象还允许定义可以对具有不同输入格式的数据进行操作的层,例如,支持具有不同格式的输入的层金宝app“SSCB”
(空间,空间,通道,批)和“认知行为治疗”
(通道,批次,时间)。
dlarray
对象还支持自动区分。金宝app因此,如果您的前向函数完全支持金宝appdlarray
对象,然后定义反向函数是可选的。
此示例显示如何创建项目和重塑层,这是生成对抗网络(GANs)中常用的一层,它接受带有格式的噪声数组“CB”
(通道,批)和项目,并将其重塑为一个迷你批量图像的格式“SSCB”
(空间、空间、通道、批处理)使用完全连接、重塑和重新标记操作。
中间层模板
在MATLAB中将中间层模板复制到一个新文件中。这个模板给出了中间层类定义的结构。概述:
可选
属性
用于层属性、可学习参数和状态参数的块。层构造函数。
可选
初始化
函数。的
预测
函数和可选的向前
函数。可选
resetState
具有状态属性的层的函数。可选
落后的
函数。
classdefmyLayer < nnet.layer.Layer%……& nnet.layer. formatable…%(可选)& nnet.layer.Acceleratable %(可选)属性%(可选)图层属性。在这里声明层属性。结束属性(可学的)%(可选)层可学习参数。在这里声明可学习参数。结束属性(状态)%(可选)层状态参数。在这里声明状态参数。结束属性(可学的,状态)%(可选)嵌套dlnetwork对象,两者都可学习%参数和状态参数。在这里用可学习和状态参数声明嵌套网络。结束方法函数图层= myLayer()(可选)创建myLayer。此函数必须与类名称相同。在这里定义层构造函数。结束函数图层=初始化(图层,布局)(可选)初始化层可学习和状态参数。%%的输入:% layer -初始化的层% layout -数据布局,指定为networkDataLayout%的对象%%输出:% layer -初始化层%% -对于有多个输入的图层,将layout替换为% layout1,…,layoutN, where N is the number of inputs.定义层初始化函数。结束函数[Z,状态]=预测(层,X)在预测时间通过层转发输入数据%输出结果和更新状态。%%的输入:% layer -向前传播的层% X -输入数据%输出:% Z -层正向函数的输出% state -(可选)更新后的层状态%% -对于有多个输入的层,将X替换为X1,…,XN,%,其中N是输入的数量。% -对于有多个输出的层,将Z替换为% Z1,…,Z米,在那里米is the number of outputs.% -对于有多个状态参数的层,替换state% with state1,…,状态K,在那里Kis the number of state%的参数。定义层预测函数。结束函数[Z,状态,内存]= forward(层,X)%(可选)训练时通过层向前输入数据并输出结果、更新状态和内存%值。%%的输入:% layer -向前传播的层% X -层输入数据%输出:% Z -层正向函数的输出% state -(可选)更新后的层状态% memory -(可选)自定义向后内存值%的功能%% -对于有多个输入的层,将X替换为X1,…,XN,%,其中N是输入的数量。% -对于有多个输出的层,将Z替换为% Z1,…,Z米,在那里米is the number of outputs.% -对于有多个状态参数的层,替换state% with state1,…,状态K,在那里Kis the number of state%的参数。在这里定义层正向函数。结束函数图层= resetState(图层)%(可选)重置层状态。此处定义重置状态函数。结束函数[dLdX,dLdW,dLdSin] = backward(layer,X,Z,dLdZ,dLdSout,memory)%(可选)反向传播损失的导数%函数通过层。%%的输入:% layer -向后传播的层% X -层输入数据% Z -层输出数据% dLdZ -损失对层的导数%输出% dLdSout -(可选)关于损失的导数状态输出百分比% memory -前向函数的内存值%输出:% dLdX -损失对层输入的导数% dLdW -(可选)损失的导数%可学习参数% dLdSin -(可选)损失的导数%状态输入%% -对于带有状态参数的层,向后语法必须%包括dLdSout和dLdSin,或两者都不包括。% -对于有多个输入的层,将X和dLdX替换为% X1,…,XN而且dLdX1,...,dLdXN, respectively, where N is输入数量的%。% -对于有多个输出的层,将Z和dlZ替换为% Z1,…,Z米而且dLdZ,...,dLdZM, respectively, where M is the输出数的%。% -对于有多个可学习参数的层,替换% dLdW with dLdW1,…,dLdWP, where P is the number of%可学习参数。% -对于有多个状态参数的层,替换dLdSin% and dLdSout with dLdSin1,…、dLdSinK和% dLdSout1,…,dldSoutK, respectively, where K is the number状态参数的%。在这里定义层反向函数。结束结束结束
命名层和指定超类
首先,给图层起一个名字。在类文件的第一行中,替换现有的名称myLayer
与projectAndReshapeLayer
.
classdefprojectAndReshapeLayer < nnet.layer.Layer%……& nnet.layer. formatable…%(可选)& nnet.layer.Acceleratable %(可选)...结束
如果没有指定反向函数,则默认情况下,层函数接收无格式dlarray
对象作为输入。指定该层接收格式化dlarray
对象作为格式化的输入和输出dlarray
对象,也继承自nnet.layer.Formattable
类在定义自定义层时。
由于一个工程和重塑层输出不同维度的数据作为输入数据,即输出增加了空间维度的数据,因此该层也必须继承nnet.layer.Formattable
.这使层能够接收和输出格式化dlarray
对象。
接下来,指定从nnet.layer.Layer
而且nnet.layer.Formattable
超类。该层函数也支持加速,因此也继承自金宝appnnet.layer.Acceleratable
.有关加速自定义层函数的详细信息,请参见自定义层函数加速.
classdefprojectAndReshapeLayer < nnet.layer.Layer...& nnet.layer.Formattable...& nnet.layer.Acceleratable...结束
接下来,重命名myLayer
构造函数中的第一个函数方法
Section),使其具有与层相同的名称。
方法函数图层= projectAndReshapeLayer()…结束...结束
保存图层
保存层类文件在一个新的文件名为projectAndReshapeLayer.m
.文件名必须与层名匹配。要使用该层,必须将文件保存在当前文件夹或MATLAB路径下的文件夹中。
声明属性和可学习参数
属性中声明层属性属性
方法中列出可学习参数,并声明这些参数属性(可学的)
部分。
默认情况下,自定义中间层具有这些属性。中不声明这些属性属性
部分。
财产 | 描述 |
---|---|
的名字 |
层名,指定为字符向量或字符串标量。为层 数组输入时,trainNetwork ,assembleNetwork ,layerGraph ,dlnetwork 函数自动为具有该名称的层分配名称” . |
描述 |
层的单行描述,指定为字符串标量或字符向量。控件中显示该层时,将显示此描述 如果您没有指定层描述,那么软件将显示层类名称。 |
类型 |
层的类型,指定为字符向量或字符串标量。的价值 如果您没有指定层类型,那么软件将显示层类名称。 |
NumInputs |
层的输入数量,指定为正整数。如果您不指定这个值,那么软件将自动设置NumInputs 到InputNames .缺省值为1。 |
InputNames |
输入层的名称,指定为字符向量的单元格数组。如果不指定此值和NumInputs 大于1,则软件自动设置InputNames 来{“三机”,…,“客栈”} ,在那里N 等于NumInputs .默认值为{'在'} . |
NumOutputs |
层的输出数量,指定为正整数。如果您不指定这个值,那么软件将自动设置NumOutputs 到OutputNames .缺省值为1。 |
OutputNames |
输出层的名称,指定为字符向量的单元格数组。如果不指定此值和NumOutputs 大于1,则软件自动设置OutputNames 来{着干活,…,“outM”} ,在那里米 等于NumOutputs .默认值为{“出”} . |
如果该层没有其他属性,则可以省略属性
部分。
提示
如果您正在创建具有多个输入的层,则必须设置NumInputs
或InputNames
层构造函数中的属性。如果您正在创建具有多个输出的层,则必须设置NumOutputs
或OutputNames
层构造函数中的属性。有关示例,请参见定义具有多个输入的自定义深度学习层.
一个项目和重塑层需要一个额外的属性来保存层的输出大小。用name指定一个属性OutputSize
在属性
部分。
属性输出大小OutputSize结束
一个项目和重塑层有两个可学习的参数:完全连接操作的权重和偏差。类中声明这些可学习参数属性(可学的)
节并调用参数权重
而且偏见
,分别。
属性(可学的)%层可学习参数重量偏差结束
创建构造函数
创建构造层和初始化层属性的函数。指定创建该层所需的任何变量作为构造函数的输入。
project和重塑层构造函数需要一个指定层输出大小的输入参数和一个指定层名称的可选输入参数。
在构造函数中projectAndReshapeLayer
,指定所需的输入参数命名outputSize
和可选参数作为名称-值参数NameValueArgs
.在函数的顶部添加注释,解释函数的语法。
函数图层= projectAndReshapeLayer(outputSize,NameValueArgs)% layer = projectAndReshapeLayer(outputSize)创建一个对象的投影和重塑%输入到指定的输出大小。%% layer = projectAndReshapeLayer(outputSize,Name= Name)也%指定层名。...结束
解析输入参数
类解析输入参数参数
块。按照函数语法的顺序列出参数,并指定默认值。然后,从NameValueArgs
输入。
解析输入参数。参数outputSize NameValueArgs。Name =”结束name = NameValueArgs.Name;
初始化图层属性
在构造函数中初始化层属性。替换注释%层构造函数在这里
使用初始化层属性的代码。不要在构造函数中初始化可学习或状态参数,在初始化
函数来代替。
设置的名字
属性设置为输入参数的名字
.
设置层名。层。Name =的名字;
属性为该层提供一行描述描述
层的属性。设置描述描述层的类型和它的大小。
设置层描述。层。描述=“用输出大小投影和重塑图层”+加入(字符串(outputSize));
属性指定层的类型类型
财产。的价值类型
控件中显示该层时显示层
数组中。
设置图层类型。层。类型=“计划与重塑”;
设置图层属性OutputSize
到指定的输入值。
设置输出大小。层。OutputSize = OutputSize;
查看完成的构造函数。
函数图层= projectAndReshapeLayer(outputSize,NameValueArgs)% layer = projectAndReshapeLayer(outputSize)创建一个projectAndReshapeLayer对象,用于投影和%将输入重新塑造为指定的输出大小。%% layer = projectAndReshapeLayer(outputSize,Name= Name)%还指定了层名。解析输入参数。参数outputSize NameValueArgs。Name =”;结束name = NameValueArgs.Name;设置层名。层。Name =的名字;设置层描述。层。Description = "Project and shaping layer with output size " + join(string(outputSize));设置图层类型。层。类型=“计划与重塑”;设置输出大小。层。OutputSize = OutputSize;结束
使用这个构造函数,命令projectAndReshapeLayer([4 4 512],Name="proj");
创建一个项目和重塑层与名称“项目”
它将输入数组投影到512张4 × 4的图像。
命令功能
创建在软件初始化网络时初始化可学习层和状态参数的函数。确保该函数仅在属性为空时初始化可学习参数和状态参数,否则当您从MAT文件加载网络时,软件可能会覆盖。
初始化可学习参数权重
,使用gloot初始化生成一个随机数组。初始化可学习参数偏见
,创建一个通道数与输入数据相同的零向量。只有在权重和偏差为空时才初始化它们。
因为在网络准备好使用之前,输入数据的大小是未知的,所以必须创建一个initialize函数,使用初始化可学习参数和状态参数networkDataLayout
软件提供给函数的对象。网络数据布局对象包含有关预期输入数据的大小和格式的信息。创建一个initialize函数,使用大小和格式信息初始化可学习参数和状态参数,使它们具有正确的大小。
投影和重塑层应用完全连接操作将输入投影到批量图像。使用gloriot初始化初始化权重,并使用一个零数组初始化偏差。的函数initializeGlorot
而且initializeZeros
是否附加到示例中训练生成对抗网络(GAN)作为支金宝app持文件。要访问这些函数,请将此示例作为活动脚本打开。有关为深度学习操作初始化可学习参数的详细信息,请参见初始化模型函数的可学习参数.
函数图层=初始化(图层,布局)% layer = initialize(layer,layout)初始化图层%可学习参数使用指定的输入布局。%层输出大小。outputSize = layer.OutputSize;初始化完全连接权重。如果isempty (layer.Weights)查找通道数。Idx = finddim(布局,“C”);numChannels = layout.Size(idx);使用gloria初始化。sz = [prod(outputSize) numChannels];numOut = prod(outputSize);numIn = numChannels;层。Weights = initializeGlorot(sz,numOut,numIn);结束初始化完全连接偏差。如果isempty (layer.Bias)%用零初始化。层。偏见= initializeZeros([prod(outputSize) 1]);结束结束
创建正向函数
创建在预测时间和训练时间使用的层正向函数。
创建一个名为预测
在层中向前传播数据预测的时间并输出结果。
的预测
函数语法取决于层的类型。
Z = predict(图层,X)
转发输入数据X
通过层并输出结果Z
,在那里层
只有一个输入和一个输出。[Z,状态]=预测(层,X)
还输出更新后的状态参数状态
,在那里层
只有一个状态参数。
您可以调整具有多个输入,多个输出或多个状态参数的层的语法:
对于有多个输入的层,替换
X
与X1,…,XN
,在那里N
是输入的数量。的NumInputs
属性必须匹配N
.对于有多个输出的层,替换
Z
与Z1,…,ZM评选
,在那里米
是输出的数量。的NumOutputs
属性必须匹配米
.对于具有多个状态参数的层,替换
状态
与state1,…,stateK
,在那里K
是状态参数的个数。
提示
如果层的输入数量可以变化,那么使用变长度输入宗量
而不是X1,…,XN
.在这种情况下,变长度输入宗量
是单元格数组的输入,在哪里变长度输入宗量{我}
对应于西
.
如果输出的数量可以变化,那么使用varargout
而不是Z1,…,锌
.在这种情况下,varargout
是单元格数组的输出,在哪里varargout {j}
对应于Zj
.
提示
如果自定义层有dlnetwork
对象获取可学习参数,然后在预测
函数的自定义层,使用预测
函数为dlnetwork
.当你这样做时,dlnetwork
对象预测
函数使用适当的层操作进行预测。如果dlnetwork
具有状态参数,则还返回网络状态。
因为一个项目和重塑层只有一个输入和一个输出,所以预测
对于一个项目和重塑层是Z = predict(图层,X)
.
默认情况下,该层使用预测
为训练时的正向函数。若要在训练时使用不同的前向函数,或保留自定义后向函数所需的值,还必须创建名为向前
.
输入的维度取决于数据的类型和连接层的输出:
层的输入 | 输入的大小 | 观察维度 |
---|---|---|
特征向量 | c——- - - - - -N,在那里c对应于通道数和N是观测的数量 | 2 |
二维图像 | h——- - - - - -w——- - - - - -c——- - - - - -N,在那里h,w,c分别对应图像的高度、宽度和通道数,和N是观测的数量 | 4 |
三维图像 | h——- - - - - -w——- - - - - -d——- - - - - -c——- - - - - -N,在那里h,w,d,c分别对应三维图像的高度、宽度、深度和通道数,和N是观测的数量 | 5 |
向量序列 | c——- - - - - -N——- - - - - -年代,在那里c是序列特征的数量,N是观察数,和年代是序列长度 | 2 |
二维图像序列 | h——- - - - - -w——- - - - - -c——- - - - - -N——- - - - - -年代,在那里h,w,c分别对应图像的高度、宽度和通道数,N是观察数,和年代是序列长度 | 4 |
三维图像序列 | h——- - - - - -w——- - - - - -d——- - - - - -c——- - - - - -N——- - - - - -年代,在那里h,w,d,c分别对应三维图像的高、宽、深、通道数,N是观察数,和年代是序列长度 | 5 |
对于输出序列的层,这些层可以输出任意长度的序列或输出没有时间维度的数据。方法训练输出序列的网络时请注意trainNetwork
函数时,输入和输出序列的长度必须匹配。
因为自定义层继承自nnet.layer.Formattable
类时,层接收格式化dlarray
对象,其标签对应于上一层的输出。
的向前
函数通过的层向前传播数据培训时间并且还输出一个内存值。
的向前
函数语法取决于层的类型:
Z =向前(层,X)
转发输入数据X
通过层并输出结果Z
,在那里层
只有一个输入和一个输出。[Z,状态]= forward(层,X)
还输出更新后的状态参数状态
,在那里层
只有一个状态参数。[__,memory] = forward(layer,X)
还返回自定义的内存值落后的
函数使用前面的任何语法。如果该层同时有一个自定义向前
函数和自定义落后的
函数,则forward函数必须返回一个内存值。
您可以调整具有多个输入,多个输出或多个状态参数的层的语法:
对于有多个输入的层,替换
X
与X1,…,XN
,在那里N
是输入的数量。的NumInputs
属性必须匹配N
.对于有多个输出的层,替换
Z
与Z1,…,ZM评选
,在那里米
是输出的数量。的NumOutputs
属性必须匹配米
.对于具有多个状态参数的层,替换
状态
与state1,…,stateK
,在那里K
是状态参数的个数。
提示
如果层的输入数量可以变化,那么使用变长度输入宗量
而不是X1,…,XN
.在这种情况下,变长度输入宗量
是单元格数组的输入,在哪里变长度输入宗量{我}
对应于西
.
如果输出的数量可以变化,那么使用varargout
而不是Z1,…,锌
.在这种情况下,varargout
是单元格数组的输出,在哪里varargout {j}
对应于Zj
.
提示
如果自定义层有dlnetwork
对象获取可学习参数,然后在向前
函数的自定义层,使用向前
的功能dlnetwork
对象。当你这样做时,dlnetwork
对象向前
函数使用适当的层操作进行训练。
项目和重塑操作包括三个操作:
应用与可学习权重和偏差完全连接的操作。
将输出重新塑造为指定的输出大小。
重新标记维度,以便输出具有格式
“SSCB”
(空间、空间、通道、批次)
中实现此操作预测
函数。该项目和重塑层不需要内存或不同的前向功能进行训练,因此可以删除向前
函数。在函数的顶部添加注释,解释函数的语法。
函数Z = predict(图层,X)在预测时间通过层转发输入数据%输出结果。%%的输入:% layer -向前传播的层% X -输入数据,指定为格式化的数组%,使用'C'和可选的'B'维度。%输出:% Z -层前向函数的输出返回为%格式为“SSCB”的格式化数组。%完全连接。weights = layer.Weights;bias = layer.Bias;X = fulllyconnect (X,权重,偏差);%重塑。outputSize = layer.OutputSize;Z =重塑(X, outputSize(1), outputSize(2), outputSize(3), []);%重新贴标签于。Z = dlarray(Z,“SSCB”);结束
提示
如果使用函数来预分配数组0
,则必须保证这些数组的数据类型与层函数输入一致。若要创建与另一个数组具有相同数据类型的零数组,请使用“喜欢”
选择0
.例如,初始化一个大小为0的数组深圳
使用与数组相同的数据类型X
,使用Z = 0 (sz,"like",X)
.
因为预测
函数只使用支持的函数金宝appdlarray
对象,定义落后的
功能是可选的。获取支持的函数列表金宝appdlarray
对象,看到支持dlarray的函数列表金宝app.
完成一层
查看完成的层类文件。
classdefprojectAndReshapeLayer < nnet.layer.Layer…& nnet.layer.Formattable…& nnet.layer.Acceleratable示例项目和重塑层。属性输出大小OutputSize结束属性(可学的)%层可学习参数重量偏差结束方法函数图层= projectAndReshapeLayer(outputSize,NameValueArgs)% layer = projectAndReshapeLayer(outputSize)创建一个projectAndReshapeLayer对象,用于投影和%将输入重新塑造为指定的输出大小。%% layer = projectAndReshapeLayer(outputSize,Name= Name)%还指定了层名。解析输入参数。参数outputSize NameValueArgs。Name =”;结束name = NameValueArgs.Name;设置层名。层。Name =的名字;设置层描述。层。Description = "Project and shaping layer with output size " + join(string(outputSize));设置图层类型。层。类型=“计划与重塑”;设置输出大小。层。OutputSize = OutputSize;结束函数图层=初始化(图层,布局)% layer = initialize(layer,layout)初始化图层%可学习参数使用指定的输入布局。%层输出大小。outputSize = layer.OutputSize;初始化完全连接权重。如果isempty (layer.Weights)查找通道数。Idx = finddim(布局,“C”);numChannels = layout.Size(idx);使用gloria初始化。sz = [prod(outputSize) numChannels];numOut = prod(outputSize);numIn = numChannels;层。Weights = initializeGlorot(sz,numOut,numIn);结束初始化完全连接偏差。如果isempty (layer.Bias)%用零初始化。层。偏见= initializeZeros([prod(outputSize) 1]);结束结束函数Z = predict(图层,X)在预测时间通过层转发输入数据%输出结果。%%的输入:% layer -向前传播的层% X -输入数据,指定为格式化的数组%,使用'C'和可选的'B'维度。%输出:% Z -层前向函数的输出返回为%格式为“SSCB”的格式化数组。%完全连接。weights = layer.Weights;bias = layer.Bias;X = fulllyconnect (X,权重,偏差);%重塑。outputSize = layer.OutputSize;Z =重塑(X, outputSize(1), outputSize(2), outputSize(3), []);%重新贴标签于。Z = dlarray(Z,“SSCB”);结束结束结束
GPU的兼容性
如果层转发功能完全支持金宝appdlarray
对象,那么该层是GPU兼容的。否则,为了与GPU兼容,层函数必须支持类型的输入和返回输出金宝appgpuArray
(并行计算工具箱).
许多MATLAB内置函数支持金宝appgpuArray
(并行计算工具箱)而且dlarray
输入参数。获取支持的函数列表金宝appdlarray
对象,看到支持dlarray的函数列表金宝app.有关在GPU上执行的函数的列表,请参见在图形处理器上运行MATLAB函数(并行计算工具箱).要使用GPU进行深度学习,还必须有支持GPU的设备。金宝app有关受支持设备的信息,请参见金宝appGPU计算要求(并行计算工具箱).有关在MATLAB中使用gpu的更多信息,请参见MATLAB中的GPU计算(并行计算工具箱).
本例中用到的MATLAB函数预测
所有的支金宝app持dlarray
对象,所以该层是GPU兼容的。
在网络中包含自定义层
为GAN定义以下生成器网络架构,它从随机值的1 × 1 × 100数组生成图像:
这个网络:
属性将大小为100的随机向量转换为7 × 7 × 128的数组项目和重塑层。
使用一系列转置卷积层和ReLU层将生成的数组升级为64 × 64 × 3数组。
将此网络体系结构定义为层图,并指定以下网络属性。
对于转置卷积层,指定5 × 5滤波器,每层滤波器数量递减,步幅为2,并在每条边上裁剪输出。
对于最后的转置卷积层,指定三个5乘5的滤波器,对应于生成图像的三个RGB通道,以及前一层的输出大小。
在网络的末端,包括一个tanh层。
要投影和重塑噪声输入,请使用自定义层projectAndReshapeLayer。
filterSize = 5;numFilters = 64;numLatentInputs = 100;projectionSize = [4 4 512];layergs = [featureInputLayer(numLatentInputs,Normalization= .“没有”) projectAndReshapeLayer (projectionSize);转置conv2dlayer (filterSize,2*numFilters,Stride=2,裁剪=“相同”) reluLayer转置conv2dlayer (filterSize,numFilters,Stride=2,裁剪=“相同”) relullayer转置conv2dlayer (filterSize,3,Stride=2,裁剪=“相同”) tanhLayer);
使用analyzeNetwork
函数检查图层激活的大小和格式。若要分析自定义培训循环工作流的网络,请设置TargetUsage
选项“dlnetwork”
.
analyzeNetwork (layersG TargetUsage =“dlnetwork”)
正如预期的那样,项目和重塑层接受带有格式的输入数据“CB”
(通道,批处理),并以格式输出数据“SSCB”
(空间,空间,通道,批次)。
要使用自定义训练循环训练网络并启用自动区分,请将层数组转换为adlnetwork
对象。
netG = dlnetwork(layersG);
另请参阅
dlarray
|functionLayer
|checkLayer
|setLearnRateFactor
|setL2Factor
|getLearnRateFactor
|getL2Factor
|findPlaceholderLayers
|replaceLayer
|assembleNetwork
|PlaceholderLayer
|networkDataLayout