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

无法将NumPy数组转换为Tensor:文本嵌入分类模型训练报错

问题:训练嵌入语句标签预测模型时的NumPy转Tensor错误

报错信息

---> 67 model.fit(x, y, epochs=100)
ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type list).

代码片段

file = pd.read_csv('emoji.csv') 
emoji_mapping = {0:':red_heart:',1: ':baseball:',2: ':grinning_face_with_big_eyes:',3: ':disappointed_face:',4: ':fork_and_knife_with_plate:'} 
def emojize(r): 
    return emoji.emojize(emoji_mapping.get(r))
x = np.array(file['French macaroon is so tasty']) 
y = np.array(file['4']) 
for i,v in enumerate(y): 
    if v == '0v2':
        y = list(y) 
        x = list(x)
        y.remove(v) 
        x.remove(x[i]) 
        y = np.array(y) 
        x=np.array(x)    
vector_mapping = {}
glove_100d = open('glove.6B.100d.csv','r',encoding = 'utf8') 
for line in glove_100d: 
    line = line.split() 
    word = line[0] 
    vector = np.array(line[1:],dtype = str)
    vector_mapping[word] = vector  
glove_100d.close() 
keys = list(vector_mapping.keys())
x = [i.split(' ') for i in x]  

for i,v in enumerate(x): 
    for m,r in enumerate(v):  
        if r in keys:
            x[i][m] = vector_mapping.get(r) 
        else: 
            x[i][m] = vector_mapping.get('the') 
for i,v in enumerate(x):   
    v = [float(num) for sublist in v for num in sublist] 
    x[i] = v     
model = Sequential()  
model.add(LSTM(units = 20,return_sequences = True)) 
model.add(Dense(units = 5,activation = 'softmax')) 
model.compile(optimizer = 'adam',loss = 'sparse_categorical_crossentropy')  
x = x[:180] 
y = y[:180]  
y = [int(i) for i in y] 

x = np.reshape(x, (np.shape(x)[0], 1, 1))
y = np.reshape(y,(len(y),1))  
x = np.array(x)
y = np.array(y)

model.fit(x,y,epochs = 100) 

用户说明:目前尚未尝试对x数组进行填充,以确保所有数组长度一致。


问题分析与解决方案

核心问题

报错直接原因是输入数据x是包含不等长列表的NumPy数组,TensorFlow无法将这种object类型的数组转换为张量。此外代码中还有多处预处理和模型输入形状的问题:

  1. 序列长度不一致:不同句子拆分后词数不同,转换为嵌入向量后每个样本长度不一,导致x为object数组
  2. GloVe向量加载错误:将向量存为str类型,后续嵌套转换易出错
  3. 数据过滤逻辑漏洞:循环中直接修改列表并删除元素,会导致索引错位
  4. LSTM输入形状错误:LSTM要求输入形状为(batch_size, timesteps, features),你将x reshape为(180,1,1)完全不符合要求

分步修正

1. 正确过滤无效数据

用布尔索引替代循环删除,避免索引错位:

# 过滤y中的'0v2'值
valid_mask = y != '0v2'
x = x[valid_mask]
y = y[valid_mask]

2. 修正GloVe向量加载

直接将向量转为float类型,避免字符串转换:

vector_mapping = {}
# 注意GloVe通常是txt格式,不是csv
glove_100d = open('glove.6B.100d.txt','r',encoding='utf8') 
for line in glove_100d:
    parts = line.strip().split()
    word = parts[0]
    vector = np.array(parts[1:], dtype=np.float32)
    vector_mapping[word] = vector
glove_100d.close()
# 提前获取未知词的替代向量
unk_vector = vector_mapping.get('the', np.zeros(100, dtype=np.float32))

3. 统一序列长度

确定最大序列长度,对句子进行截断或填充:

x_embeddings = []
# 可根据数据计算真实最大长度:max(len(s.split()) for s in x)
max_len = 10  
for sentence in x:
    words = sentence.split()
    emb_seq = []
    # 截断过长句子
    for word in words[:max_len]:
        emb_seq.append(vector_mapping.get(word, unk_vector))
    # 填充短句子到max_len
    while len(emb_seq) < max_len:
        emb_seq.append(np.zeros(100, dtype=np.float32))
    x_embeddings.append(emb_seq)

# 转换为符合要求的NumPy数组:(样本数, max_len, 100)
x = np.array(x_embeddings, dtype=np.float32)

4. 调整模型输入与结构

匹配LSTM输入形状,修正模型结构:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense

# 不需要返回序列时,去掉return_sequences=True
model = Sequential()
# 输入形状对应(时间步长, 特征数)
model.add(LSTM(units=20, input_shape=(max_len, 100)))  
model.add(Dense(units=5, activation='softmax'))
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')

# 处理y:转为整数数组,sparse_categorical_crossentropy支持直接传入整数标签
y = y[:180].astype(int)
x = x[:180]

# 训练模型
model.fit(x, y, epochs=100)

关键注意点

  • 文本序列训练必须保证所有样本维度一致,填充/截断是标准操作
  • GloVe文件通常为.txt格式,注意文件路径和格式正确性
  • sparse_categorical_crossentropy无需对y做one-hot编码,直接传入整数标签即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 13:53:22