首先是代码:
import numpy as npnp.random.seed(1231)from keras import backend as Kimport picklefrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, Activation, Flattenfrom keras.layers import Conv1D, MaxPooling1Dfrom keras.utils import np_utilsfrom sklearn.model_selection import train_test_splitfrom keras import initializersdata=pickle.load(open('DATA.pkl','rb'),encoding='latin1')X=np.array(data[0])Y=np.array(data[1])X-=np.min(X)X/=np.max(X)X_train, X_test, Y_train, Y_test =train_test_split(X,Y,test_size=0.25, random_state=456)X_train = X_train.reshape(X_train.shape[0],1000,1)X_test = X_test.reshape(X_test.shape[0],1000,1)model = Sequential()model.add(Flatten(input_shape=(1000,1)))gu=initializers.glorot_uniform(seed=789)model.add(Dense(1, activation='sigmoid',kernel_initializer=gu))model.compile(loss='binary_crossentropy',optimizer='adam', metrics=['accuracy'])model.fit(X_train, Y_train,batch_size=1, epochs=1, verbose=2,shuffle=False)score = model.evaluate(X_test, Y_test, verbose=0)print(score)print(model.get_layer(index=2).get_weights())
然后是输出,有时像这样:
Epoch 1/1 - 1s - loss: 0.8007 - acc: 0.4720[0.70776916790008548, 0.53200000023841854][array([[ 2.89239828e-03], [ -1.48389703e-02], [ 7.60693178e-02], ... [ 2.92943567e-02], [ 1.84460226e-02], [ 2.38316301e-02]], dtype=float32), array([-0.00218478], dtype=float32)]
但有时像这样:
Epoch 1/1 - 1s - loss: 0.8008 - acc: 0.4720[0.7077700834274292, 0.53200000023841854][array([[ 2.89072399e-03], [ -1.48402918e-02], [ 7.60683641e-02], ... [ 2.92898733e-02], [ 1.84418838e-02], [ 2.38287449e-02]], dtype=float32), array([-0.00218458], dtype=float32)]
每次输出在这种简单的网络中都是不同的。
我已经设置了随机种子,但它们似乎效果不佳。
那么,代码的问题出在哪里?(我希望它能有完全可重现的输出)
回答:
尝试使用tf.random.set_seed()
来全局设置种子,以防在你未预料的地方使用了其他随机性 – 例如,可能是优化器的原因。
在版本1中,它是tf.set_random_seed()
。