我不能训练逻辑运算

时间:2018-07-12 18:52:01

标签: python-3.x tensorflow keras

我无法训练最简单的逻辑运算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.]]

1 个答案:

答案 0 :(得分:1)

很多问题:

  • Softmax总是输出总和1。很自然地,您的输出总是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))