Machine learning 为什么tensorflow.h5模型文件的大小取决于存储它的回调函数?

Machine learning 为什么tensorflow.h5模型文件的大小取决于存储它的回调函数?,machine-learning,python,tensorflow,Machine Learning,Python,Tensorflow,如果我想训练tensorflow机器学习模型并在每次训练后将模型存储在硬盘上,我可以使用以下代码(Python): 但是,我也可以使用自定义的、可能更复杂的逻辑来决定何时保存模型: class CustomSaver(Callback): def on_epoch_end(self, epoch, logs={}): self.model.save_weights("model_{}.h5".format(epoch)) saver = CustomSaver()

如果我想训练tensorflow机器学习模型并在每次训练后将模型存储在硬盘上,我可以使用以下代码(Python):

但是,我也可以使用自定义的、可能更复杂的逻辑来决定何时保存模型:

class CustomSaver(Callback):
def on_epoch_end(self, epoch, logs={}):
    self.model.save_weights("model_{}.h5".format(epoch))

saver = CustomSaver()
history = model.fit(train_it, steps_per_epoch=len(train_it), validation_data=test_it, validation_steps=len(test_it), epochs=numberOfTrainingEpochs, verbose=0, callbacks=saver)
两个文件都使用ML模型创建.h5文件,但是,第一个文件创建的文件大小约为100 MB,而第二个文件创建的文件大小约为50 MB。这些文件之间有什么区别?原因是什么

仅供参考,我的模型是一个相对简单的CNN,定义如下:

model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(224, 224, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu', kernel_initializer='he_uniform'))
model.add(Dense(1, activation='sigmoid'))
opt = SGD(lr=0.001, momentum=0.9)
model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])
根据,回调
ModelCheckpoint
会保存完整的模型,而不是默认情况下仅保存其权重。此行为由参数
save\u weights\u only
控制。如果只想保存权重,可以使用创建回调

checkpoint=ModelCheckpoint('model{epoch:08d}.h5',save_freq=1,save_weights_only=True)
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same', input_shape=(224, 224, 3)))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu', kernel_initializer='he_uniform', padding='same'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(128, activation='relu', kernel_initializer='he_uniform'))
model.add(Dense(1, activation='sigmoid'))
opt = SGD(lr=0.001, momentum=0.9)
model.compile(optimizer=opt, loss='binary_crossentropy', metrics=['accuracy'])