一位初学者对Mindspore的一些建议(1)

转载地址:https://bbs.huaweicloud.com/forum/thread-66135-1-1.html

作者:Yesterday

最近开始学习mindspore,发现Mindspore对于一位向量的定义是非常不明确的,导致后续操作非常不方便,所以关于这方面我提一下建议,希望Mindspore的开发部门可以注意一下:

一维向量的默认是行向量还是列向量,在不同的软件库中定义是不同的,然而在Mindspore中,情况却非常奇怪:

  •  Tensor类型如果是一维,在矩阵乘法【P.MatMul()】中既不是行向量也不是列向量,无法直接参与矩阵乘法,必须显式地声明为(N,1)维【列向量】或者(1,N)维【行向量】才能进行乘法运算。但是矩阵加法中一维向量默认是行向量,可以按行向量进行加法运算。此外transpose函数也无法直接作用于一维向量,不能用transpose函数在行向量和列向量之间进行转换

  • = Tensor(np.random.randn(3,3),mindspore.float32)

    = Tensor(np.arange(1,4)),mindspore.float32)

    xr = Tensor(np.arange(1,4).reshape((1,3)),mindspore.float32) # 行向量

    xc = Tensor(np.arange(1,4).reshape((3,1)),mindspore.float32) # 列向量

    mm=P.MatMul()

    mm(xr,W) # 可执行

    mm(W,xc) # 可执行

    # mm(W,x) 报错

    # mm(x,W) 报错

    b  = Tensor(np.random.randn(3),mindspore.float32)

    br = Tensor(np.random.randn(1,3),mindspore.float32)

    bc = Tensor(np.random.randn(3,1),mindspore.float32)

    x+b   # (3)维向量

    x+br  # (1,3)维向量

    x+bc  # (3,3)维矩阵,广播机制

    xr+b  # (1,3)维向量

    xr+br # (1,3)维向量

    xr+bc # (3,3)维矩阵,广播机制

    xc+b  # (3,3)维矩阵,广播机制

    xc+br # (3,3)维矩阵,广播机制

    xc+bc # (3,1)维向量

    T=P.Transpose()

    # T(x,(1,0)) 报错

    T(xr,(1,0)) # 可执行,得(3,1)维向量

    T(xc,(1,0)) # 可执行,得(1,3)维向量

  •  如果从二维的矩阵中提取单独一行或者单独一列,提取之后都会变成一维向量,无法进行矩阵乘法运算,而加法运算中无论提取的是行是列都会按行向量进行计算。提取的时候必须用P.Reshape()转换为行向量((1,N)维)或列向量((N,1)维)才能保持

  •  从二维的矩阵中提取出单独的每一行行或每一列之后,如果想要将其用concat再组装回去,也必须先将每一行或者每一列转化为(1,N)维或 (N,1)维才能使用concat函数

  • = Tensor(np.arange(1,13).reshape((3,4),order='F'),mindspore.float32)

  • [[ 1.  4.  7. 10.]

     [ 2.  5.  8. 11.]

     [ 3.  6.  9. 12.]]

  • va=[]

    reshape=P.Reshape()

    # 按列读取,对每一列进行单独的操作

    for in  range(4):

        # 这里如果不用reshape,aa就会变成(3)维向量,a[i,:]则是(4)维向量

        aa=reshape(a[:,i],(3,1))

        aa*=i+1

        va.append(aa)

    # 将处理后的每一列拼接会原来维度的矩阵

    concat=P.Concat(axis=1)

    concat(tuple(va)) # 前面如果不reshape这里会报错

  • [[ 1.  8. 21. 40.]

     [ 2. 10. 24. 44.]

     [ 3. 12. 27. 48.]]

综上所述,Mindspore中一维向量的不明确导致后续操作非常麻烦。其他的库一般都有明确定义,例如我之前一直使用的DyNet(C++版)中所有一维向量默认是列向量,(N)维和(N,1)维的定义是完全等价的,这样从(N,M)维的矩阵中如果抽出某一行就是(1,M)维,抽出某一列就是(N,1)维【等价于(N)维】。提取出行或列之后,可以直接用concatenate函数拼接回原来的二维矩阵。更重要的是,一维向量可以直接参与二维矩阵的运算,也可以用transpose函数在行和列之间进行切换,这样时候起来会方便很多。

所以建议Mindspore明确一下一维向量的定义,并且和高维Tensor兼容,这样一维向量不需要reshape就可以直接参与矩阵运算。最好设置一个默认值,但是在声明的时候定义的时候可以按照自己的需求设定是行向量还是列向量。而且如果直接用M[:,i]或着M[i,:]提取矩阵的某一行或列的话,也会使维度降到一维,这样也是很不方便,当然为了兼容Python这一点我也不是不能理解,但是我觉得可以另外设置一个算子(比如DyNet里面有select_rows和select_cols函数),从矩阵中提取行或者列的时候保持形状不变。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
作为一个Python初学者,我有几个建议可以帮助你入门和提高你的编程技能: 1. 学习基础知识:首先,了解Python的基本语法、数据类型、流程控制和函数等基础知识。可以通过阅读教程、参考书籍或在线学习资源来掌握这些知识。 2. 实践编程:实践是学习编程的关键。尝试编写简单的程序,解决一些小问题。通过实践,你可以更好地理解和应用所学的概念,并逐渐增加你的编程经验。 3. 使用合适的学习资源:选择一些优质的学习资源,如教程、在线课程、练习题等。这些资源可以帮助你系统地学习Python,并提供练习和实例以加深理解。 4. 阅读和分析代码:阅读其他人编写的Python代码是提高自己编程能力的好方法。通过看别人的代码,你可以学习新的技巧和方法,并了解行业中常用的编码风格和设计模式。 5. 利用社区资源:Python有一个庞大而活跃的社区,有许多论坛、博客和开源项目可以提供帮助和支持。参与其中,向其他有经验的开发者寻求帮助,分享你的问题和见解。 6. 解决问题和项目实践:挑战自己解决一些实际问题或完成一些小项目。通过实际的应用,你可以更好地理解Python编程,并锻炼解决问题的能力。 7. 注重代码质量和规范:学习良好的编码习惯和规范,编写干净、可读性强的代码。这将有助于提高代码的可维护性和可重用性,并使你的代码更易于理解和共享。 最重要的是,保持持续的学习和实践。编程是一门实践性很强的技能,通过不断地学习、练习和探索,你可以不断提升自己的编程能力。祝你在学习Python的过程中取得成功!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值