我是深度学习的新手,我正在尝试在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.]]
我不确定,这个网络有什么问题。
答案 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]]