鱼C论坛

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

转换张量形状时遇到报错

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

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

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

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


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

  6. 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.
复制代码
小甲鱼最新课程 -> https://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` 的每个元素的形状和长度。例如:
  
  1. for i, item in enumerate(pre_valid):
  2.        print(f"Index {i}, Length: {len(item)}")
复制代码


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


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

如果要把pre_valid转化为一维数组怎么做
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

  1. import numpy as np

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

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

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


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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

  6. 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.
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

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

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


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

  8.    flatten_list(pre_valid)
复制代码


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

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-18 16:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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