96SEO 2026-02-23 12:33 24
。

张量是在深度学习算法中表示数据的主要方式。
它们广泛用于在算法执行期间实现输入、输出、参数和内部状态。
初学者文本此文本需要入门级编程背景和对机器学习的基本了解。
张量是在深度学习算法中表示数据的主要方式。
它们广泛用于在算法执行期间实现输入、输出、参数和内部状态。
张量是类似网格的数据结构它概括了任意数量的轴的向量和矩阵的概念。
在机器学习中我们通常使用“维度”这个词而不是“轴”。
张量不同维度的数量也称为张量秩
我们可以用张量执行的更简单的操作是所谓的元素级操作给定两个具有相同维度的操作数张量该操作会产生一个具有相同维度的新张量其中每个系数的值是从操作数中各个元素的二进制评估中获得的
秩张量的系数乘积的图示。
此操作对任何两个张量仍然有效因为它们具有相同的维度。
像矩阵一样我们可以使用张量执行其他更复杂的操作例如矩阵类积、卷积、收缩、约简和无数的几何运算。
在这个故事中我们将学习如何使用特征张量
来执行其中一些张量操作重点介绍对深度学习算法实现最重要的操作。
众所周知本征是一个广泛用于矩阵计算的线性代数库。
除了众所周知的对矩阵的支持之外Eigen
unsupported/Eigen/CXX11/Tensorint
4);my_tensor.setConstant(42);std::cout
4。
我们可以表示如下2x3x4my_tensormy_tensor
\n\n;并在以后使用此内核来执行卷积。
我们将很快在这个故事中介绍卷积。
首先让我们学习如何使用TensorMaps。
但是它不是分配新数据而只是作为参数传递的数据的视图。
检查以下示例Eigen::TensorMapEigen::Tensor
Eigen::TensorMapEigen::Tensorfloat,
col-major。
col-major和row-major是指网格数据如何存储在线性容器中的方式查看维基百科上的这篇文章
Eigen::TensorMap非常有用因为我们可以使用它来节省内存这对于深度学习算法等高要求的应用程序至关重要。
定义了常见的算术重载运算符这使得对张量进行编程非常直观和直接。
例如我们可以加减张量
B.setRandom();Eigen::Tensorfloat,
。
此外我们可以按如下方式使用.exp()sqrt()log()abs()unaryExpr(fun)
API的Google工程师遵循了与Eigen库顶部相同的策略。
这些策略之一也可能是最重要的策略是如何延迟计算表达式的方式。
惰性求值策略包括延迟表达式的实际求值以便将多个链式表达式组合到一个优化的等效表达式中。
因此优化的代码不是逐步计算多个单独的表达式而是只计算一个表达式旨在利用最终的整体性能。
的总和。
实际上该表达式会产生一个知道如何计算的特殊对象。
仅当将此特殊对象分配给实际张量时才会执行实际操作。
换句话说在下面的语句中ABA
C不是实际结果而只是一个知道如何计算的计算对象确实是一个对象。
只有当分配给张量对象类型、、等的对象时才会对其进行评估以提供正确的张量值A
BCEigen::TensorEigen::TensorMapEigen::TensorRef
这样的小型操作没有意义。
但是此行为对于长操作链非常有用在这些操作链中可以在实际评估之前优化计算。
在简历中作为一般准则而不是编写这样的代码A
不同之处在于在前者中实际上是对象而在后面的代码中它们只是惰性计算操作。
CDEigen::Tensor
在恢复中最好使用惰性计算来评估长操作链因为该链将在内部进行优化最终导致更快的执行。
几何运算会产生具有不同维度的张量有时还会产生大小。
这些操作的示例包括、、、
。
reshapepadshufflestridebroadcast
没有操作。
不过我们可以使用以下方法进行模拟transposetransposeshuffle
稍后当我们讨论使用张量的示例时我们将看到一些几何运算的示例。
softmax
归约是一种特殊操作情况它会导致张量的维数低于原始张量。
减少的直观案例是sum()maximum()
在上面的示例中我们缩小了所有尺寸一次。
我们还可以沿特定轴执行缩减。
例如
具有一组预构建的归约操作例如、、、等。
如果任何预构建的操作不适合特定实现我们可以使用提供自定义函子作为参数。
prodanyallmeanreduce(dims,
卷积。
事实上这是必要的因为在本征矩阵中没有内置的矩阵卷积。
幸运的是特征张量
input.setRandom();Eigen::Tensorfloat,
kernel.setRandom();Eigen::Tensorfloat,
在编程深度学习模型时我们使用张量而不是矩阵。
事实证明矩阵可以表示一个或最多二维网格同时我们有更高维度的数据多通道图像或批量寄存器来处理。
这就是张量发挥作用的地方。
Softmax是一种流行的激活功能。
我们在上一个故事中介绍了它的实现。
现在让我们介绍一下实现Eigen::MatrixEigen::Tensor
unsupported/Eigen/CXX11/Tensorauto
dimensions.at(2);Eigen::arrayint,
z.maximum(depth_dim);Eigen::arrayint,
z_max.reshape(reshape_dim);Eigen::arrayint,
max_reshaped.broadcast(bcast);auto
expo_sums.reshape(reshape_dim);auto
sums_reshaped.broadcast(bcast);auto
Softmax。
如果您需要查看Softmax算法请不要犹豫在Medium上再次阅读之前的故事。
现在我们只专注于了解如何使用特征张量来编码我们的深度学习模型。
首先要注意的是该函数实际上并没有计算参数的softmax值。
实际上只挂载一个可以计算softmax的复杂对象。
softmax(z)zsoftmax(z)
的结果分配给类似张量的对象时才会评估实际值。
例如在这里softmax(z)
在这一行之前一切都只是softmax的计算图希望得到优化。
发生这种情况只是因为我们在
可以优化使用更少操作的整个计算从而改善处理和内存使用。
autosoftmax(z)softmax(z)
在结束这个故事之前我想指出和呼吁tensor.reshape(dims)tensor.broadcast(bcast)
z_max.reshape(reshape_dim);Eigen::arrayint,
reshape(dims)是一种特殊的几何运算它生成另一个张量其大小与原始张量相同但尺寸不同。
重塑不会在张量内部更改数据的顺序。
例如
X.setValues({{1,2,3},{4,5,6}});std::cout
不会改变张量秩即维数而只会增加维数的大小。
reshapebroadcast
时也不鼓励使用非浮点张量。
Eigen::Tensorint,...
tensor;默认布局col-major是唯一实际支持的布局。
至少现在我们不应该使用行专业。
最大尺寸数为
张量是机器学习编程的基本数据结构使我们能够像使用常规二维矩阵一样直接地表示和处理多维数据。
在本系列中我们将学习如何仅使用普通和现代C对必须知道的深度学习算法进行编码例如卷积、反向传播、激活函数、优化器、深度神经网络等。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback