TensorFlow中model.fit()报ValueError:validation_split仅支持张量/NumPy数组
解决TensorFlow中validation_split的ValueError问题
问题重现
运行以下TensorFlow代码时,最后一行model.fit(x, y,batch_size=10,validation_split=0.1)触发报错:
import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense , Dropout, Activation, Flatten, Conv2D, MaxPooling2D import pickle x = pickle.load(open("x.pickle","rb")) y = pickle.load(open("y.pickle","rb")) x=x/255.0 model = Sequential() model.add( Conv2D(64, (3,3), input_shape = x.shape[1:]) ) model.add(Activation("relu")) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Conv2D(64, (3,3))) model.add(Activation("relu")) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Flatten()) model.add(Dense(64)) model.add(Dense(1)) model.add(Activation('sigmoid')) model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=['accuracy']) model.fit(x, y,batch_size=10,validation_split=0.1)
报错信息:
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) ~\AppData\Local\Temp\ipykernel_10844\1395261416.py in <module> ----> 1 model.fit(x, y,batch_size=10,validation_split=0.1) ~\anaconda3\lib\site-packages\keras\utils\traceback_utils.py in error_handler(*args, **kwargs) 68 # To get the full stack trace, call: 69 # `tf.debugging.disable_traceback_filtering()` ---> 70 raise e.with_traceback(filtered_tb) from None 71 finally: 72 del filtered_tb ~\anaconda3\lib\site-packages\keras\engine\data_adapter.py in train_validation_split(arrays, validation_split) 1662 unsplitable = [type(t) for t in flat_arrays if not _can_split(t)] 1663 if unsplitable: -> 1664 raise ValueError( 1665 "`validation_split` is only supported for Tensors or NumPy " 1666 "arrays, found following types in the input: {}".format(unsplitable) ValueError: `validation_split` is only supported for Tensors or NumPy arrays, found following types in the input: [<class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>, <class 'int'>]
问题原因
- 数据类型不兼容:从pickle加载的
y是Python整数列表,而非NumPy数组或Tensor,validation_split仅支持处理NumPy数组/Tensor类型的输入,无法对Python列表自动拆分验证集。 - 损失函数不匹配:模型输出使用
sigmoid激活(单节点二分类场景),但编译时指定了categorical_crossentropy损失函数,该函数适用于多分类的独热编码标签,二分类场景应使用binary_crossentropy。
解决方案
步骤1:将y转换为NumPy数组
导入numpy库,将加载后的y转为NumPy数组,确保validation_split可以正常处理。
步骤2:修正损失函数
将categorical_crossentropy替换为binary_crossentropy,匹配单节点sigmoid的二分类场景。
修改后的完整代码
import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense , Dropout, Activation, Flatten, Conv2D, MaxPooling2D import pickle import numpy as np # 新增导入numpy x = pickle.load(open("x.pickle","rb")) y = pickle.load(open("y.pickle","rb")) y = np.array(y) # 将y转为NumPy数组 x=x/255.0 model = Sequential() model.add(Conv2D(64, (3,3), input_shape = x.shape[1:])) model.add(Activation("relu")) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Conv2D(64, (3,3))) model.add(Activation("relu")) model.add(MaxPooling2D(pool_size=(2,2))) model.add(Flatten()) model.add(Dense(64)) model.add(Dense(1)) model.add(Activation('sigmoid')) model.compile(loss="binary_crossentropy", # 修正损失函数 optimizer="adam", metrics=['accuracy']) model.fit(x, y,batch_size=10,validation_split=0.1)
内容的提问来源于stack exchange,提问作者chaos
相关产品推荐
相关产品推荐

