Skip to main content
 首页 » 编程设计

python之tensorflow ,凯拉斯。使用 bool 数组作为输入构建模型

2024年08月14日32cloudgamer

我是机器学习的新手,刚刚开始学习。 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 并期望模型将其预测为错误数据。