Keras fit()无法接受自定义处理的numpy数组问题求助
问题分析与解决
为什么自定义函数处理后会报错?
你遇到的问题核心在于数据结构的差异:
keras.preprocessing.sequence.pad_sequences返回的是一个规整的二维数值型NumPy数组(比如dtype=int32),所有样本的长度统一为250,TensorFlow可以直接将其转换为张量。- 而你的
make_data_const_250函数处理后得到的是一个元素为独立NumPy数组的object类型数组(外层数组的dtype是object)。这种嵌套的数组结构,TensorFlow无法直接解析成符合要求的张量,所以抛出了转换失败的错误。
直白点说,你得到的是 array([array([1,2,...]), array([3,4,...]), ...], dtype=object) 这种嵌套结构,而Keras需要的是 array([[1,2,...], [3,4,...], ...], dtype=int32) 这样的二维数值数组。
如何修改自定义函数解决问题?
你可以重构函数逻辑,直接创建一个指定形状的二维数组,避免生成嵌套的object数组:
import numpy as np def make_data_const_250(data, space_index): # 预先创建一个形状为(样本数, 250)的数组,用空格索引填充默认值 padded_data = np.full((len(data), 250), space_index, dtype=np.int32) for i in range(len(data)): seq = np.asarray(data[i], dtype=np.int32) # 取序列长度和250的最小值,防止越界 seq_len = min(len(seq), 250) # 将序列的前seq_len个元素写入结果数组的第i行 padded_data[i, :seq_len] = seq[:seq_len] return padded_data
调用时传入空格对应的索引即可:
train_data = make_data_const_250(train_data, word_index["<SPACE>"]) test_data = make_data_const_250(test_data, word_index["<SPACE>"])
这样处理后,train_data就和pad_sequences的输出结构完全一致,是规整的二维数值数组,能被model.fit()正常识别。
验证数据格式的小技巧
处理完数据后,可以打印以下信息确认格式是否正确:
print(train_data.dtype) # 应该输出int32之类的数值类型,而非object print(train_data.shape) # 应该输出(样本总数, 250),比如(25000, 250)
如果输出符合预期,就说明数据格式没问题了。
内容的提问来源于stack exchange,提问作者Yannai Cohen
相关产品推荐
相关产品推荐

