用于生成错误输出的 NOT 逻辑的 Keras 简单神经网络
Keras simple neural network for NOT logic generating wrong output
我是深度学习的新手,我正在尝试在 keras
中实现 NOT
逻辑。但结果不正确。下面是代码。
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.]]
我不确定,这个网络有什么问题。
你对损失的使用看起来不对。 Softmax 通常用于多 class 预测,并且您已经使用 Dense(2)
将输出设置为由 2 个值组成。因此,使您的目标成为 dim=2
.
的多 class 目标
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]]
编辑: 有人可以争论上面的最终层激活和损失函数的设置是否适合二进制-class化(可能不是) .
使用 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]]
我是深度学习的新手,我正在尝试在 keras
中实现 NOT
逻辑。但结果不正确。下面是代码。
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.]]
我不确定,这个网络有什么问题。
你对损失的使用看起来不对。 Softmax 通常用于多 class 预测,并且您已经使用 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]]
编辑: 有人可以争论上面的最终层激活和损失函数的设置是否适合二进制-class化(可能不是) .
使用 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]]