基本 Tensorflow 模型显示随机结果

Basic Tensorflow Model shows random outcomes

我正在构建一些新模型,想回到一些基础知识上。所以我决定编写一个分类器,将 [1, 1] 分类为 1,将所有其他组合分类为 0。

我已经为此编写了几个不同的变体,并且不断得到不同的结果。

from tensorflow.keras import layers, models
from tensorflow import keras

data = [[1., 1.], [1., 0.], [0., 1.], [0., 0.]]
results = [[1.], [0.], [0.], [0.]]


def build_model():
  model = models.Sequential()

  model.add(layers.Dense(len(data[0]), activation='relu'))
  model.add(layers.Dense(128, activation='relu'))
  model.add(layers.Dense(1))

  model.compile(loss=keras.losses.BinaryCrossentropy(), metrics=[keras.metrics.Accuracy()], optimizer='adam')

  return model


model = build_model()

model.fit(data, results, epochs=1000)
model.summary()

print(model.predict([data[0]]))
print(model.predict([data[1]]))
print(model.predict([data[2]]))
print(model.predict([data[3]]))

有时输出是完全错误的:

[[0.]]
[[0.]]
[[0.]]
[[0.]]

而且模型永远不会准确。

Epoch 1000/1000
1/1 [==============================] - 0s 910us/step - loss: 3.8562 - accuracy: 0.7500

有时它会显示较低的准确性并产生不良结果:

Epoch 1000/1000
1/1 [==============================] - 0s 918us/step - loss: 3.8562 - accuracy: 0.2500
[[-0.1101699]]
[[-0.13835455]]
[[-0.03829439]]
[[0.]]

其他时候它“有点”有效:

Epoch 1000/1000
1/1 [==============================] - 0s 898us/step - loss: 0.0000e+00 - accuracy: 0.0000e+00

(尽管我希望准确度为 1)

[[1.1292353]]
[[-0.167045]]
[[-0.03134967]]
[[-0.3522459]]

有人可以帮助我了解结果的差异。我已经创建了这个模型的几个版本,有更多的层,更少的层,不同大小的 Dense() 层。我已经尝试了几种损失和指标,但是,在这一点上,我只是随机地做一些事情。

由于您有二元分类问题(即二元 cross-entropy 损失和精度指标),您应该 使用 linear 激活函数最后一层,这是默认的一层,如果你没有指定任何东西,就像这里一样;来自 docs:

activation: Activation function to use. If you don't specify anything, no activation is applied (ie. "linear" activation: a(x) = x).

(二元)分类问题最后一层的线性激活是没有意义的;因此,将您的最后一个模型层更改为:

model.add(layers.Dense(1, activation='sigmoid'))

你应该没问题(另见 and )。