将TensorFlow代码迁移至PyTorch时遇AttributeError:numpy.ndarray无dim属性
TensorFlow迁移PyTorch时的AttributeError错误修复
报错核心原因:你传入torch.stft的是numpy数组,而非PyTorch张量。torch.stft仅支持操作PyTorch张量对象,numpy数组没有dim()方法,因此触发AttributeError。
具体问题与修复方案
1. 数据类型不匹配:numpy数组直接传入PyTorch函数
在代码In[35]中,你通过np.concatenate生成的Xtrain、Xtest都是numpy.ndarray类型,但transforms函数里的torch.stft要求输入必须是PyTorch张量。
修复代码:
batch_size = 1024 # 先将numpy数组转换为PyTorch张量 Xtrain_tensor = torch.from_numpy(Xtrain) Xtest_tensor = torch.from_numpy(Xtest) # 对张量执行分批处理 Xtrain = torch.concat( [transforms(Xtrain_tensor[batch_size*batch:batch_size*(batch +1)]) for batch in range(len(Xtrain_tensor)//batch_size+1)], axis=0 ) Xtest = torch.concat( [transforms(Xtest_tensor[batch_size*batch:batch_size*(batch +1)]) for batch in range(len(Xtest_tensor)//batch_size+1)], axis=0 )
2. PyTorch语法错误:torch.cast不存在
代码最后两行的torch.cast是TensorFlow专属语法,PyTorch中没有该函数,需替换为PyTorch的类型转换方式:
修复代码:
# 替换原torch.cast写法 Ytrain = torch.from_numpy(Ytrain).to(torch.float32) Ytest = torch.from_numpy(Ytest).to(torch.float32)
额外优化建议
可以在transforms函数开头增加自动类型转换逻辑,避免类似类型错误重复出现:
def transforms(x: torch.Tensor) -> torch.Tensor: """Return Fourrier spectrogram.""" # 自动将numpy数组转为PyTorch张量 if not isinstance(x, torch.Tensor): x = torch.from_numpy(x) spectrograms = torch.stft(x, win_length=32, n_fft=4, hop_length=64) spectrograms = torch.abs(spectrograms) return torch.einsum("...ijk->...jki", spectrograms)
内容的提问来源于stack exchange,提问作者longwild laptop
相关产品推荐
相关产品推荐

