鱼C论坛

 找回密码
 立即注册
查看: 78|回复: 5

转换张量形状时遇到报错

[复制链接]
发表于 2024-11-7 17:16:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
pre = torch.nn.functional.softmax(torch.tensor(np.array(pre_valid).reshape(-1,2),dtype=torch.float32), dim=-1)
result = np.argmax(pre,axis=1)

代码
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[90], line 1
----> 1 pre = torch.nn.functional.softmax(torch.tensor(np.array(pre_valid).reshape(-1),dtype=torch.float32), dim=-1)
      2 result = np.argmax(pre,axis=1)

ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (229,) + inhomogeneous part.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-11-7 17:21:33 | 显示全部楼层
报错是由于 `np.array(pre_valid)` 无法转换为一个一致形状的 NumPy 数组造成的。可能 `pre_valid` 中包含了嵌套的列表或数组,它们的长度不一致。

以下是几个步骤来帮助你解决这个问题:

1. **检查 `pre_valid` 的内容**:确保 `pre_valid` 是一个可以被转换为规则形状(例如矩阵)的列表或数组。
   
2. **统一形状**:如果 `pre_valid` 包含不同长度的序列,请调整每个序列的长度一致。

3. **打印调试**:可以在代码中插入打印语句查看 `pre_valid` 的每个元素的形状和长度。例如:
for i, item in enumerate(pre_valid):
       print(f"Index {i}, Length: {len(item)}")

4. **修正代码**:确保调用 `reshape` 的参数正确。例如,如果你希望转换为二维数组(即有两列),那么可以这样调整代码:
pre_valid = np.array(pre_valid)
   if pre_valid.ndim == 1:
       pre_valid = pre_valid.reshape(-1, 2)
   pre = torch.nn.functional.softmax(torch.tensor(pre_valid, dtype=torch.float32), dim=-1)
   result = np.argmax(pre, axis=1)

5. **考虑数据准备步骤**:如果 `pre_valid` 原本就应该是某个固定结构,在准备这个数据集时确保其形状准确。

通过这些步骤,你应该能够识别并修复导致 `ValueError` 的问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-7 17:24:02 | 显示全部楼层
FishC 发表于 2024-11-7 17:21
报错是由于 `np.array(pre_valid)` 无法转换为一个一致形状的 NumPy 数组造成的。可能 `pre_valid` 中包含 ...

如果要把pre_valid转化为一维数组怎么做
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-7 17:24:15 | 显示全部楼层
Terence888 发表于 2024-11-07 17:24
如果要把pre_valid转化为一维数组怎么做


如果你的目标是将 `pre_valid` 转换为一维数组,可以使用 NumPy 提供的 `flatten()` 方法或 `ravel()` 方法。以下是实现方法:
import numpy as np

# 假设 pre_valid 是一个多维数组
pre_valid = np.array(pre_valid)

# 将它转换为一维数组
pre_valid_1d = pre_valid.flatten()

# 如果希望这个一维数组使用Torch的 Tensor 形式
pre_valid_tensor = torch.tensor(pre_valid_1d, dtype=torch.float32)

### 方法解释:
- `flatten()` 方法返回一个新的一维数组,不修改原数组。
- `ravel()` 方法返回一维数组,但如果可能,它会返回原数组的视图,效率更高。

确保在转换之前检查 `pre_valid` 的数据类型和形状,以避免在创建数组或张量时出现问题。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-7 17:36:28 | 显示全部楼层
FishC 发表于 2024-11-7 17:24
如果你的目标是将 `pre_valid` 转换为一维数组,可以使用 NumPy 提供的 `flatten()` 方法或 `ravel()`  ...

这个方法下去就报错
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[103], line 1
----> 1 pre = torch.nn.functional.softmax(torch.tensor(np.array(pre_valid).flatten(),dtype=torch.float32), dim=-1)
      2 result = np.argmax(pre,axis=1)

ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (229,) + inhomogeneous part.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-7 18:04:46 | 显示全部楼层
Terence888 发表于 2024-11-07 17:36
这个方法下去就报错-------------------------------- ...


这个错误通常意味着 `pre_valid` 中的元素是嵌套的多层序列,并且它们不规则,导致 NumPy 无法将它们展平为一个一致的一维数组。这个问题通常发生在 `pre_valid` 的每个元素不是固定大小的数组或列表。

为了解决这个问题,需要确保 `pre_valid` 中的元素可以整体转换为一个一维数组。以下是一些检查和解决措施:

1. **检查每个元素**:确保 `pre_valid` 中的每个元素都是可以平铺的。比如:
for i, item in enumerate(pre_valid):
       print(f"Element at index {i}: {item}, Type: {type(item)}, Length: {len(item) if hasattr(item, '__len__') else 'N/A'}")

2. **手动展平**:如果 `pre_valid` 的结构是深度嵌套的,可以尝试手动展平成一维列表:
pre_valid_1d = []
   def flatten_list(data):
       for element in data:
           if isinstance(element, (list, np.ndarray)):
               flatten_list(element)
           else:
               pre_valid_1d.append(element)

   flatten_list(pre_valid)

3. **修正数据结构**:确保数据在输入之前就是一致的格式。例如,如果每个元素是二维数据,使用正确的方法组装或处理它们。

4. **转换为 Float**:确保在手动处理的过程中,元素可以转换为 `float` 类型。

如果手动展平仍然报错,问题可能出在数据本身的某些部分不是数字或是无效的数据(例如包含字符串或对象)。这样的话,需要更深入地检查每个元素来确定问题源头。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-4 00:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表