首页 > 解决方案 > Keras LSTM XOR 门

问题描述

我正在为一个项目学习 Keras,为了试用,我尝试使用 LSTM(我将用于该项目)进行简单的机器学习,以进行简单的 XOR 门预测。但是,即使我改变了神经元、层、损失函数、时期或优化器的数量,我也无法得到正确的预测。关于 Keras 或这段代码,我有什么想念的吗?

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]]

model = Sequential()
model.add(LSTM(10, input_shape=(1, 2), return_sequences=True))
model.add(LSTM(10))
model.add(Dense(2))

model.compile(loss='mae', optimizer='adam')
# print(model.summary())
model.fit(np.asarray(data), np.asarray(output), epochs=50)

print(model.predict_classes(np.asarray(data)))

标签: pythontensorflowkeraslstm

解决方案


您正在预测编码为 one-hot 向量的 XOR 输出。在这种情况下,它很像分类问题。如果您使用softmax生成分布并将损失设置为categorical_crossentropy您的网络开始学习:

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]]

model = Sequential()
model.add(LSTM(10, input_shape=(1, 2), return_sequences=True))
model.add(LSTM(10))
model.add(Dense(2, activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam')
# print(model.summary())
model.fit(np.asarray(data), np.asarray(output), epochs=200)

print(model.predict_classes(np.asarray(data)))

此外,您还需要增加 epoch 的数量,因为adam默认值的学习率很小。


推荐阅读