NetFoldOperator[net]
表示一个网络,其中 net 在输入序列上被折叠,同时保持循环状态.
NetFoldOperator[net,{"outi""in1",…}]
表示一个网络,其中,net 折叠进它的输入,通过把每步的 outi 反馈回下一步的 ini,保持循环状态.
NetFoldOperator[net,feedback,{"const1","const2",…}]
将 net 的输入 consti 作为常量而不是映射.
NetFoldOperator[net,feedback,constants,{"out1",…}]
为指定的输出 outi 返回值序列.
NetFoldOperator
NetFoldOperator[net]
表示一个网络,其中 net 在输入序列上被折叠,同时保持循环状态.
NetFoldOperator[net,{"outi""in1",…}]
表示一个网络,其中,net 折叠进它的输入,通过把每步的 outi 反馈回下一步的 ini,保持循环状态.
NetFoldOperator[net,feedback,{"const1","const2",…}]
将 net 的输入 consti 作为常量而不是映射.
NetFoldOperator[net,feedback,constants,{"out1",…}]
为指定的输出 outi 返回值序列.
更多信息和选项
- NetFoldOperator[net] 等同于 NetFoldOperator[net,{"Output"->"State"}] 并指定称为折叠网 "Output" 的输出回反馈回称之为 "State" 的输入.
- NetFoldOperator[…] 表示一个网络接受一个或多个序列,输出同样长度的一个或多个序列.
- NetFoldOperator[net,{"out1""in1",…}] 接受与 net 一样的输入,除了那些由反馈连接 "outi"->"ini" 给出的 ini.
- NetFoldOperator[net,feedback,constants] 会映射没有在 feedback 或 constants 中指定的任何输入. 所有映射的输入会有同样的长度.
- 常见情况下,net 有两个名为 "Input" 和 "State" 的输入和一个名为 "Output" 的输出,单参数形式 NetFoldOperator[net] 接受一个名为 "Input" 的输入序列 {x1,x2,…,xn},生成名为 "Output" 的状态序列 {s1,s2,…,sn},通过将网络重复应用于 xi 和 si-1 来计算 si ,实际上相当于使用 net[<|"Input"->xi,"State"->si-1|>]. 初始状态 s0 是零组成的数组.
- 在 NetGraph 中,格式 src->NetPort[layer,"state"] 的连接可用于提供 NetFoldOperator 循环状态的初始值. 类似,格式 NetPort[layer,"state"]->dst 的连接可用于获取循环状态的最后值. 如果未连接,这些状态可以用 NetStateObject 跟踪.
- NetFoldOperator[net,{"out1""in1",…}] 对于所有值被反馈的循环端口 ini 有命名的状态端口.
- NetFoldOperator[net,…] 可被看作允许在 net 多个拷贝之间共享权重的一个格式,一个用于被映射的每个序列元素.
- NetFoldOperator[…,"Input"->shape] 允许指定输入形状. shape 的可能格式为:
-
NetEncoder[…] 产生数组的编码器 n 长度为 n 的向量 {n1,n2,…} 维度为 n1×n2×… 的数组 "Varying" 长度变化的向量 {"Varying",n2,n3,…} 第一维度是变的,剩下维度为 n2×n3×… 的向量 - 可包括以下训练参数:
-
LearningRateMultipliers Automatic 网络中可训练数组的学习率乘子 - Options[NetFoldOperator] 给出构建运算器的默认选项的列表. Options[NetFoldOperator[…]] 给出在一些数据上运行运算器的默认选项列表.
- Information[NetFoldOperator[…]] 给出关于该运算器的报告.
- Information[NetFoldOperator[…],prop] 给出 NetFoldOperator[…] 的属性 prop 的值. 可能的属性与 NetGraph 相同.
范例
打开所有单元 关闭所有单元基本范例 (1)
创建一个 "core" 网络,接受一个状态和一个输入,产生一个输出:
core = NetGraph[{Plus}, {{NetPort["Input"], NetPort["State"]} -> 1}]core[<|"Input" -> 3, "State" -> 2|>]创建一个 NetFoldOperator,使用 core 在数组序列上操作:
fold = NetFoldOperator[core]fold[{{1, 2}, {3, 4}, {5, 0}, {6, 1}, {0, 0}}]范围 (6)
avg = NetGraph[{ThreadingLayer[0.1 * #1 + 0.9 * #2&]}, {{NetPort["Input"], NetPort["State"]} -> 1}]avg[<|"Input" -> 0, "State" -> 1|>]用 NetFoldOperator 来创建一个高阶网络,折叠输入序列中的平均值:
fold = NetFoldOperator[avg]fold[{1, 1, 1, 1, 1}]用 NetMapOperator 把 folder 映射到图像的颜色通道上,导致图像的行被累加:
map = NetMapOperator[fold, "Input" -> NetEncoder["Image"], "Output" -> NetDecoder["Image"]]map[[image]]net = NetGraph[{ThreadingLayer[LogisticSigmoid[#1 * Cos[#2 + #3]]&]}, {{NetPort["Input"], NetPort["State"], NetPort["Constant"]} -> 1}, "Input" -> "Real"]fold = NetFoldOperator[net, {"Output" -> "State"}, {"Constant"}]fold[<|"Input" -> {1, 0, -1, -1, 1, 1, 0}, "Constant" -> 0.5|>]创建一个被反馈的具有两个独立状态的网络. 这些状态会被用于提供最后输出序列:
net = NetGraph[{
ThreadingLayer[Tanh[#1 + #2 * Cos[#3]]&], ThreadingLayer[Tanh[#1 - #3 * Sin[#2]]&]}, {{NetPort["Input"], NetPort["A"], NetPort["B"]} -> 1 -> NetPort["X"], {NetPort["Input"], NetPort["A"], NetPort["B"]} -> 2 -> NetPort["Y"]}, "A" -> "Real"]fold = NetFoldOperator[net, {"X" -> "A", "Y" -> "B"}]output = fold[{1, 0, -1, -1, 0, 1}]构建一个网络,使用简单的非线性函数将来自两个序列的元素与循环状态组合在一起:
net = NetGraph[{ThreadingLayer[#1 * #3 + #2&]}, {{NetPort["A"], NetPort["B"], NetPort["State"]} -> 1}, "A" -> "Real"]fold = NetFoldOperator[net]fold[<|"A" -> {1, 0, -1, 0, 1}, "B" -> {1, 1, -1, 0, -1}|>]fold[<|"A" -> {1, 0, -1, 0, 1}, "B" -> {1, 1, -1, 0, -1}|>, NetPort[All, "States"]]创建一个允许设置和获取 NetFoldOperator 初始和最后状态的 NetGraph:
fold = NetFoldOperator[NetGraph[{Plus}, {{NetPort["Input"], NetPort["State"]} -> 1}]]graph = NetGraph[{fold}, {NetPort["InitialState"] -> NetPort[1, "State"], NetPort[1, "State"] -> NetPort["FinalState"]}]graph[<|"Input" -> {{1, 2}, {2, 0}, {3, 1}}, "InitialState" -> {10, 0}|>]%[["FinalState"]] == %[["Output", -1]]如果初始和最终状态不是来自于更大的网络,那么有可能不使用 NetGraph,而使用 NetPort[All,"States"] 来控制这些:
fold[<|"Input" -> {{1, 2}, {2, 0}, {3, 1}}, NetPort[All, "States"] -> <|"State" -> {10, 0}|>|>, {NetPort["Output"], NetPort[All, "States"]}]net = NetGraph[{ThreadingLayer[LogisticSigmoid[#1 * Cos[#2 + #3]]&], ElementwiseLayer[# ^ 2&]}, {{NetPort["Input"], NetPort["State"], NetPort["Constant"]} -> 1, 1 -> {NetPort["Output1"], 2}, 2 -> NetPort["Output2"]}, "Input" -> "Real"]创建一个 NetFoldOperator,指定由 "Output1" 产生循环状态,并且仅返回由 "Output2" 产生的值序列. 同时指定一个常量输入:
fold = NetFoldOperator[net, {"Output1" -> "State"}, {"Constant"}, {"Output2"}]fold@<|"Input" -> {1, 2, 3, 4, 5}, "Constant" -> 4.3|>应用 (1)
基于含有 x 和 y 的字符串创建训练数据,通过比较 x 和 y 的数量得出 Less、Greater 或 Equal. 训练数据由最长为 8 的所有可能的字符串组成:
alphabet = {"x", "y", " "};
inputs = Flatten@Table[StringJoin /@ Tuples[alphabet, n], {n, 1, 8}];
cmpXY[str_] := Switch[Sign[StringCount[str, "x"] - StringCount[str, "y"]], -1, Less, 0, Equal, 1, Greater];
outputs = cmpXY /@ inputs;
trainingData = Thread[inputs -> outputs];
RandomSample[trainingData, 4]//InputForm定义一个 NetGraph,用具有大小为 5 的状态的基本循环层表示在每个时间步骤里执行的计算,同时使用 Ramp 来激活:
core = NetGraph[{LinearLayer[5], LinearLayer[5, "Biases" -> None], TotalLayer[], Ramp}, {NetPort["Input"] -> 1, NetPort["State"] -> 2, {1, 2} -> 3 -> 4}]允许通过将其嵌入到一个 NetFoldOperator 来对一个序列应用该 NetGraph:
foldRNN = NetFoldOperator[core]创建含有之前定义的 NetFoldOperator 的网络,读入一个输入字符串,预测是 Less、Greater 还是 Equal:
net = NetChain[{UnitVectorLayer[], foldRNN, SequenceLastLayer[], LinearLayer[3], SoftmaxLayer[]}, "Input" -> NetEncoder[{"Characters", alphabet}], "Output" -> NetDecoder[{"Class", {Less, Equal, Greater}}]];result = NetTrain[net, trainingData, All, BatchSize -> 64, MaxTrainingRounds -> 100, ValidationSet -> Scaled[0.2]]trained = result["TrainedNet"]trained[{"xxy", "xyy", "xyxy"}]NetMeasurements[trained, trainingData, "Accuracy"]技术笔记
文本
Wolfram Research (2017),NetFoldOperator,Wolfram 语言函数,https://reference.wolfram.com/language/ref/NetFoldOperator.html (更新于 2020 年).
CMS
Wolfram 语言. 2017. "NetFoldOperator." Wolfram 语言与系统参考资料中心. Wolfram Research. 最新版本 2020. https://reference.wolfram.com/language/ref/NetFoldOperator.html.
APA
Wolfram 语言. (2017). NetFoldOperator. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/NetFoldOperator.html 年
BibTeX
@misc{reference.wolfram_2026_netfoldoperator, author="Wolfram Research", title="{NetFoldOperator}", year="2020", howpublished="\url{https://reference.wolfram.com/language/ref/NetFoldOperator.html}", note=[Accessed: 17-October-2026]}
BibLaTeX
@online{reference.wolfram_2026_netfoldoperator, organization={Wolfram Research}, title={NetFoldOperator}, year={2020}, url={https://reference.wolfram.com/language/ref/NetFoldOperator.html}, note=[Accessed: 17-October-2026]}