【问题标题】:tf.keras `predict()` gets different resultstf.keras `predict()` 得到不同的结果
【发布时间】:2019-03-14 08:46:10
【问题描述】:

我在玩 tf.keras 并在两个具有相同权重初始化的 Model 对象上运行了一些 predict() 方法。

import numpy as np
import tensorflow as tf
from tensorflow.keras.layers import LSTM, Masking, Input, Embedding, Dense
from tensorflow.keras.models import Model

tf.enable_eager_execution()
np.random.seed(10)

X = np.asarray([
    [0, 1, 2, 3, 3],
    [0, 0, 1, 1, 1],
    [0, 0, 0, 1, 1],
])

y = [
    0,
    1,
    1
]

seq_len = X.shape[1]

inp = Input(shape=[seq_len])
emb = Embedding(4, 10, name='embedding')(inp)

x = emb
x = LSTM(5, return_sequences=False, name='lstm')(x)
out = Dense(1, activation='sigmoid', name='out')(x)

model = Model(inputs=inp, outputs=out)
model.summary()

preds = model.predict(X)

inp = Input(shape=[seq_len])
emb = Embedding(4, 10, name='embedding', weights=model.get_layer('embedding').get_weights()[0])(inp)

x = emb
x = LSTM(5, return_sequences=False, weights=model.get_layer('lstm').get_weights()[0])(x)
out = Dense(1, activation='sigmoid', weights=model.get_layer('out').get_weights()[0])(x)

model_2 = Model(inputs=inp, outputs=out)
model_2.summary()

preds_2 = model_2.predict(X)

print(preds, preds_2)

我不知道为什么,但两个预测的结果是不同的。当我运行print 函数时,我得到了这些。你可能会得到不同的东西。

[[0.5027414 ]
 [0.5019673 ]
 [0.50134844]] [[0.5007331]
 [0.5002397]
 [0.4996575]]

我想了解keras 的工作原理。任何解释将不胜感激。谢谢。

注意:这里不涉及任何学习。我不明白随机性从何而来。

【问题讨论】:

  • @Justice_Lords 我没有调用任何 model.fit()。我只是在初始化一个与其他模型具有相同权重的模型,并在 X 上进行预测
  • 我不明白为什么这被标记为与stackoverflow.com/questions/50659482/… 重复我没有训练模型或任何东西,所以我不明白随机性来自哪里。

标签: python tensorflow machine-learning keras


【解决方案1】:

尝试将优化器从 adam 更改为 SGD 或其他。我注意到,使用相同的模型,我得到了不同的结果,它解决了问题。另外,查看here 以修复初始权重。顺便说一句,我不知道优化器为什么以及如何影响使用相同模型的测试时间的结果。

【讨论】:

  • 问题中的代码没有进行任何训练,因此根本没有使用优化器。第二个模型的初始化也使用与第一个模型相同的权重。这篇文章并没有真正回答关于结果差异从何而来的问题。最好在发答案之前先仔细阅读原帖、其他人的答案和cmets。
【解决方案2】:

这是你没有复制所有的权重。我不知道为什么你的调用机械地起作用,但很容易看出你不是通过检查没有 [0] 索引的 get_weights 。

例如,这些没有被复制:

model.get_layer('lstm').get_weights()[1]


array([[ 0.11243069, -0.1028666 ,  0.01080172, -0.07471965,  0.05566487,
        -0.12818974,  0.34882438, -0.17163819, -0.21306667,  0.5386005 ,
        -0.03643916,  0.03835883, -0.31128728,  0.04882491, -0.05503649,
        -0.22660127, -0.4683674 , -0.00415642, -0.29038426, -0.06893865],
       [-0.5117522 ,  0.01057898, -0.23182054,  0.03220385,  0.21614116,
         0.0732751 , -0.30829042,  0.06233712, -0.54017985, -0.1026137 ,
        -0.18011908,  0.15880923, -0.21900705, -0.11910527, -0.03808065,
         0.07623457, -0.13157862, -0.18740109,  0.06135096, -0.21589288],
       [-0.2295578 , -0.12452635, -0.08739456, -0.1880849 ,  0.2220488 ,
        -0.14575425,  0.32249492,  0.05235165, -0.09479579,  0.2496742 ,
         0.10411342, -0.0263749 ,  0.33186644, -0.1838699 ,  0.28964192,
        -0.2414586 ,  0.41612682,  0.13791762,  0.13942356, -0.36176005],
       [-0.14428475, -0.02090888,  0.27968913,  0.09452424,  0.1291543 ,
        -0.43372717, -0.11366601,  0.37842247,  0.3320751 ,  0.21959782,
        -0.4242381 ,  0.02412989, -0.24809352,  0.2508208 , -0.06223384,
         0.08648364,  0.17311276, -0.05988384,  0.02276517, -0.1473657 ],
       [ 0.28600952, -0.37206012,  0.21376705, -0.16566195,  0.0833357 ,
        -0.00887177,  0.01394618,  0.5345957 , -0.25116244, -0.17159337,
         0.096329  , -0.32286254,  0.02044407, -0.1393016 , -0.0767666 ,
         0.1505355 , -0.28456056,  0.16909163,  0.16806729, -0.14622769]],
      dtype=float32)

但如果你在模型 2 中命名 lstm 层,你可以看到权重的部分不相等。

model_2.get_layer("lstm").get_weights()[1] - model.get_layer("lstm").get_weights()[1]

【讨论】:

    【解决方案3】:

    机器学习的问题在于它的学习方式并不总是完全相同。它涉及很多概率,因此在更大的范围内,结果会趋向于向一个值收敛,但单独运行可以并且会给出不同的结果。

    More info here

    多次使用相同的输入数据运行是绝对正常的 给出不同的输出。这主要是由于内部随机性 此类机器学习技术(例如:ANN、决策树 构建算法等)。

    - Nabil Belgasmi,马努巴大学

    没有特定的方法或技术。结果和 绩效评估取决于几个因素: 数据 类型,归纳函数的参数,训练集(监督), 等等。重要的是比较使用度量的结果 测量值,例如召回率、精度、F_measure、ROC 曲线或其他 图形方法。

    - 耶稣安东尼奥莫塔拉瓦尔大学

    编辑 predict() 函数接受一个或多个数据实例的数组。

    下面的示例演示了如何对具有未知预期结果的多个数据实例进行回归预测。

    # example of making predictions for a regression problem
    from keras.models import Sequential
    from keras.layers import Dense
    from sklearn.datasets import make_regression
    from sklearn.preprocessing import MinMaxScaler
    # generate regression dataset
    X, y = make_regression(n_samples=100, n_features=2, noise=0.1, random_state=1)
    scalarX, scalarY = MinMaxScaler(), MinMaxScaler()
    scalarX.fit(X)
    scalarY.fit(y.reshape(100,1))
    X = scalarX.transform(X)
    y = scalarY.transform(y.reshape(100,1))
    # define and fit the final model
    model = Sequential()
    model.add(Dense(4, input_dim=2, activation='relu'))
    model.add(Dense(4, activation='relu'))
    model.add(Dense(1, activation='linear'))
    model.compile(loss='mse', optimizer='adam')
    model.fit(X, y, epochs=1000, verbose=0)
    # new instances where we do not know the answer
    Xnew, a = make_regression(n_samples=3, n_features=2, noise=0.1, random_state=1)
    Xnew = scalarX.transform(Xnew)
    # make a prediction
    ynew = model.predict(Xnew)
    # show the inputs and predicted outputs
    for i in range(len(Xnew)):
        print("X=%s, Predicted=%s" % (Xnew[i], ynew[i]))
    

    运行示例进行多个预测,然后并排打印输入和预测以供审核。

    X=[0.29466096 0.30317302], Predicted=[0.17097184]
    X=[0.39445118 0.79390858], Predicted=[0.7475489]
    X=[0.02884127 0.6208843 ], Predicted=[0.43370453]
    

    SOURCE

    免责声明:predict() 函数本身有点随机(概率)

    【讨论】:

    • 您对实际答案的期望是什么? OP要求解释。
    • @JessicaChambers 我没有重新训练任何模型。我只是简单地用另一个模型的权重初始化了一些模型,并在相同的X 上进行预测。这里不涉及任何学习。
    • @HardianLawi predict() 函数本身有点随机(概率),是机器学习的一种形式。查看第 3 节。此页面上的回归预测 machinelearningmastery.com/…
    • @JessicaChambers,如果您在此答案的主体中添加评论“predict() 函数本身有点随机......”,我认为您会改进您的答案。
    • 我认为您将 trainingprediction 混淆了。您的来源指的是(随机)训练阶段之前的预测。正如 OP 所指出的,权重是固定的,因此没有训练步骤或任何 ML,因此每次的结果都应该相同。
    猜你喜欢
    • 2014-06-22
    • 2020-02-20
    • 1970-01-01
    • 2023-03-19
    • 2018-02-19
    • 2020-10-06
    • 1970-01-01
    • 2021-12-15
    • 2019-09-26
    相关资源
    最近更新 更多