循环model.fit

时间:2020-10-27 13:59:29

标签: python tensorflow keras deep-learning neural-network

我使用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))

1 个答案:

答案 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