首页 > 解决方案 > 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. 谁能告诉我我在这里缺少什么?

标签: pythontensorflowmachine-learningkeras

解决方案


所以,我用随机生成的数据尝试了上面的代码。而不是 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,并期望模型将其预测为错误数据。


推荐阅读