Keras简单神经网络用于NOT逻辑生成错误输出

时间:2016-11-12 13:52:26

标签: python-2.7 keras

我是深度学习的新手,我正在尝试在NOT中实施keras逻辑。但结果不正确。以下是代码。

from keras.layers import Input, Dense
from keras.models import Model
import numpy as np

inputs = Input(shape=(1,))
x = Dense(1024, activation='relu')(inputs)
x = Dense(2048, activation='relu')(x)
predictions = Dense(1, activation='softmax')(x)

model = Model(input=inputs, output=predictions)
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])

X = np.array([[0.], [1.]], dtype=np.float32)
y = np.array([[1.], [0.]], dtype=np.float32)
print "learning....."
model.fit(X, y, nb_epoch=100)
print model.predict(X)

输出:
在每个时代,输出都是相同的:

Epoch 100/100
2/2 [==============================] - 0s - loss: 0.5000 - acc: 0.5000

并且预测是:

[[ 1.]
 [ 1.]]

我不确定,这个网络有什么问题。

1 个答案:

答案 0 :(得分:1)

您对损失的使用看起来不对。 Softmax通常用于多类预测,您已使用Dense(2)将输出设置为包含2个值。因此,请将目标设为dim=2的多级目标。

from keras.layers import Input, Dense
from keras.models import Model
import numpy as np

inputs = Input(shape=(1,))
x = Dense(1024, activation='relu')(inputs)
x = Dense(2048, activation='relu')(x)
predictions = Dense(2, activation='softmax')(x)

model = Model(input=inputs, output=predictions)
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])

X = np.array([[0.], [1.]], dtype=np.float32)
y = np.array([[1., 0], [0., 1]], dtype=np.float32)
print "learning....."
model.fit(X, y, nb_epoch=100)
print model.predict(X)

输出

Epoch 100/100
2/2 [==============================] - 0s - loss: 1.5137e-07 - acc: 1.0000
[[  9.99880254e-01   1.19736877e-04]
 [  5.35955711e-04   9.99464035e-01]]

编辑:有人可能会争论上面的最终层激活和损失函数的设置是否适合二进制分类(可能不是)。 Link

替代使用sigmoid并且只有一个目标:

from keras.layers import Input, Dense
from keras.models import Model
import numpy as np

inputs = Input(shape=(1,))
x = Dense(1024, activation='relu')(inputs)
x = Dense(2048, activation='relu')(x)
predictions = Dense(1, activation='sigmoid')(x)

model = Model(input=inputs, output=predictions)
model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy'])

X = np.array([[0.], [1.]], dtype=np.float32)
y = np.array([1., 0.], dtype=np.float32)
print "learning....."
model.fit(X, y, nb_epoch=100)
print model.predict(X)

输出

Epoch 100/100
2/2 [==============================] - 0s - loss: 9.9477e-07 - acc: 1.0000
[[ 0.99945992]
 [ 0.00129277]]