python - TensorFlow,Keras。使用布尔数组作为输入构建模型
问题描述
我是机器学习的新手,只是学习。TensorFlow 似乎很容易理解并且有简单的例子。但我找不到如何构建可以将布尔数组(0 和 1)作为输入的模型。在我找到的所有示例中,输入都是大于 1 的数字数组。谁能告诉我如何构建具有 100 个布尔输入层和 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=权重,x=神经元的输入,b=偏差
当x=0,y=b,x=1,y=w+b
因此,每当输入为 0 时,神经元几乎是关闭的(偏差值一般很小)
该模型不会得知所有 0 和所有 1 都是错误数据。所有 0 的输出恰好是正确的,而所有 1 的输出告诉我们这是一个巧合,有些地方是错误的。
此外,您的数据中有 0 和 1,并附有标签 1。您不能期望给出全 1 和全 0,并期望模型将其预测为错误数据。
推荐阅读
- javascript - localStorage 刷新后清除
- javascript - forEach 中过滤器的 javascript (es6) 返回值
- javascript - 如何从 url 获取网页的 html
- c# - System.Management.ManagementClass 抛出 System.IO.FIleNotFoundException
- r - 如何从本地PC目录输入R包
- sql - 无效的 SQL 语句,需要 SELECT
- c# - 如何更新在 .NET Core 和 .NET Framework 应用程序之间共享的程序集
- java - kotlin 泛型仅适用于消费者
- python - Python - 从 MS SQL Server 插入表 INTO SQLite
- php - 我不明白为什么空的php变量会发生这种情况