Keras内部权重内存--为什么一个纪元的多次拟合()还能看到改进?

问题描述 投票:0回答:1

我正在写一篇 keras lstm 在python中的模型。如果我有下面的 fit() 编码

for i in range(0, epochs):
    model.fit(X_train, y_train, epochs=1, batch_size=32, validation_data=[X_test, y_test], shuffle=True)

我希望每个时代都是独立于前一个时代的,即每个连续的时代都没有明显的改进。然而,事实并非如此。上述代码的工作原理与写作完全相同。

model.fit(X_train, y_train, epochs=epochs, batch_size=32, validation_data=[X_test, y_test], shuffle=True)

我知道 keras 拥有 model.reset_states() 函数,但我不相信重置状态,重置权重,并在第一个代码块中独立开始一个新的纪元。那么如何 keras 保存独立的权重和其他数据 fit() 函数,如何重置它?

python tensorflow keras epoch
1个回答
0
投票

fit 功能只 更新 的权重。这就是为什么如果你叫 fit 几次,你每次都会更新权重。


0
投票

正如 @Yoskutik 指出的,fit 只更新权重。

如果要在每个纪元后重设权重,你可以这样做。

import numpy as np
import tensorflow as tf # (TensorFlow version 2.2)

# build dummy model
inputs = tf.keras.layers.Input((1,))
output = tf.keras.layers.Dense(1, kernel_initializer='zeros')(inputs)
model = tf.keras.models.Model(inputs=inputs, outputs=output)
model.compile(loss='mse', optimizer='sgd')

# dummy data
X = np.arange(10)
y = np.arange(10, 20)

initial_weights = model.get_weights() # get the initial weights (in this case zeros)
for _ in range(5):
    model.fit(X, y, epochs=1, verbose=0)
    print('weights after one epoch of training =')
    print('kernel:0 = {}'.format(np.squeeze(model.trainable_variables[0].numpy())))
    print('bias:0 = {}\n'.format(np.squeeze(model.trainable_variables[1].numpy())))
    model.set_weights(initial_weights) # set initial_weights after epoch is done

>> output:
weights after one epoch of training =
kernel:0 = 1.46999990940094
bias:0 = 0.28999999165534973

weights after one epoch of training =
kernel:0 = 1.46999990940094
bias:0 = 0.28999999165534973

weights after one epoch of training =
kernel:0 = 1.46999990940094
bias:0 = 0.28999999165534973

weights after one epoch of training =
kernel:0 = 1.46999990940094
bias:0 = 0.28999999165534973

weights after one epoch of training =
kernel:0 = 1.46999990940094
bias:0 = 0.2900000214576721

希望能帮到你

© www.soinside.com 2019 - 2024. All rights reserved.