You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CNN模型训练失败:NumPy数组转Tensor报错排查求助

问题描述

我正尝试训练一个CNN模型,使其输出格式为array([ 0., 0., 0., 0., -1.], dtype=float32)的预测结果。

训练数据

训练数据样例如下:

0        [[-1.0, -1.0, -1.0, -1.0, -1.0], [0.0, 0.0, 0....
1        [[0.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 1.0, 0....
2        [[0.0, 0.0, 0.0, -1.0, -1.0], [0.0, 0.0, 0.0, ...
3        [[-1.0, -1.0, -1.0, -1.0, -1.0], [-1.0, -1.0, ...
4        [[-1.0, -1.0, -1.0, -1.0, -1.0], [0.0, 0.0, 0....
                               ...                        
15484    [[-1.0, -1.0, -1.0, -1.0, -1.0], [0.0, 2.0, 1....
15485    [[-1.0, -1.0, -1.0, -1.0, -1.0], [-1.0, -1.0, ...
15486    [[-1.0, -1.0, -1.0, -1.0, -1.0], [0.0, 2.0, 0....
15487    [[1.0, 0.0, 0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0....
15488    [[-1.0, -1.0, -1.0, -1.0, -1.0], [-1.0, -1.0, ...

每条数据的形状为(24,5),完整示例如下:

array([[-1., -1., -1., -1., -1.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  3.,  0.,  0.,  1.],
       [ 1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0., -1.],
       [ 0.,  1.,  2.,  0.,  0.],
       [ 0.,  3.,  0.,  0., -1.],
       [ 0.,  1.,  0.,  0., -1.],
       [ 0.,  1.,  0.,  0., -1.],
       [ 1.,  0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0., -1.],
       [ 1.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0., -1.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0., -1.],
       [ 0.,  0.,  0.,  0., -1.],
       [ 0.,  1.,  0.,  0., -1.],
       [ 0.,  1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0., -1.],
       [ 0.,  0.,  0.,  0., -1.],
       [ 0.,  1.,  0.,  0., -1.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0., -1.],
       [ 1.,  2.,  0.,  0., -1.]], dtype=float32)

模型代码

我使用的模型定义如下:

model = tf.keras.Sequential(layers=[
                tf.keras.layers.Conv2D(32,kernel_size = 3, activation=tf.nn.relu, input_shape=(28,28,1)),
                tf.keras.layers.BatchNormalization(),
                tf.keras.layers.Conv2D(32,kernel_size = 3, activation=tf.nn.relu),
                tf.keras.layers.BatchNormalization(),
                tf.keras.layers.Conv2D(32,kernel_size = 5,strides=2,padding='same', activation=tf.nn.relu),
                tf.keras.layers.BatchNormalization(),

                tf.keras.layers.Conv2D(64,kernel_size = 3, activation=tf.nn.relu),
                tf.keras.layers.BatchNormalization(),
                tf.keras.layers.Conv2D(64,kernel_size = 3, activation=tf.nn.relu),
                tf.keras.layers.BatchNormalization(),
                tf.keras.layers.Conv2D(64,kernel_size = 3, strides=2, padding='same', activation=tf.nn.relu),
                tf.keras.layers.BatchNormalization(),
                tf.keras.layers.Flatten(),
                tf.keras.layers.Dense(128,activation=tf.nn.relu),
                tf.keras.layers.BatchNormalization(),
                tf.keras.layers.Dense(1, activation=tf.nn.softmax)])

model.compile(optimizer=tf.keras.optimizers.Adam(0.1), 
              loss=tf.keras.losses.CategoricalCrossentropy(), 
              metrics=tf.keras.metrics.Accuracy())

遇到的错误

训练时出现以下错误:

ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type numpy.ndarray).

我已经尝试用tf.convert_to_tensor()转换训练数据,也试过.astype("float32"),但还是报同样的错,请问哪里操作错了?


解决方案

1. 输入形状不匹配

你的输入数据形状是(24,5),但模型的Conv2D输入定义为input_shape=(28,28,1),两者完全不匹配。Conv2D需要3维输入(高度、宽度、通道数),你需要调整数据形状并修改模型输入定义:

  • 将(24,5)的数据扩展维度为(24,5,1),同时把模型的input_shape改为(24,5,1)。

2. 输出层设置错误

你期望输出是长度为5的数组,但当前输出层是Dense(1, activation=tf.nn.softmax),只会输出长度为1的结果。需要修改为:

tf.keras.layers.Dense(5)  # 若为回归任务无需激活函数;若为分类任务再根据需求选择激活函数

另外,你使用的CategoricalCrossentropy损失适用于one-hot编码的分类标签,但你的输出包含-1值,显然不属于分类场景,建议改用MeanSquaredError这类回归损失。

3. 数据格式规整化

错误提示无法转换NumPy数组为Tensor,大概率是训练数据不是规整的NumPy数组(比如是列表嵌套数组、单条数据形状不一致)。可以用以下代码确保数据格式正确:

import numpy as np

# 假设训练数据存储在train_data列表中
train_data = np.array(train_data, dtype=np.float32)
# 扩展通道维度,适配Conv2D输入要求
train_data = np.expand_dims(train_data, axis=-1)

4. 其他细节优化

  • Adam优化器的学习率设为0.1过大,通常建议从0.001开始尝试
  • Accuracy指标适用于分类任务,若为回归任务应改用MeanAbsoluteError、MeanSquaredError这类指标

内容的提问来源于stack exchange,提问作者SidMenon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 23:54:24