【问题标题】:Unable to reset model when looping model.fit循环 model.fit 时无法重置模型
【发布时间】:2021-02-09 19:54:57
【问题描述】:

使用 Keras,我尝试使用不同的数据拆分循环训练 10 次。不过,在每个循环之后,我的准确率可能会提高很多,可能是因为它不会重置并在新组中看到新数据(训练过的数据可能会出现在测试下一个循环中)

我希望 model.fit 将其重置为pr. an answer here saying it does so,但我无法做到。然后我在循环开始时尝试了 K.clear_session(),as pr. example 1 here,但它什么也没做。我可以第一次保存未经训练的模型并在循环开始时重新加载它,但这似乎是一种不好的方法/不好的做法。我能做些什么/我做错了吗?

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))

【问题讨论】:

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


    【解决方案1】:

    最简单的方法是在循环内定义您的模型。这是一个例子。您会看到,每次迭代,准确度都是随机开始的,然后才会提高。

    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

    【讨论】:

    • 谢谢。似乎它有效,尽管这是循环它的正确方法吗?
    • 是的。为什么不呢?
    • 我在其他地方遇到了问题,比如在使用 Tensorboard 时,因为它将所有内容都解释为一次运行。然后图表将显示例如准确率缓慢增加,然后迅速回到 50% 并再次缓慢上升,因为它执行了一个新的“循环”。有人提到我应该能够只循环拟合并避免每次都定义一个新模型(但我不关心这一步,因为它不需要很长时间)。我想将它保留为循环的一部分的原因是因为我想使用循环中完成的所有运行来计算一些东西。
    • 坦率地说,这是您提出的问题的解决方案。如何实现 Tensorboard 超出了这个问题的范围。不过,当然可以让 Tensorboard 重置指标。这超出了 this 帖子的范围。
    • 是的,我明白,但这不是专门针对 tensorboard 的问题。我只是在寻找有关循环网络的最佳“代码实践”的指导,因为我没有正确格式化代码的经验。我经常实现技术上可行的东西,后来被告知有更好或“正确”的方式(为了可读性和兼容性)。但这可行,我想可以让第二个文件多次运行这样的网络,然后返回我想要的指标。
    猜你喜欢
    • 2020-12-10
    • 1970-01-01
    • 2017-08-06
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 2016-08-01
    • 2019-09-30
    • 1970-01-01
    相关资源
    最近更新 更多