我是机器学习的新手,刚刚开始学习。 TensorFlow 看起来很容易理解并且有简单的例子。但我找不到如何构建可以将 bool 数组(0 和 1)作为输入的模型。在我发现的所有示例中,输入都是大于 1 的数字数组。谁能告诉我如何使用 100 个 bool 输入层和 1 个输出层构建模型。或者至少告诉我在哪里搜索解决方案。
编辑
我的代码:
array = []
with open("C:/temp/out.txt") as file:
for line in file:
array.append(list(map(int, list(line.rstrip('\n')))))
train_data = array[:2000]
test_data = array[2000:4000]
train_labels = [1] * 2000
test_labels = [1] * 2000
# Array for prediction check
check_data = array[4000:4010] # 10 correct inputs
check_data.append([0] * 100) # Incorrect data
check_data.append([1] * 100) # Incorrect data
# Converting to numpy array
check_data = np.asarray(check_data)
train_data = np.asarray(train_data)
test_data = np.asarray(test_data)
train_labels = np.asarray(train_labels)
test_labels = np.asarray(test_labels)
model = keras.Sequential()
model.add(keras.layers.Dense(100, input_shape=(100,)))
model.add(keras.layers.Dense(80))
model.add(keras.layers.Dense(20))
model.add(keras.layers.Dense(1, activation=tf.nn.sigmoid))
model.compile(optimizer=tf.train.AdamOptimizer(),
loss='binary_crossentropy',
metrics=['accuracy'])
model.summary()
history = model.fit(train_data,
train_labels,
epochs=2)
results = model.evaluate(test_data, test_labels)
predict = model.predict(check_data)
总结:
Total params: 19,821
Trainable params: 19,821
Non-trainable params: 0
配合历史:
Epoch 1/2
32/2000 [..............................] - ETA: 11s - loss: 0.1560 - acc: 0.9688
1664/2000 [=======================>......] - ETA: 0s - loss: 0.0039 - acc: 0.9994
2000/2000 [==============================] - 0s 120us/step - loss: 0.0033 - acc: 0.9995
Epoch 2/2
32/2000 [..............................] - ETA: 0s - loss: 2.7940e-07 - acc: 1.0000
1696/2000 [========================>.....] - ETA: 0s - loss: 2.6042e-07 - acc: 1.0000
2000/2000 [==============================] - 0s 30us/step - loss: 2.5141e-07 - acc: 1.0000
评估:
32/2000 [..............................] - ETA: 2s
2000/2000 [==============================] - 0s 38us/step
[6.117830600942398e-07, 1.0]
预测:
[[0.9999987 ]
[0.9999964 ]
[0.99999917]
[0.9999995 ]
[0.99999833]
[1. ]
[1. ]
[1. ]
[0.9999993 ]
[0.9999999 ]
[0.5781495 ]
[1. ]]
如您所见,只有 100 个零显示为不正确,但 100 个(最后一个不正确的输入)是可靠的 1。任何人都可以告诉我我在这里缺少什么吗?
请您参考如下方法:
所以,我用随机生成的数据尝试了上面的代码。而不是 1 和 0 它的 10 和 11
array=np.round(np.random.rand(4010,100))+10 #change in data
train_data = array[:2000]
test_data = array[2000:4000]
train_labels = [1] * 2000
test_labels = [1] * 2000
# Array for prediction check
check_data = [list(item) for item in array[4000:4010]] # 10 correct inputs
check_data.append([10] * 100) # Incorrect data
check_data.append([11] * 100) # Incorrect data
Predicted Output:
array([[1.],
[1.],
[1.],
[1.],
[1.],
[1.],
[1.],
[1.],
[1.],
[1.],
[1.],
[1.]], dtype=float32)
因此,由此您可以推断出 0 是按面值取的。
在神经网络中,每个神经元求解方程 y=wx+b
其中y:神经元的输出,w=weights,x=神经元的输入,b=bias
当x=0,y=b 和x=1,y=w+b
因此,每当输入为 0 时,神经元几乎处于关闭状态(偏置值通常很小)
模型不会了解到全 0 和全 1 都是错误数据。全 0 的输出恰好是正确的,全 1 的输出告诉我们这是巧合,有些地方出了问题。
此外,您的数据中包含 0 和 1,并附有标签 1。您不能指望给出全 1 和全 0 并期望模型将其预测为错误数据。
