Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Machine learning 使用Conv1D层将keras代码转换为pytorch代码_Machine Learning_Keras_Deep Learning_Pytorch - Fatal编程技术网

Machine learning 使用Conv1D层将keras代码转换为pytorch代码

Machine learning 使用Conv1D层将keras代码转换为pytorch代码,machine-learning,keras,deep-learning,pytorch,Machine Learning,Keras,Deep Learning,Pytorch,我有一些keras代码需要转换成Pytorch。我做了一些研究,但到目前为止,我无法重现我从keras那里得到的结果。我花了很多时间在这上面,非常感谢任何提示或帮助 这是我正在处理的keras代码。输入形状是(None,105768),其中None是批大小,我想对输入应用Conv1D。keras中的期望输出为(无,105) 我试过了,但结果更糟: self.conv1d = nn.Conv1d(768, 1, 1) self.dropout = nn.Dropout(0.2)

我有一些keras代码需要转换成Pytorch。我做了一些研究,但到目前为止,我无法重现我从keras那里得到的结果。我花了很多时间在这上面,非常感谢任何提示或帮助

这是我正在处理的keras代码。输入形状是(None,105768),其中None是批大小,我想对输入应用Conv1D。keras中的期望输出为(无,105)

我试过了,但结果更糟:

    self.conv1d = nn.Conv1d(768, 1, 1)
    self.dropout = nn.Dropout(0.2)
    self.softmax = nn.Softmax()

def forward(self, input):

    x = self.dropout(input)
    x = x.view(x.shape[0],x.shape[2],x.shape[1])  
    x = self.conv1d(x)
    x = torch.squeeze(x, 1)
    x = self.softmax(x)

罪魁祸首是您试图交换输入的维度,因为Keras和PyTorch对维度顺序有不同的约定

x=x.view(x.shape[0],x.shape[2],x.shape[1])
.view()
不交换维度,而是更改数据的哪一部分是给定维度的一部分。你可以将它视为一维数组,然后决定要覆盖多少维。一个例子使它更容易理解

#让我们从一维张量开始
#这就是底层数据在内存中的外观。
x=火炬。阿兰奇(6)
#=>张量([0,1,2,3,4,5])
#使用Keras约定时张量的外观(预期输入)
keras_版本=x.view(2,3)
#=>张量([[0,1,2],
#            [3, 4, 5]])
#垂直不与水平交换,但数据的排列方式不同
#数字仍在从左到右递增
不正确的版本=keras版本。视图(3,2)
#=>张量([[0,1],
#            [2, 3],
#            [4, 5]])
交换需要使用的尺寸

correct\u pytorch\u version=keras\u version.transpose(0,1)
#=>张量([[0,3],
#            [1, 4],
#            [2, 5]])

罪魁祸首是您试图交换输入的维度,因为Keras和PyTorch对维度顺序有不同的约定

x=x.view(x.shape[0],x.shape[2],x.shape[1])
.view()
不交换维度,而是更改数据的哪一部分是给定维度的一部分。你可以将它视为一维数组,然后决定要覆盖多少维。一个例子使它更容易理解

#让我们从一维张量开始
#这就是底层数据在内存中的外观。
x=火炬。阿兰奇(6)
#=>张量([0,1,2,3,4,5])
#使用Keras约定时张量的外观(预期输入)
keras_版本=x.view(2,3)
#=>张量([[0,1,2],
#            [3, 4, 5]])
#垂直不与水平交换,但数据的排列方式不同
#数字仍在从左到右递增
不正确的版本=keras版本。视图(3,2)
#=>张量([[0,1],
#            [2, 3],
#            [4, 5]])
交换需要使用的尺寸

correct\u pytorch\u version=keras\u version.transpose(0,1)
#=>张量([[0,3],
#            [1, 4],
#            [2, 5]])

感谢您的帮助,我已经尝试了转置和重塑,它们给出了类似的结果,并且比视图更好,但是仍然没有达到keras的精度:(我在代码中发现了一个bug。实际上,只需将行更改为x=x。转置(2,1)。非常感谢!!感谢您的帮助,我尝试了转置和重塑,它们给出了类似的结果,并且比视图更好,但是仍然没有达到keras的精度:(我在代码中发现了一个错误。实际上,只需将行更改为x=x。转置(2,1)。非常感谢!!
    self.conv1d = nn.Conv1d(768, 1, 1)
    self.dropout = nn.Dropout(0.2)
    self.softmax = nn.Softmax()

def forward(self, input):

    x = self.dropout(input)
    x = x.view(x.shape[0],x.shape[2],x.shape[1])  
    x = self.conv1d(x)
    x = torch.squeeze(x, 1)
    x = self.softmax(x)