首页 > 解决方案 > 基本 TensorFlow 模型显示随机结果

问题描述

我正在构建一些新模型,并希望回到一些基础。所以我决定编写一个分类器,将 [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() 层。我已经尝试了几个损失和指标,但是,此时我只是随机做事。

标签: pythontensorflowmachine-learningkerastensorflow2.0

解决方案


因为你有一个二元分类问题(即二元交叉熵损失和准确度度量),你不应该你的最后一层使用linear激活函数,这是默认的,如果你没有指定任何东西,就像这里; 来自文档

activation:要使用的激活函数。如果您未指定任何内容,则不会应用任何激活(即“线性”激活:)a(x) = x

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

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

并且您应该没问题(另请参阅Train accuracy 随着 train lossModel not learning降低)。


推荐阅读