关于Pytorch中双向LSTM的输出表示问题

关于Pytorch中双向LSTM的输出表示问题在使用pytorch的双向LSTM的过程中,我的大脑中蒙生出了一个疑问。双向的lstm的outputs的最后一个状态与hidden,两者之间肯定有所联系,但具体是什么样子的呢?会不会hidden状态存储的就是outputs的最后一个状态,这样的话,岂不是会导致hidden并不能表示整个序列的双向信息吗?带着这个疑问,我开始了实验。具体的实验代码,这里就不放了。直接放实验结果吧。output_size:torch.Size([14,32,100])hidden_size:torch.S

大家好,又见面了,我是你们的朋友全栈君。

在使用pytorch的双向LSTM的过程中,我的大脑中蒙生出了一个疑问。

双向的lstm的outputs的最后一个状态与hidden,两者之间肯定有所联系,
但具体是什么样子的呢?会不会hidden状态存储的就是outputs的最后一个状态,
这样的话,岂不是会导致hidden并不能表示整个序列的双向信息吗?

带着这个疑问,我开始了实验。
具体的实验代码,这里就不放了。直接放实验结果吧。

output_size: torch.Size([14, 32, 100])
hidden_size: torch.Size([2, 32, 50])
output_first: tensor([-0.0690, -0.0778,  0.0967, -0.0504,  0.1404,  0.0873,  0.1073, -0.1513,
        -0.1217,  0.0537,  0.0757,  0.0448, -0.0561, -0.0421, -0.0794, -0.0940,
        -0.0649, -0.1796,  0.0847,  0.0254, -0.1643, -0.0526, -0.0008,  0.0073,
        -0.0754,  0.0036, -0.0565,  0.0092,  0.0123, -0.0529, -0.1597, -0.0077,
        -0.0999, -0.0776, -0.0958,  0.0742, -0.0728,  0.0029, -0.0870,  0.0563,
         0.0162, -0.0016,  0.0380, -0.0483, -0.0513, -0.0948,  0.1770,  0.0280,
         0.0937,  0.0464, -0.0423, -0.1260,  0.0138, -0.0270, -0.2708,  0.0970,
        -0.0236,  0.1324,  0.0953, -0.0506, -0.2078,  0.1213, -0.0621,  0.0084,
         0.0217, -0.0931, -0.0561, -0.1457, -0.1096, -0.0949,  0.0167, -0.0168,
         0.0812, -0.1475,  0.2290,  0.0154,  0.1291,  0.0186,  0.1038, -0.0363,
        -0.1291, -0.0569, -0.0428, -0.0890, -0.0827,  0.0394, -0.2272, -0.0080,
         0.1731, -0.0880, -0.0652, -0.1453, -0.0914,  0.0498,  0.0831,  0.0824,
         0.1725,  0.1072,  0.0176, -0.0160], device='cuda:0',
       grad_fn=<SelectBackward>)
output_end: tensor([-0.1091,  0.0208,  0.0523, -0.1922,  0.1080, -0.0460,  0.0918, -0.0320,
         0.1930, -0.1266,  0.1744, -0.0021, -0.1772,  0.1128, -0.1105, -0.0486,
        -0.1082,  0.0427, -0.2161, -0.0804, -0.1955, -0.0580,  0.1070,  0.0856,
         0.0544,  0.1932,  0.0318, -0.1977, -0.1417, -0.1977, -0.0027, -0.1575,
         0.0047, -0.0164,  0.1221,  0.0331, -0.1921,  0.0210,  0.0123,  0.1483,
         0.0109,  0.0044, -0.1512, -0.1795,  0.0544,  0.1051, -0.2025, -0.1051,
        -0.0342,  0.1321, -0.0305, -0.0173,  0.0664, -0.0764, -0.1054, -0.0213,
         0.0215, -0.0251, -0.0674,  0.0949, -0.0855,  0.0422,  0.0701, -0.1804,
         0.1247,  0.0426,  0.0778, -0.0756, -0.0747, -0.1250,  0.0706,  0.0458,
        -0.0114, -0.0088,  0.0573, -0.0144, -0.0143, -0.0633,  0.1355, -0.0049,
         0.0091,  0.0533, -0.0889, -0.0338, -0.0654,  0.0491, -0.0809, -0.0311,
         0.1278, -0.0765, -0.0682, -0.1066,  0.0538, -0.1175, -0.0171,  0.0496,
         0.0258, -0.0646,  0.1396,  0.0468], device='cuda:0',
       grad_fn=<SelectBackward>)
hidden tensor([[-0.1091,  0.0208,  0.0523, -0.1922,  0.1080, -0.0460,  0.0918, -0.0320,
          0.1930, -0.1266,  0.1744, -0.0021, -0.1772,  0.1128, -0.1105, -0.0486,
         -0.1082,  0.0427, -0.2161, -0.0804, -0.1955, -0.0580,  0.1070,  0.0856,
          0.0544,  0.1932,  0.0318, -0.1977, -0.1417, -0.1977, -0.0027, -0.1575,
          0.0047, -0.0164,  0.1221,  0.0331, -0.1921,  0.0210,  0.0123,  0.1483,
          0.0109,  0.0044, -0.1512, -0.1795,  0.0544,  0.1051, -0.2025, -0.1051,
         -0.0342,  0.1321],
        [-0.0423, -0.1260,  0.0138, -0.0270, -0.2708,  0.0970, -0.0236,  0.1324,
          0.0953, -0.0506, -0.2078,  0.1213, -0.0621,  0.0084,  0.0217, -0.0931,
         -0.0561, -0.1457, -0.1096, -0.0949,  0.0167, -0.0168,  0.0812, -0.1475,
          0.2290,  0.0154,  0.1291,  0.0186,  0.1038, -0.0363, -0.1291, -0.0569,
         -0.0428, -0.0890, -0.0827,  0.0394, -0.2272, -0.0080,  0.1731, -0.0880,
         -0.0652, -0.1453, -0.0914,  0.0498,  0.0831,  0.0824,  0.1725,  0.1072,
          0.0176, -0.0160]], device='cuda:0', grad_fn=<SliceBackward>)

上面的实验结果,第一条输出为输出的维度大小,分别是长度,批次和隐藏层大小*2。我们可以看出最后一维的维度值为100,是设置隐藏层大小的两倍。
第二条输出则是我们的隐藏层维度大小,分别是左右两向,批次大小,隐藏层大小。
第三条输出是(第一条数据)从左往右第一个词所对应的表示向量的值,为“序列从左往右第一个隐藏层状态输出”和“序列从右往左最后一个隐藏层状态输出”的拼接。
第四条输出是(第一条数据)从左往右最后一个词所对应的表示向量的值,为“序列从左往右最后一个隐藏层状态输出”和“序列从右往左第一个隐藏层状态输出”的拼接。
第五条输出是隐藏层输出,为“序列从左往右最后一个隐藏层状态输出”和“序列从右往左最后一个隐藏层状态输出”的拼接。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/151100.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 在虚拟机安装ubuntu步骤(安装虚拟机的步骤)

    准备工作VMwareWorkstation15官方下载地址:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evaluation.htmlUbuntu18.04LTS镜像官方下载地址:https://ubuntu.com/download/desktop注:VMwareWorkstation15激…

    2022年4月12日
    480
  • 孙鑫视频教程《Java从入门到精通》学习笔记

    孙鑫视频教程《Java从入门到精通》学习笔记http://www.pconline.com.cn/pcedu/empolder/gj/java/0606/815015.html第一课Java的一些基本概念 11-30日晚上听课笔记++++++++++++++++++++++++++++1、《JAVAweb开发详解》2、《VC++应用详解》JDK,软件开发包。包括J2SE(标准版)J2EE(企业版)J2ME(应用于手机和PDA使用

    2022年5月17日
    36
  • 什么是 Hook 技术

    什么是 Hook 技术一、什么是Hook技术  Hook技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。简单来说,就是把系统的程序拉出来变成我们自己执行代码片段。  要实现钩子函数,有两个步骤:  1.利用系统内部提供的接口,通过实现该接口,然后注入进系统(特定场景下使用)  2.动态代理(使用所有场景)二、Hook技术实现的步骤  Hook技术实现的步骤也分为两步  1.找到ho

    2022年5月13日
    41
  • 苹果消息推送服务教程:第一部分(共2部分)

    苹果消息推送服务教程:第一部分(共2部分)这篇文章还可以在这里找到 英语LearnhowtoaddPushNotificationsintoyouriPhoneapp!这是iOS教程团队的MatthijsHollemans编写的一篇教程,MatthijsHollemans是一个经验丰富的iOS开发者和设计师。在iOS系统中,在后台运行的程序能够进行的操作是非常有限的。这种限制

    2022年7月12日
    27
  • TCP-三次握手

    TCP-三次握手文章目录三次握手三次握手过程详解三次握手的状态变化面试题:四次挥手三次握手简单示意图:客户端–发送带有SYN标志的数据包–一次握手–服务端服务端–发送带有SYN/ACK标志的数据包–二次握手–客户端客户端–发送带有带有ACK标志的数据包–三次握手–服务端SYN同步序列编号(SynchronizeSequenceNumbers):是TCP/IP建立连接时使用的握手信号。在客户机和服务器之间建立正常的TCP网络连接时,客户机首先发出一个SYN消息,服务器使用SYN

    2022年10月3日
    2
  • git删除本地分支和远程分支_git删除远程分支

    git删除本地分支和远程分支_git删除远程分支git上面的分支开发完成以后,完成了他的历史使命,就可以删除了。1.删除本地分支查看本地分支gitbranchadd_jvm_config_and_exception_loghdfs_config_in_zk*mastersubBucket删除已经merge的本地分支gitbranch-dadd_jvm_config_and_exception_log…

    2022年10月9日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号