Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Tensorflow结构化数据模型.predict()返回不正确的概率_Python 3.x_Tensorflow_Machine Learning - Fatal编程技术网

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

Python 3.x Tensorflow结构化数据模型.predict()返回不正确的概率,python-3.x,tensorflow,machine-learning,Python 3.x,Tensorflow,Machine Learning,我正在尝试按照Tensorflow教程(我是初学者)进行学习,并在此过程中进行了一些更改 我的目的是创建一个模型,为其提供类似以下内容的数据(csv格式)(该示例只有2个功能,但我想在解决后对其进行扩展): 我使用以下代码创建了模型: 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

我正在尝试按照Tensorflow教程(我是初学者)进行学习,并在此过程中进行了一些更改

我的目的是创建一个模型,为其提供类似以下内容的数据(csv格式)(该示例只有2个功能,但我想在解决后对其进行扩展):

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

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))
input.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')

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

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

model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'],
run_eagerly=True)
尝试使用
loss='classifical\u crossentropy',
,因为您使用的是多标签分类。您可以阅读更多关于多标签分类和分类的信息

至于你的可能性问题。您可以获得两个测试输入的每个类的概率。例如:

胜负
[[0.00604381 0.00242573 0.00440606]
[0.0132151 0.00634229 0.01041476]]
问题是你的损失函数和激活函数导致了奇怪的概率值。您可能想查看这里的帖子以了解更多信息


希望这有点帮助,请随意提问。

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

model.compile(
optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'],
run_eagerly=True)
尝试使用
loss='classifical\u crossentropy',
,因为您使用的是多标签分类。您可以阅读更多关于多标签分类和分类的信息

至于你的可能性问题。您可以获得两个测试输入的每个类的概率。例如:

胜负
[[0.00604381 0.00242573 0.00440606]
[0.0132151 0.00634229 0.01041476]]
问题是你的损失函数和激活函数导致了奇怪的概率值。您可能想查看这里的帖子以了解更多信息


希望这有点帮助,请随意提问。

这对我来说非常适合你的例子:

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)

使用展平层

这对我来说非常适用于您的示例:

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)

使用展平层

由于这是一个多类分类问题,请使用分类交叉熵代替二进制交叉熵用于损失函数n,也使用softmax代替sigmoid作为激活函数


此外,你应该增加你的时代,以获得更好的融合

由于这是一个多类分类问题,请使用分类交叉熵代替二元交叉熵作为损失函数n,也使用softmax代替sigmoid作为激活函数



此外,你应该增加你的时代,以获得更好的融合

我尝试了这个方法,但现在我得到了
[[0.33328226 0.33350918 0.33320865]]
或类似的每个输入,并且由于从0.6更改为0.2-0,精度下降。3@AlonYampolski模型会聚吗?不确定模型会聚是什么意思,就像我说的,我对tensorflow很陌生☺️哦,没关系。你训练了多少个时代的模特?验证损失是否停止减少?使用
sigmoid
时,验证损失在-4.08和-0.22之间移动,使用“softmax”时,验证损失在1.1上稳定。我将epochs设置为10我尝试过这个,但现在我得到了
[[0.33328226 0.33350918 0.33320865]
或类似的每个输入,并且由于从0.6更改为0.2-0,精度下降。3@AlonYampolski模型会聚吗?不确定模型会聚是什么意思,就像我说的,我对tensorflow很陌生☺️哦,没关系。你训练了多少个时代的模特?验证损失是否停止减少?使用
sigmoid
时,验证损失在-4.08和-0.22之间移动,使用“softmax”时,验证损失在1.1上稳定。我将epochs设置为10我尝试了您建议的更改,但不幸的是,我仍然得到了意外的结果:
[[0.33328226 0.33350918 0.33320865]
但是如果我是正确的,您现在得到了一个分发版。如果我没弄错的话,上面说33%赢33%平33%输?也许你可以告诉我你期望的是什么,这样我就可以试着理解:)问题是,对于我尝试的每一个输入,分布几乎是均匀的,我期望,也就是说,对于一个胜利,我将获得
[[0.7,0.2,0.1]]
由于概率分布不均,我可以问您使用了多少个培训示例,您的培训精度/损失与验证精度/损失是多少?因为您的实现可能很好,所以您的模型只是不太合适:)此外,您可能希望为历代取一个更高的数字,以便给您的模型时间从您的数据中准确地学习。你只训练10个时期,这是一个很低的学习次数。将损失更改为
categorical\u crossentropy
后,训练结果为
loss:3.1619-acc:0.2797-val\u loss:3.3370-val\u acc:0.1500
和验证为
loss:3.3287-acc:0.1400
。我有1000个样本,但我可以生成尽可能多的样本。我尝试了您建议的更改,但不幸的是,我仍然得到了意外的结果:
[[0.33328226 0.33350918 0.33320865]
但是如果我是公司的话,您现在可以得到一个分发版