我无法训练最简单的逻辑运算xor的网络(keras + tf)。我不明白我在做什么错?
import numpy as np
from keras.models import Sequential
from keras.layers.core import Dense, Activation
from keras.optimizers import SGD
VALIDATION_SPLIT=0.1
model = Sequential()
model.add(Dense(2, input_dim=2, kernel_initializer='random_normal',
use_bias=True,
bias_initializer='random_normal'))
model.add(Activation('softmax'))
model.add(Dense(1, use_bias=True, bias_initializer='random_normal'))
model.add(Activation('softmax'))
model.summary() # print information about structure of neural net
model.compile(loss='mean_squared_error', optimizer=SGD(lr=0.01),
metrics= ['accuracy']) #mean_squared_error
X_train = np.array([ [0,0],[0,1],[1,0],[1,1] ])
Y_train = np.array([ [0],[1],[1],[0] ])
history = model.fit(X_train, Y_train,
batch_size=1, epochs=10, verbose=1,
validation_split=VALIDATION_SPLIT)
print(model.predict(np.array([[0,1]])))
print(model.predict(np.array([[1,0]])))
print(model.predict(np.array([[1,1]])))
print(model.predict(np.array([[0,0]])))
results:
[[ 1.]]
[[ 1.]]
[[ 1.]]
[[ 1.]]
答案 0 :(得分:1)
很多问题:
解决此问题后,您应该考虑所选的网络是否能够做到这一点。
该模型能够学习:
model = Sequential()
model.add(Dense(10, input_dim=2, kernel_initializer='random_normal',
use_bias=True, bias_initializer='random_normal', activation ='softplus'))
model.add(Dense(5, input_dim=2, kernel_initializer='random_normal',
use_bias=True, bias_initializer='random_normal', activation ='softplus'))
model.add(Dense(1, use_bias=True, bias_initializer='random_normal'))
model.add(Activation('sigmoid'))
您的模型也是可以的,但是需要一些调整:
model = Sequential()
model.add(Dense(2, input_dim=2, activation ='softplus'))
model.add(Dense(1, activation = 'sigmoid'))
model.summary() # print information about structure of neural net
model.compile(loss='mean_squared_error', optimizer='adam',
metrics= ['accuracy']) #mean_squared_error
X_train = np.array([ [0,0],[0,1],[1,0],[1,1] ])
Y_train = np.array([ [0],[1],[1],[0] ])
history = model.fit(X_train, Y_train,
batch_size=1, epochs=10000, verbose=1)
print(model.predict(X_train))