TensorFlow训练ANN遇UnimplementedError:字符串转浮点不支持求助
解决TensorFlow中binary_crossentropy的字符串转浮点错误
核心问题分析
错误提示“Casting string to float is not supported”说明训练标签Y_train是字符串类型(比如存储为"0"、"1"这类字符串值),而binary_crossentropy损失函数要求标签必须是数值型(整数或浮点),无法直接将字符串转换为浮点进行计算。
同时你的代码还有两处语法问题,也可能间接触发异常:
- 编译模型时,
optimizer = Adam和metrics = accuracy未正确引用对应的类或标识,因为你没有导入Adam优化器,也未定义accuracy变量。
分步解决方案
1. 转换训练标签的数值类型
将Y_train从字符串类型转换为浮点型或整数型,任选一种即可:
# 方法1:用numpy转换 import numpy as np Y_train = Y_train.astype(np.float32) # 方法2:用pandas转换(如果Y_train是Series格式) Y_train = Y_train.astype('float32') # 方法3:用TensorFlow转换 Y_train = tf.convert_to_tensor(Y_train, dtype=tf.float32)
转换后可通过print(Y_train.dtype)确认,结果应为float32或int32。
2. 修正模型编译的参数错误
编译模型时,优化器和指标需要正确指定:
# 先导入Adam优化器 from tensorflow.keras.optimizers import Adam # 编译时实例化Adam优化器,用字符串指定准确率指标 model1.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy'])
也可以使用TensorFlow的指标类替代字符串:
from tensorflow.keras.metrics import BinaryAccuracy model1.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=[BinaryAccuracy()])
3. 额外检查:输入特征X_train的类型
确保X_train也是数值型(浮点或整数),如果存在字符串特征,需要先做编码处理(比如独热编码、标签编码),否则也会触发类似类型错误。
修正后的完整代码示例
import tensorflow as tf from tensorflow.keras.layers import Dense from tensorflow.keras.optimizers import Adam # 先转换Y_train类型(假设已加载数据集) Y_train = Y_train.astype('float32') model1 = tf.keras.models.Sequential() # 添加输入层与第一个隐藏层 model1.add(Dense(units=15, input_shape=(X_train.shape[1],), kernel_initializer='uniform', activation='relu')) # 添加第二个隐藏层 model1.add(Dense(units=50, kernel_initializer='uniform', activation='relu')) # 添加输出层 model1.add(Dense(units=1, kernel_initializer='uniform', activation='sigmoid')) # 编译ANN model1.compile(optimizer=Adam(), loss='binary_crossentropy', metrics=['accuracy']) model1.summary() # 拟合训练集 history = model1.fit(X_train, Y_train, batch_size=64, epochs=10, verbose=1)
内容的提问来源于stack exchange,提问作者sisay sebsibe
相关产品推荐
相关产品推荐

