Tensorflow 结构化数据模型.predict() 返回不正确的概率



我正在尝试遵循结构化数据模型的Tensorflow教程(我是初学者(,并在此过程中进行了一些更改。

我的目的是创建一个模型,我向其提供数据(以csv格式(,看起来像这样(该示例只有2个功能,但我想在弄清楚后对其进行扩展(:

power_0,power_1,result
0.2,0.3,draw
0.8,0.1,win
0.3,0.1,draw
0.7,0.2,win
0.0,0.4,lose

我使用以下代码创建了模型:

def get_labels(df, label, mapping):
raw_y_true = df.pop(label)
y_true = np.zeros((len(raw_y_true)))
for i, raw_label in enumerate(raw_y_true):
y_true[i] = mapping[raw_label]
return y_true

tf.compat.v1.enable_eager_execution()
mapping_to_numbers = {'win': 0, 'draw': 1, 'lose': 2}
data_frame = pd.read_csv('data.csv')
data_frame.head()
train, test = train_test_split(data_frame, test_size=0.2)
train, val = train_test_split(train, test_size=0.2)
train_labels = np.array(get_labels(train, label='result', mapping=mapping_to_numbers))
val_labels = np.array(get_labels(val, label='result', mapping=mapping_to_numbers))
test_labels = np.array(get_labels(test, label='result', mapping=mapping_to_numbers))
train_features = np.array(train)
val_features = np.array(val)
test_features = np.array(test)
model = tf.keras.Sequential([
tf.keras.layers.Dense(128, activation='relu', input_shape=(train_features.shape[-1],)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dropout(0.3),
tf.keras.layers.Dense(3, activation='sigmoid'),
])
model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'],
run_eagerly=True)
epochs = 10
batch_size = 100
history = model.fit(
train_features,
train_labels,
epochs=epochs,
validation_data=(val_features, val_labels))
input_data_frame = pd.read_csv('input.csv')
input_data_frame.head()
input_data = np.array(input_data_frame)
print(model.predict(input_data))

输入.csv如下所示:

power_0,power_1
0.8,0.1
0.7,0.2

实际结果是:

[[0.00604381 0.00242573 0.00440606]
[0.01321151 0.00634229 0.01041476]]

我希望得到每个标签的概率("赢"、"平"和"输"(,任何人都可以帮我解决这个问题吗?

提前致谢

在此行中使用 softmax 激活tf.keras.layers.Dense(3, activation='sigmoid').

这适用于我的例子:

model = tf.keras.Sequential([
tf.keras.layers.Flatten(input_shape=(train_features.shape[-1],)),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(16, activation='relu'),
tf.keras.layers.Dense(3, activation='softmax'),
])
model.compile(
optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'],
run_eagerly=True)

使用拼合图层

我必须在这里写下我的建议,因为我还不能发表评论。 @zihaozhihao是正确的,你必须使用softmax而不是sigmoid,因为你不处理二进制问题。另一个问题可能是您的损失函数,即:

model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'],
run_eagerly=True)

尝试使用loss='categorical_crossentropy',,因为您正在使用多标签分类。您可以在此处和此处阅读有关可乘分类的更多信息。

至于你的可行性问题。您可以获得每个类对两个测试输入的可执行性。例如: win draw loss [[0.00604381 0.00242573 0.00440606] [0.01321151 0.00634229 0.01041476]]问题是你的损失函数和激活函数,它导致了奇怪的概率值。您可能想在此处查看此帖子以获取更多信息。

希望这有所帮助,并随时询问。

由于这是一个多类分类问题,请使用categorical_crossentropy而不是binary_crossentropy表示损失函数n,也使用softmax而不是sigmoid作为激活函数

此外,您应该增加您的 epoch以获得更好的收敛。

最新更新