TypeError: The value of a feed cannot be a tf.Tensor object. Acceptable feed values include Python s

本文介绍了一种在使用TensorFlow实现“字嵌入+LSTM+CRF”的分词任务中遇到的TypeError问题,详细解释了错误原因,并给出了正确的feed_dict参数设置方式。
部署运行你感兴趣的模型镜像

一. 背景

今天继续完成“字嵌入+LSTM+CRF”实现分词的大业, 不过一上来又出现了新的问题。

二. 代码

Chars, vectors, labels = read(path)
vectors = vectors.reshape((batch_size, max_seq_len, 128))
labels = labels.reshape((batch_size, max_seq_len))

with tf.Graph().as_default() as g:
    inputs = tf.placeholder('float', [batch_size, max_seq_len, 128])
    tags = tf.placeholder('float', [batch_size, max_seq_len])
    model = Model(inputs, tags)
    initer = tf.global_variables_initializer()

with tf.Session(graph=g) as sess:
    sess.run(initer)
    train_batch_size = batch_size * 0.9
    test_batch_size = batch_size * 0.1
    # batch_size = train_batch_size
    for i in range(1000):
        print(type(vectors))
        print(type(labels))
        loss, accuracy, size, _ = sess.run([model.loss, model.accuracy, model.batch_size, model.optimizer], feed_dict={inputs : inputs, tags : labels})
        if i % 100 == 0:
            print('loss:', loss, 'accuracy', accuracy, 'size', size)

三. 错误 

以上代码报如下错误:

TypeError: The value of a feed cannot be a tf.Tensor object. Acceptable feed values include Python scalars, strings, lists, numpy ndarrays, or TensorHandles.For reference, the tensor object was Tensor("Placeholder:0", shape=(1000, 10, 128), dtype=float32) which was passed to the feed with key Tensor("Placeholder:0", shape=(1000, 10, 128), dtype=float32).

这是什么鬼,怎么会这样, 明明传进入的是np.ndarray啊。

四. 解决方案

后来仔细看了好久,原来是是这里没有写对:

 feed_dict={inputs : inputs, tags : labels}

改成如下就解决问题了:

 feed_dict={inputs : vectors, tags : labels}

 

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.15

TensorFlow-v2.15

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

### 问题分析 在 PyTorch 中,`TypeError: Expected images to be a torch.Tensor but got str` 的错误通常发生在需要处理图像数据时。具体来说,某些操作(如 `transforms.ToTensor()` 或模型输入)期望接收到的是 `torch.Tensor` 类型的数据,但实际传入的是字符串类型(`str`)。这可能是因为代码中混淆了文件路径和实际加载的图像数据[^1]。 以下是导致该错误的原因及解决方案: --- ### 错误原因 1. **混淆了文件路径与图像数据** 在图像处理任务中,通常会使用 `PIL.Image.open()` 或类似函数从文件路径加载图像。如果直接将文件路径(字符串类型)传递给需要 `torch.Tensor` 输入的操作,就会触发此错误[^5]。 2. **数据预处理不正确** 如果使用了 `torchvision.transforms` 中的 `ToTensor()` 转换器,它期望输入为 PIL 图像或 NumPy 数组,而不是字符串类型的路径[^5]。 3. **数据加载管道问题** 在使用数据加载器(如 `torch.utils.data.DataLoader`)时,如果自定义数据集类中没有正确实现图像加载逻辑,也可能导致此类错误。 --- ### 解决方案 #### 方法 1:确保正确加载图像 在加载图像时,应使用适当的库(如 `PIL.Image.open()` 或 `cv2.imread()`)将文件路径转换为图像数据。例如: ```python from PIL import Image # 假设 img_path 是图像文件路径 img_path = "path/to/image.jpg" image = Image.open(img_path) # 加载图像为 PIL 格式 ``` 然后可以将 PIL 图像转换为 `torch.Tensor`: ```python from torchvision import transforms transform = transforms.Compose([ transforms.Resize((64, 64)), # 调整大小 transforms.ToTensor() # 转换为 Tensor ]) tensor_image = transform(image) # 将 PIL 图像转换为 Tensor ``` --- #### 方法 2:检查数据加载器 如果使用 `torch.utils.data.Dataset` 和 `DataLoader`,需确保自定义数据集类中正确实现了图像加载逻辑。例如: ```python import os from PIL import Image import torch from torch.utils.data import Dataset, DataLoader class CustomDataset(Dataset): def __init__(self, image_paths, transform=None): self.image_paths = image_paths self.transform = transform def __len__(self): return len(self.image_paths) def __getitem__(self, idx): img_path = self.image_paths[idx] image = Image.open(img_path).convert("RGB") # 确保加载为 RGB 图像 if self.transform: image = self.transform(image) # 应用转换 return image # 示例用法 image_paths = ["path/to/image1.jpg", "path/to/image2.jpg"] transform = transforms.Compose([ transforms.Resize((64, 64)), transforms.ToTensor() ]) dataset = CustomDataset(image_paths, transform=transform) dataloader = DataLoader(dataset, batch_size=4, shuffle=True) ``` --- #### 方法 3:验证输入类型 在代码中添加类型检查,确保输入数据是 `torch.Tensor` 类型。例如: ```python if not isinstance(tensor_image, torch.Tensor): raise TypeError(f"Expected torch.Tensor but got {type(tensor_image)}") ``` --- ### 示例代码 以下是一个完整的示例,展示如何从文件路径加载图像并将其转换为 `torch.Tensor`: ```python from PIL import Image import torch from torchvision import transforms # 定义转换器 transform = transforms.Compose([ transforms.Resize((64, 64)), # 调整大小 transforms.ToTensor(), # 转换为 Tensor ]) # 加载图像 img_path = "path/to/image.jpg" image = Image.open(img_path).convert("RGB") # 加载并转换为 RGB # 应用转换 tensor_image = transform(image) print(tensor_image.shape) # 输出 Tensor 的形状 ``` --- ### 注意事项 1. 确保图像路径有效且文件存在。 2. 如果使用 `cv2.imread()` 加载图像,请注意 OpenCV 默认以 BGR 格式加载图像,而 PyTorch 模型通常期望 RGB 格式。可以通过以下方式转换: ```python import cv2 image = cv2.imread(img_path) image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 转换为 RGB ``` 3. 如果仍然遇到问题,可以打印中间变量的类型以调试代码: ```python print(type(image)) # 检查加载的图像类型 print(type(tensor_image)) # 检查转换后的 Tensor 类型 ``` --- ### 总结 `TypeError: Expected images to be a torch.Tensor but got str` 的核心原因是混淆了文件路径和实际图像数据。通过正确加载图像、应用合适的转换器以及验证输入类型,可以有效解决此问题[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值