tf.keras`predict()`得到不同的结果

时间:2019-03-14 08:46:11

标签: python tensorflow machine-learning keras

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

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的工作方式。任何解释将不胜感激。谢谢。

注意:此处不涉及学习。我不知道随机性来自哪里。

3 个答案:

答案 0 :(得分:0)

尝试将优化程序从 adam 更改为 SGD 或其他设置。我注意到,使用相同的模型,我曾经获得不同的结果,并且解决了该问题。另外,看看here可以确定初始权重。顺便说一句,我不知道优化器为何以及如何在相同模型下的测试时间内影响结果。

答案 1 :(得分:0)

这是您没有复制所有的砝码。我不知道为什么您的通话会自动运行,但真的很容易看到您没有通过没有索引[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]

答案 2 :(得分:-1)

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

More info here

  

许多输入相同的数据运行绝对是正常的   给出不同的输出。这主要是由于内部的随机性   机器学习技术的例子(例如:人工神经网络,决策树   构建算法等)。

-马努巴大学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