使用keras保存和加载模型

17 篇文章 0 订阅
7 篇文章 0 订阅

具体工程访问GitHub:https://github.com/ChaoflyLi/kerasSaveLoadModel

里面的代码通俗易懂

1、模型保存

# 导入模块
import os
import numpy as np
import keras as K
import tensorflow as tf
import pandas as pd
from keras.callbacks import ModelCheckpoint
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelBinarizer
from keras.models import Sequential
from keras.layers import Dense, Activation

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'


# 读取CSV数据集,并拆分为训练集和测试集
# 该函数的传入参数为CSV_FILE_PATH: csv文件路径
def load_data(CSV_FILE_PATH):
    IRIS = pd.read_csv(CSV_FILE_PATH)
    target_var = 'class'  # 目标变量
    # 数据集的特征
    features = list(IRIS.columns)
    features.remove(target_var)
    # 目标变量的类别
    Class = IRIS[target_var].unique()
    # 目标变量的类别字典
    Class_dict = dict(zip(Class, range(len(Class))))
    # 增加一列target, 将目标变量进行编码
    IRIS['target'] = IRIS[target_var].apply(lambda x: Class_dict[x])
    # 对目标变量进行0-1编码(One-hot Encoding)
    lb = LabelBinarizer()
    lb.fit(list(Class_dict.values()))
    transformed_labels = lb.transform(IRIS['target'])
    y_bin_labels = []  # 对多分类进行0-1编码的变量
    for i in range(transformed_labels.shape[1]):
        y_bin_labels.append('y' + str(i))
        IRIS['y' + str(i)] = transformed_labels[:, i]
    # 将数据集分为训练集和测试集
    train_x, test_x, train_y, test_y = train_test_split(IRIS[features], IRIS[y_bin_labels], \
                                                        train_size=0.7, test_size=0.3, random_state=0)
    return train_x, test_x, train_y, test_y, Class_dict


def main():
    # 0. 开始
    print("\nIris dataset using Keras/TensorFlow ")
    np.random.seed(4)
    tf.set_random_seed(10)

    # 1. 读取CSV数据集
    print("Loading Iris data into memory")
    CSV_FILE_PATH = './iris.csv'
    train_x, test_x, train_y, test_y, Class_dict = load_data(CSV_FILE_PATH)

    # 2.定义模型
    init = K.initializers.glorot_uniform(seed=1)
    model = Sequential()
    model.add(Dense(20, input_shape=(4,), kernel_initializer=init, activation='relu', name='dense_1'))
    model.add(Dense(10, kernel_initializer=init, activation='relu', name='dense_2'))
    model.add(Dense(10, kernel_initializer=init, activation='relu', name='dense_3'))
    model.add(Dense(10, kernel_initializer=init, activation='relu', name='dense_4'))
    model.add(Dense(3, kernel_initializer=init, activation='softmax', name='output'))
    model.compile(loss='categorical_crossentropy', optimizer=K.optimizers.Adam(), metrics=['accuracy'])

    # 3. 训练模型同时保存效果最好的模型
    batchSize = 5
    Epochs = 20
    print("Starting training ")
    filepath = "weightsBest.hdf5"
    # 保存效果最好的模型
    checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, save_best_only=True,
                                 mode='max')
    callbacks_list = [checkpoint]
    # Fit the model
    model.fit(train_x, train_y, validation_data=(test_x, test_y),
              batch_size=batchSize, epochs=Epochs, shuffle=True,
              verbose=2, callbacks=callbacks_list)
    print("Training finished \n")


if __name__ == '__main__':
    main()

2、模型导入

import numpy as np
from keras.models import load_model
from keras.models import Model

filepath = "weightsBest.hdf5"
unknownVector = np.array([[6.1, 3.1, 5.1, 1.1]], dtype=np.float32)

# 4. 模型的加载及使用其中某一层作为输出
print("Using loaded model to predict...")
model = load_model(filepath)
model.summary()
for i in model.layers:
    print(i.name)
# 一共有5层,使用第3层作为输出
intermediateLayey = Model(inputs=model.input,
                          outputs=model.get_layer('dense_3').output)  # 创建的新模型
# 一共有5层,使用最后一层作为输出
ouputLayer = Model(inputs=model.input,
                   outputs=model.output)  # 创建的新模型

intermediateLayeyPredicted = intermediateLayey.predict(unknownVector)
print("使用第3层作为输出,第三层的输出向量为{vector},输出数据的长度为{length}"\
      .format(vector=str(model.get_layer('dense_3').output_shape),length=intermediateLayeyPredicted.size))
print("\n第3层的数据输出")
print(intermediateLayeyPredicted)
ouputLayerPredicted = ouputLayer.predict(unknownVector)
print("\n使用最后一层作为输出")
print(ouputLayerPredicted)
print("\n输出值最大的位置是:({})".format(np.argmax(ouputLayerPredicted)+1))


 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值