我在Keras中训练了一个名为model_2
的模型,并使用model.predict
进行预测,但当我重新运行代码时,发现结果完全不同。例如,第一次column 0
的所有概率值都接近1,但下一次运行时,概率值都接近0。这是否与内存或我在其他帖子中看到的stateful
参数有关?
X = df.iloc[:,1:10161]X = X.to_numpy() X = X.reshape([X.shape[0], X.shape[1],1]) X_train_1 = X[:,0:10080,:]X_train_2 = X[:,10080:10160,:].reshape(17,80)inputs_1 = keras.Input(shape=(10080, 1))layer1 = Conv1D(64, 14)(inputs_1)layer2 = layers.MaxPool1D(5)(layer1)layer3 = Conv1D(64, 14)(layer2) layer4 = layers.GlobalMaxPooling1D()(layer3)layer5 = layers.Dropout(0.2)(layer4)inputs_2 = keras.Input(shape=(80,))layer6 = layers.concatenate([layer5, inputs_2])layer7 = Dense(128, activation='relu')(layer6)layer8 = layers.Dropout(0.5)(layer7)layer9 = Dense(2, activation='softmax')(layer8)model_2 = keras.models.Model(inputs = [inputs_1, inputs_2], outputs = [layer9])adam = keras.optimizers.Adam(lr = 0.0001)model_2.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['acc'])prediction = pd.DataFrame(model_2.predict([X_train_1,X_train_2]),index = df.iloc[:,0]) pred = np.argmax(model_2.predict([X_train_1,X_train_2]), axis=1) display(prediction, pred)
矛盾结果的示例:
试验1:
0 1id 11 1.131853e-07 1.00000022 1.003963e-06 0.99999933 1.226156e-07 1.00000044 9.985497e-08 1.00000055 1.234705e-07 1.00000066 1.189311e-07 1.00000077 6.631822e-08 1.00000088 9.586067e-08 1.00000099 9.494666e-08 1.000000
试验2:
0 1id 11 0.183640 0.81636022 0.487814 0.51218733 0.151600 0.84840044 0.135977 0.86402355 0.120982 0.87901866 0.171371 0.82862977 0.199774 0.80022688 0.133711 0.86628999 0.125785 0.874215
试验3:
0 1id 11 0.900128 0.09987222 0.573520 0.42648033 0.948409 0.05159144 0.955184 0.04481655 0.959075 0.04092566 0.945758 0.05424277 0.956582 0.04341888 0.954180 0.04582099 0.964601 0.035399
试验4:
0 1id 11 1.0 4.697790e-0822 1.0 2.018885e-0733 1.0 2.911827e-0844 1.0 2.904826e-0855 1.0 1.368165e-0866 1.0 2.742492e-0877 1.0 1.461449e-0888 1.0 2.302636e-0899 1.0 2.099636e-08
模型训练使用了以下代码:
n_folds = 10skf = StratifiedKFold(n_splits=n_folds, shuffle=True)skf = skf.split(X_train_1, Y_cat)cv_score = []for i, (train, test) in enumerate(skf): model_2 = my_model() history = model_2.fit([X_train_1[train], X_train_2[train]], Y[train], validation_data=([X_train_1[test], X_train_2[test]], Y[test]), epochs=120, batch_size=10) result = model_2.evaluate([X_train_1[test], X_train_2[test]], Y[test]) keras.backend.clear_session()
回答:
这是完全正常的,当你创建一个新模型时,其权重会被随机初始化,因此每次运行这段代码时,预测结果都会发生变化。