You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Keras LSTM实现XOR门预测失败,请求问题排查指导

嘿,我来帮你看看这个问题!你想用LSTM实现XOR预测的思路挺有意思的,但确实有几个关键细节没处理对,导致模型学不出正确结果。咱们一步步来梳理:

问题分析与修正步骤

1. 输出层缺失激活函数 + 损失函数不匹配

你的输出是one-hot编码的分类结果(比如[1,0]代表XOR结果为0,[0,1]代表结果为1),但当前的Dense层没有设置激活函数,默认是线性激活——这种激活方式没法输出符合分类任务要求的概率分布。同时你用了mae(平均绝对误差,多用于回归任务)作为损失函数,完全不适合分类场景。

修正方案:

  • 给输出层的Dense加上activation='softmax',让输出变成两个类别概率和为1的分布。
  • 损失函数替换为categorical_crossentropy,这是多分类任务的标准损失函数,能有效引导模型学习分类边界。

2. predict_classes已被弃用

Keras中的predict_classes方法早就被移除了,现在应该先用predict()获取每个样本的类别概率,再用np.argmax()取出概率最大的类别索引。

3. 训练轮次不足

XOR逻辑虽然简单,但LSTM的参数数量远多于普通神经网络,50个epoch的训练量可能不够模型收敛。建议把训练轮次增加到200-500个。

可选:简化模型结构(非必须,但更合理)

XOR是静态的二元分类问题,其实用普通的全连接层(Dense)就足够解决,LSTM的核心优势是处理序列数据,用在这里有点“杀鸡用牛刀”。不过如果你就是想测试LSTM的用法,保留现有结构也没问题,只是两层LSTM对长度为1的序列来说有点冗余。

修正后的完整代码
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, LSTM

# 数据准备
data = [[[0, 0]], [[0, 1]], [[1, 0]], [[1, 1]]]
output = [[1, 0], [0, 1], [0, 1], [1, 0]]

# 转换为numpy数组
X = np.asarray(data)
y = np.asarray(output)

# 构建模型(保留你原本的双层LSTM结构)
model = Sequential()
model.add(LSTM(10, input_shape=(1, 2), return_sequences=True))
model.add(LSTM(10))
# 输出层添加softmax激活
model.add(Dense(2, activation='softmax'))

# 编译模型:使用分类任务专属的损失函数和评估指标
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# 增加训练轮次,verbose=1可以看到训练过程的精度变化
model.fit(X, y, epochs=300, verbose=1)

# 预测并转换为类别索引
predictions = model.predict(X)
pred_classes = np.argmax(predictions, axis=1)
print("预测类别索引:", pred_classes)
# 对应你的输出编码:索引0代表[1,0](XOR结果0),索引1代表[0,1](XOR结果1)
额外:用MLP实现XOR(更适配场景)

如果你只是想验证XOR的逻辑,用普通全连接网络会更高效:

import numpy as np
from keras.models import Sequential
from keras.layers import Dense

# 注意这里数据要改成2D格式(因为MLP接收的是静态特征)
X = np.array([[0,0], [0,1], [1,0], [1,1]])
y = np.array([[1,0], [0,1], [0,1], [1,0]])

model = Sequential()
model.add(Dense(4, input_shape=(2,), activation='relu'))
model.add(Dense(2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(X, y, epochs=200, verbose=1)

predictions = model.predict(X)
pred_classes = np.argmax(predictions, axis=1)
print("MLP预测结果:", pred_classes)

内容的提问来源于stack exchange,提问作者Erland Devona

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:49:03