使用PyCox实现DeepSurv时DataFrameMapper特征转换报错如何解决
问题1:报错与batch_size的关联及batch_size含义
- 该报错和batch_size完全无关。
- batch_size是深度学习训练过程中,单次迭代输入到神经网络中参与梯度计算的样本数量,仅影响训练效率、梯度稳定性和显存占用,不会触发数据类型类报错。
报错原因分析
第一个RuntimeError原因
你当前的配置下DataFrameMapper返回的是pandas DataFrame对象,直接调用.astype('float32')可能没有完成全量数值的类型转换,或者你遗漏了标签y_train的类型转换:原始数据中的整数型特征、事件标签(0/1取值)、生存时长字段如果保留int64类型,就会被PyTorch识别为Long类型,和模型要求的Float类型不匹配。
第二个All objects in 'data' does have the same type报错原因
pycox的模型输入要求为numpy数组或PyTorch张量,你直接传入pandas DataFrame对象时,框架会将DataFrame整体识别为一个对象类型,无法匹配数值输入要求。
解决方案
方案1:保留DataFrameMapper的修正写法
确保转换后输出为numpy数组再做类型转换,同时统一处理标签的类型:
cols_leave = df_train.columns.values.tolist() leave = [(col, None) for col in cols_leave] x_mapper = DataFrameMapper(leave) # 新增.values获取numpy数组后再转类型 x_train = x_mapper.fit_transform(df_train).values.astype('float32') x_val = x_mapper.transform(df_val).values.astype('float32') x_test = x_mapper.transform(df_test).values.astype('float32') # 补充标签类型转换,假设duration和event是你的标签字段 y_train = np.array([df_train['duration'], df_train['event']], dtype='float32').T y_val = np.array([df_val['duration'], df_val['event']], dtype='float32').T y_test = np.array([df_test['duration'], df_test['event']], dtype='float32').T
方案2:不使用DataFrameMapper的简化写法
# 直接转numpy数组再转float32 x_train = df_train.to_numpy().astype('float32') x_val = df_val.to_numpy().astype('float32') x_test = df_test.to_numpy().astype('float32') # 同样处理标签 y_train = np.array([df_train['duration'], df_train['event']], dtype='float32').T y_val = np.array([df_val['duration'], df_val['event']], dtype='float32').T y_test = np.array([df_test['duration'], df_test['event']], dtype='float32').T
验证步骤
训练前执行以下代码确认类型正确:
print(x_train.dtype, y_train.dtype) # 预期输出均为float32
内容的提问来源于stack exchange,提问作者Hashriama
相关产品推荐
相关产品推荐

