我使用Keras,尝试使用不同的数据分割循环10次训练课程。不过,在每个循环之后,我的准确性提高了很多,可能是因为它没有重置并且看到了新的组中的新数据(接受训练的数据可能会出现在测试下一个循环中)
我希望model.fit将其重置为pr. an answer here saying it does so,但我无法将其重置。然后,我在循环as pr. example 1 here的开始尝试了K.clear_session(),但是它什么也没做。我可以第一次保存未经训练的模型,然后在循环开始时重新加载它,但这似乎是一种不好的方法/不好的做法。我该怎么办/我做错了吗?
from tensorflow.keras import backend as K
for i in range(0, 10):
print("Starting loop " + str(i))
K.clear_session()
model = keras.Model(inputs=inputs, outputs=outputs, name="SchoolProject")
model.compile(loss=tensorflow.keras.losses.binary_crossentropy, optimizer=tensorflow.keras.optimizers.Adam(lr=hpInitialLearningRate), metrics=['accuracy'])
trainData, valData, testData, trainTruth, valTruth, testTruth = getTrainValAndTestSet()
model.fit(trainData, trainTruth, epochs=hpEpochs, verbose=1, callbacks=callbacks_list, validation_data=(valData, valTruth))
score = model.evaluate(testData, testTruth, verbose=1)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
testAccList.append(score[1])
print("Ending loop " + str(i))
答案 0 :(得分:3)
最简单的方法是在循环中定义模型。这是一个例子。您会看到,每次迭代的准确性都是从随机开始的,然后才有所改善。
import tensorflow as tf
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train = x_train.astype("float32") / 255
x_test = x_test.astype("float32") / 255
for i in range(5):
model = tf.keras.Sequential([
tf.keras.Input(shape=(28, 28)),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(32, activation='relu'),
tf.keras.layers.Dense(64, activation='relu'),
tf.keras.layers.Dense(10, activation="softmax"),
])
model.compile(loss="sparse_categorical_crossentropy", optimizer="adam",
metrics=["accuracy"])
model.fit(x_train, y_train, batch_size=16, epochs=1, validation_split=0.1)
手动重置权重是little more complicated。