R语言Keras搭建Bi LSTM文本分类模型调用fit()方法报错求助
问题排查及解决方案
以下是你代码中的错误点及对应修正方案:
- 输出层配置不匹配:你要完成的是7分类任务(class_weight中定义了0~6共7个类别),但输出层units设置为1,和分类需求完全不符。二分类场景才会用units=1搭配sigmoid激活,多分类用softmax激活时units必须等于类别总数。
- 损失函数与标签格式不匹配:如果你传入的train.Labels是整数编码(每个样本标签为0~6的单个整数),不能使用
categorical_crossentropy,该损失要求标签为独热编码格式,需要替换为sparse_categorical_crossentropy。 - 绘图变量名错误:你存储训练过程的变量名为history2,但绘图代码调用的是history,运行时也会触发报错。
修正后代码
模型搭建代码
model <- keras_model_sequential() %>% layer_embedding(input_dim = max_features, output_dim = 32, input_length = max.length) %>% layer_lstm(units = 32, return_sequences = TRUE) %>% layer_lstm(units = 32, return_sequences = TRUE) %>% bidirectional(layer_lstm(units = 32)) %>% layer_dense(units = 7, activation = 'softmax') # 修正为对应7个分类 summary(model)
编译训练代码
model %>% compile(loss = 'sparse_categorical_crossentropy', # 适配整数标签的损失函数 optimizer = 'adam', metrics = c('accuracy')) history2 <- model %>% fit(x.train, train.Labels, epochs = 20, batch_size = 32, validation_split = 0.2, verbose = 2, class_weight = list("0" = 1, "1" = 22.9, "2" = 38.4, "3" = 33.4, "4" = 83.3, "5" = 382.2, "6" = 4280.4)) plot(history2) # 修正变量名
额外检查项
可以自行确认两个参数是否符合要求:
- x.train的维度是否和embedding层设置的input_length参数匹配
- train.Labels的所有取值都在0~6范围内,不存在异常值
内容的提问来源于stack exchange,提问作者fnas
相关产品推荐
相关产品推荐

