【机器学习】自定义数据集 使用tensorflow框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测

一、使用tensorflow框架实现逻辑回归

1. 数据部分

  • 首先自定义了一个简单的数据集,特征 X 是 100 个随机样本,每个样本一个特征,目标值 y 基于线性关系并添加了噪声。
  • tensorflow框架不需要numpy 数组转换为相应的张量,可以直接在模型中使用数据集。

2. 模型定义部分

方案 1:model = tf.keras.Sequential([tf.keras.layers.Dense(1, input_shape=(1,))])

解释

  • 此方案使用 tf.keras.Sequential 构建模型,在列表中直接定义了一个 Dense 层,input_shape=(1,) 表明输入数据的形状。
  • 编译模型时,选择随机梯度下降(SGD)优化器和均方误差损失函数。
  • 训练完成后,使用 sklearn 的指标评估模型,并输出模型的系数和截距。
import tensorflow as tf
import numpy as np
from sklearn.metrics import mean_squared_error, r2_score

# 自定义数据集
X = np.random.rand(100, 1).astype(np.float32)
y = 2 * X + 1 + 0.3 * np.random.randn(100, 1).astype(np.float32)

# 构建模型
model = tf.keras.Sequential([
    tf.keras.layers.Dense(1, input_shape=(1,))
])

# 编译模型
model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.01),
              loss='mean_squared_error')

# 训练模型
history = model.fit(X, y, epochs=1000, verbose=0)

# 模型评估
y_pred = model.predict(X)
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)
print(f"均方误差 (MSE): {mse}")
print(f"决定系数 (R²): {r2}")

# 输出模型的系数和截距
weights, biases = model.layers[0].get_weights()
print(f"模型系数: {weights[0][0]}")
print(f"模型截距: {biases[0]}")

方案 2:model = tf.keras.Sequential()

解释

  • 这种方式先创建一个空的 Sequential 模型,再使用 add 方法添加 Dense 层。
  • 后续编译、训练、评估和输出模型参数的步骤与方案 1 类似。
import tensorflow as tf
import numpy as np
from sklearn.metrics import mean_squared_error, r2_score

# 自定义数据集
X = np.random.rand(100, 1).astype(np.float32)
y = 2 * X + 1 + 0.3 * np.random.randn(100, 1).astype(np.float32)

# 构建模型
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(1, input_shape=(1,)))

# 编译模型
model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.01),
              loss='mean_squared_error')

# 训练模型
history = model.fit(X, y, epochs=1000, verbose=0)

# 模型评估
y_pred = model.predict(X)
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)
print(f"均方误差 (MSE): {mse}")
print(f"决定系数 (R²): {r2}")

# 输出模型的系数和截距
weights, biases = model.layers[0].get_weights()
print(f"模型系数: {weights[0][0]}")
print(f"模型截距: {biases[0]}")

方案 3:自定义模型类

解释

  • 继承 Model 基类创建自定义模型类 Linear,在 __init__ 方法中定义 Dense 层。
  • call 方法用于实现前向传播逻辑,类似于 PyTorch 中的 forward 方法。
  • 后续的编译、训练、评估和参数输出流程和前面方案一致。
import tensorflow as tf
from tensorflow.keras import Model
import numpy as np
from sklearn.metrics import mean_squared_error, r2_score

# 自定义数据集
X = np.random.rand(100, 1).astype(np.float32)
y = 2 * X + 1 + 0.3 * np.random.randn(100, 1).astype(np.float32)

# 自定义模型类
class Linear(Model):
    def __init__(self):
        super(Linear, self).__init__()
        self.linear = tf.keras.layers.Dense(1)

    def call(self, x, **kwargs):
        x = self.linear(x)
        return x

# 构建模型
model = Linear()

# 编译模型
model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.01),
              loss='mean_squared_error')

# 训练模型
history = model.fit(X, y, epochs=1000, verbose=0)

# 模型评估
y_pred = model.predict(X)
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)
print(f"均方误差 (MSE): {mse}")
print(f"决定系数 (R²): {r2}")

# 输出模型的系数和截距
weights, biases = model.linear.get_weights()
print(f"模型系数: {weights[0][0]}")
print(f"模型截距: {biases[0]}")

方案 4:函数式 API 构建模型

解释

  • 使用函数式 API 构建模型,先定义输入层,再定义 Dense 层,最后使用 Model 类将输入和输出连接起来形成模型。
  • 编译、训练、评估和参数输出的步骤和前面方案相同。注意这里通过 model.layers[1] 获取 Dense 层的权重和偏置,因为第一层是输入层。
import tensorflow as tf
import numpy as np
from sklearn.metrics import mean_squared_error, r2_score

# 自定义数据集
X = np.random.rand(100, 1).astype(np.float32)
y = 2 * X + 1 + 0.3 * np.random.randn(100, 1).astype(np.float32)

# 定义函数构建模型
def linear():
    input = tf.keras.layers.Input(shape=(1,), dtype=tf.float32)
    y = tf.keras.layers.Dense(1)(input)
    model = tf.keras.models.Model(inputs=input, outputs=y)
    return model

# 构建模型
model = linear()

# 编译模型
model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.01),
              loss='mean_squared_error')

# 训练模型
history = model.fit(X, y, epochs=1000, verbose=0)

# 模型评估
y_pred = model.predict(X)
mse = mean_squared_error(y, y_pred)
r2 = r2_score(y, y_pred)
print(f"均方误差 (MSE): {mse}")
print(f"决定系数 (R²): {r2}")

# 输出模型的系数和截距
weights, biases = model.layers[1].get_weights()
print(f"模型系数: {weights[0][0]}")
print(f"模型截距: {biases[0]}")

3. 训练和评估部分

  • 使用 fit 方法对模型进行训练,verbose=0 表示不显示训练过程中的详细信息,训练过程中的损失信息会存储在 history 对象中。
  • 通过多个 epoch 进行训练,每个 epoch 包含前向传播、损失计算、反向传播和参数更新。
  • 使用 predict 方法进行预测,计算均方误差和决定系数评估模型性能,通过 model.linear.get_weights() 获取模型的系数和截距。

二、保存tensorflow框架逻辑回模型

方式 1:保存为 HDF5 文件(后缀名 .h5

这种方式会保存模型的结构、权重以及训练配置(如优化器、损失函数等),加载时可以直接得到一个完整可用的模型。

import tensorflow as tf
import numpy as np

# 自定义数据集
# 生成 1000 个样本,每个样本有 2 个特征
X = np.random.randn(1000, 2).astype(np.float32)
# 根据特征生成标签
y = (2 * X[:, 0] + 3 * X[:, 1] > 0).astype(np.float32).reshape(-1, 1)

# 构建逻辑回归模型
model = tf.keras.Sequential([
    tf.keras.layers.Dense(1, input_shape=(2,), activation='sigmoid')
])

# 编译模型
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# 训练模型
model.fit(X, y, epochs=100, batch_size=32, verbose=1)

# 保存模型为 HDF5 文件
model.save('logistic_regression_model.h5')

# 加载 HDF5 文件模型
loaded_model = tf.keras.models.load_model('logistic_regression_model.h5')

# 生成新的测试数据
X_test = np.random.randn(100, 2).astype(np.float32)
y_test = (2 * X_test[:, 0] + 3 * X_test[:, 1] > 0).astype(np.float32).reshape(-1, 1)

# 进行预测
y_pred_probs = loaded_model.predict(X_test)
y_pred = (y_pred_probs > 0.5).astype(np.float32)

# 计算准确率
accuracy = tf.keras.metrics.BinaryAccuracy()
accuracy.update_state(y_test, y_pred)
print(f"预测准确率: {accuracy.result().numpy()}")

代码解释

  1. 数据生成与模型构建:生成自定义数据集,构建并编译逻辑回归模型,然后进行训练。
  2. 保存模型:使用 model.save('logistic_regression_model.h5') 将模型保存为 HDF5 文件。
  3. 加载模型:使用 tf.keras.models.load_model('logistic_regression_model.h5') 加载保存的模型。
  4. 预测与评估:生成新的测试数据,使用加载的模型进行预测,并计算预测准确率。

方式 2:只保存参数

这种方式只保存模型的权重参数,不保存模型的结构和训练配置。加载时需要先定义与原模型相同结构的模型,再将保存的参数加载到新模型中。

import tensorflow as tf
import numpy as np

# 自定义数据集
# 生成 1000 个样本,每个样本有 2 个特征
X = np.random.randn(1000, 2).astype(np.float32)
# 根据特征生成标签
y = (2 * X[:, 0] + 3 * X[:, 1] > 0).astype(np.float32).reshape(-1, 1)

# 构建逻辑回归模型
model = tf.keras.Sequential([
    tf.keras.layers.Dense(1, input_shape=(2,), activation='sigmoid')
])

# 编译模型
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# 训练模型
model.fit(X, y, epochs=100, batch_size=32, verbose=1)

# 只保存模型参数
model.save_weights('logistic_regression_weights.h5')

# 重新定义相同结构的模型
new_model = tf.keras.Sequential([
    tf.keras.layers.Dense(1, input_shape=(2,), activation='sigmoid')
])

# 编译新模型
new_model.compile(optimizer='adam',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])

# 加载保存的参数到新模型
new_model.load_weights('logistic_regression_weights.h5')

# 生成新的测试数据
X_test = np.random.randn(100, 2).astype(np.float32)
y_test = (2 * X_test[:, 0] + 3 * X_test[:, 1] > 0).astype(np.float32).reshape(-1, 1)

# 进行预测
y_pred_probs = new_model.predict(X_test)
y_pred = (y_pred_probs > 0.5).astype(np.float32)

# 计算准确率
accuracy = tf.keras.metrics.BinaryAccuracy()
accuracy.update_state(y_test, y_pred)
print(f"预测准确率: {accuracy.result().numpy()}")

代码解释

  1. 数据生成与模型构建:同样生成自定义数据集,构建并编译逻辑回归模型,进行训练。
  2. 保存参数:使用 model.save_weights('logistic_regression_weights.h5') 只保存模型的权重参数。
  3. 重新定义模型:重新定义一个与原模型结构相同的新模型,并进行编译。
  4. 加载参数:使用 new_model.load_weights('logistic_regression_weights.h5') 将保存的参数加载到新模型中。
  5. 预测与评估:生成新的测试数据,使用加载参数后的新模型进行预测,并计算预测准确率。

通过以上两种方式,可以根据实际需求选择合适的模型保存方法。

三、加载tensorflow框架逻辑回归模型

方案 1:加载保存为 HDF5 文件的模型

当用户将模型保存为 HDF5 文件(后缀名 .h5)时,使用 tf.keras.models.load_model 函数可以直接加载整个模型,包括模型的结构、权重以及训练配置。

import tensorflow as tf
import numpy as np

# 生成一些示例数据用于预测
X_test = np.random.randn(100, 2).astype(np.float32)
y_test = (2 * X_test[:, 0] + 3 * X_test[:, 1] > 0).astype(np.float32).reshape(-1, 1)

# 加载保存为 HDF5 文件的模型
loaded_model = tf.keras.models.load_model('logistic_regression_model.h5')

# 进行预测
y_pred_probs = loaded_model.predict(X_test)
y_pred = (y_pred_probs > 0.5).astype(np.float32)

# 计算准确率
accuracy = tf.keras.metrics.BinaryAccuracy()
accuracy.update_state(y_test, y_pred)
print(f"预测准确率: {accuracy.result().numpy()}")

代码解释

  1. 数据准备:生成一些示例数据 X_test 和对应的标签 y_test,用于后续的预测和评估。
  2. 模型加载:使用 tf.keras.models.load_model('logistic_regression_model.h5') 加载之前保存为 HDF5 文件的模型。
  3. 预测与评估:使用加载的模型对测试数据进行预测,将预测概率转换为标签,然后计算预测准确率。

方案 2:加载只保存的参数(权重和偏置)

当用户只保存了模型的参数(权重和偏置)时,需要先定义一个与原模型结构相同的新模型,然后使用 load_weights 方法将保存的参数加载到新模型中。

import tensorflow as tf
import numpy as np

# 生成一些示例数据用于预测
X_test = np.random.randn(100, 2).astype(np.float32)
y_test = (2 * X_test[:, 0] + 3 * X_test[:, 1] > 0).astype(np.float32).reshape(-1, 1)

# 重新定义相同结构的模型
new_model = tf.keras.Sequential([
    tf.keras.layers.Dense(1, input_shape=(2,), activation='sigmoid')
])

# 编译新模型
new_model.compile(optimizer='adam',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])

# 加载保存的参数
new_model.load_weights('logistic_regression_weights.h5')

# 进行预测
y_pred_probs = new_model.predict(X_test)
y_pred = (y_pred_probs > 0.5).astype(np.float32)

# 计算准确率
accuracy = tf.keras.metrics.BinaryAccuracy()
accuracy.update_state(y_test, y_pred)
print(f"预测准确率: {accuracy.result().numpy()}")

代码解释

  1. 数据准备:同样生成示例数据 X_test 和 y_test 用于预测和评估。
  2. 模型定义与编译:重新定义一个与原模型结构相同的新模型 new_model,并进行编译,设置优化器、损失函数和评估指标。
  3. 参数加载:使用 new_model.load_weights('logistic_regression_weights.h5') 将之前保存的参数加载到新模型中。
  4. 预测与评估:使用加载参数后的新模型对测试数据进行预测,将预测概率转换为标签,最后计算预测准确率。

通过以上两种方案,可以根据不同的保存方式正确加载 TensorFlow 模型。

四、完整流程

1. 实现思路

① 导入必要的库

在开始之前,需要导入 TensorFlow 用于构建和训练模型,NumPy 用于数据处理,以及一些评估指标相关的库。

② 生成自定义数据集

自定义数据集可以根据具体需求生成,这里以一个简单的二维数据集为例,每个样本有两个特征,标签为 0 或 1。

③ 构建逻辑回归模型

一共有4种方式,案例使用其中的TensorFlow的tf.keras.Sequential 构建模型,在列表中直接定义了一个 Dense 层,input_shape=(1,) 表明输入数据的形状。

④ 训练模型

使用生成的数据集对模型进行训练。

⑤ 保存模型

可以选择将模型保存为 HDF5 文件或只保存模型的参数,案例为保存为 HDF5 文件。

⑥ 加载模型并进行预测

此案例为加载 HDF5 文件模型

2. 代码示例

import tensorflow as tf
import numpy as np
from sklearn.metrics import accuracy_score

# 生成 1000 个样本,每个样本有 2 个特征
X = np.random.randn(1000, 2).astype(np.float32)
# 根据特征生成标签
y = (2 * X[:, 0] + 3 * X[:, 1] > 0).astype(np.float32).reshape(-1, 1)

# 构建逻辑回归模型
model = tf.keras.Sequential([
    tf.keras.layers.Dense(1, input_shape=(2,), activation='sigmoid')
])

# 编译模型
model.compile(optimizer='adam',
              loss='binary_crossentropy',
              metrics=['accuracy'])


# 训练模型
model.fit(X, y, epochs=100, batch_size=32, verbose=1)

# 保存模型
model.save('logistic_regression_model')

# 加载模型
loaded_model = tf.keras.models.load_model('logistic_regression_model')

# 生成新的测试数据
X_test = np.random.randn(100, 2).astype(np.float32)
y_test = (2 * X_test[:, 0] + 3 * X_test[:, 1] > 0).astype(np.float32).reshape(-1, 1)

# 进行预测
y_pred_probs = loaded_model.predict(X_test)
y_pred = (y_pred_probs > 0.5).astype(np.float32)

# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f"预测准确率: {accuracy}")

3. 代码解释

① 数据集生成

使用 np.random.randn 生成具有两个特征的随机样本,根据特征的线性组合生成标签。

② 模型构建

使用 tf.keras.Sequential 构建一个简单的逻辑回归模型,包含一个具有 sigmoid 激活函数的全连接层。

③ 模型编译

使用 adam 优化器和 binary_crossentropy 损失函数进行编译,并监控准确率指标。

④ 模型训练

使用 fit 方法对模型进行训练,指定训练轮数和批次大小。

⑤ 模型保存

使用 model.save 方法将模型保存到指定目录。

⑥ 模型加载与预测

使用 tf.keras.models.load_model 加载保存的模型,生成新的测试数据进行预测,并计算预测准确率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/960912.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux如何修改密码,要在CentOS 7系统中修改密码

要在CentOS 7系统中修改密码,你可以按照以下步骤操作: 步骤 1: 登录到系统 在登录提示符 localhost login: 后输入你的用户名。输入密码并按回车键。 步骤 2: 修改密码 登录后,使用 passwd 命令来修改密码: passwd 系统会提…

抗体人源化服务如何优化药物的分子结构【卡梅德生物】

抗体药物作为一种重要的生物制药产品,已在癌症、免疫疾病、传染病等领域展现出巨大的治疗潜力。然而,传统的抗体药物常常面临免疫原性高、稳定性差以及治疗靶向性不足等问题,这限制了其在临床应用中的效果和广泛性。为了克服这些问题&#xf…

大模型概述

文章目录 大语言模型的起源大语言模型的训练方式大语言模型的发展大语言模型的应用场景大语言模型的基础知识LangChain与大语言模型 大语言模型的起源 在人类社会中,我们的交流语言并非单纯由文字构成,语言中富含隐喻、讽刺和象征等复杂的含义&#xff0…

关于数字地DGND和模拟地AGND隔离

文章目录 前言一、1、为什么要进行数字地和模拟地隔离二、隔离元件1.①0Ω电阻:2.②磁珠:3.电容:4.④电感: 三、隔离方法①单点接地②数字地与模拟地分开布线,最后再PCB板上一点接到电源。③电源隔离④、其他隔离方法 …

【Redis】常见面试题

什么是Redis? Redis 和 Memcached 有什么区别? 为什么用 Redis 作为 MySQL 的缓存? 主要是因为Redis具备高性能和高并发两种特性。 高性能:MySQL中数据是从磁盘读取的,而Redis是直接操作内存,速度相当快…

什么是循环神经网络?

一、概念 循环神经网络(Recurrent Neural Network, RNN)是一类用于处理序列数据的神经网络。与传统的前馈神经网络不同,RNN具有循环连接,可以利用序列数据的时间依赖性。正因如此,RNN在自然语言处理、时间序列预测、语…

Python设计模式 - 组合模式

定义 组合模式(Composite Pattern) 是一种结构型设计模式,主要意图是将对象组织成树形结构以表示"部分-整体"的层次结构。这种模式能够使客户端统一对待单个对象和组合对象,从而简化了客户端代码。 组合模式有透明组合…

19.Word:小马-校园科技文化节❗【36】

目录 题目​ NO1.2.3 NO4.5.6 NO7.8.9 NO10.11.12索引 题目 NO1.2.3 布局→纸张大小→页边距:上下左右插入→封面:镶边→将文档开头的“黑客技术”文本移入到封面的“标题”控件中,删除其他控件 NO4.5.6 标题→原文原文→标题 正文→手…

一文讲解Java中Object类常用的方法

在Java中,经常提到一个词“万物皆对象”,其中的“万物”指的是Java中的所有类,而这些类都是Object类的子类; Object主要提供了11个方法,大致可以分为六类: 对象比较: public native int has…

多项日常使用测试,带你了解如何选择AI工具 Deepseek VS ChatGpt VS Claude

多项日常使用测试,带你了解如何选择AI工具 Deepseek VS ChatGpt VS Claude 注:因为考虑到绝大部分人的使用,我这里所用的模型均为免费模型。官方可访问的。ChatGPT这里用的是4o Ai对话,编程一直以来都是人们所讨论的话题。Ai的出现…

Linux下学【MySQL】表的必备操作( 配实操图和SQL语句)

绪论​ “Patience is key in life (耐心是生活的关键)”。本章是MySQL中非常重要且基础的知识----对表的操作。再数据库中表是存储数据的容器,我们通过将数据填写在表中,从而再从表中拿取出来使用,本章主要讲到表的增…

【Java数据结构】了解排序相关算法

基数排序 基数排序是桶排序的扩展,本质是将整数按位切割成不同的数字,然后按每个位数分别比较最后比一位较下来的顺序就是所有数的大小顺序。 先对数组中每个数的个位比大小排序然后按照队列先进先出的顺序分别拿出数据再将拿出的数据分别对十位百位千位…

【全栈】SprintBoot+vue3迷你商城(9)

【全栈】SprintBootvue3迷你商城(9) 往期的文章都在这里啦,大家有兴趣可以看一下 后端部分: 【全栈】SprintBootvue3迷你商城(1) 【全栈】SprintBootvue3迷你商城(2) 【全栈】Spr…

php-phar打包避坑指南2025

有很多php脚本工具都是打包成phar形式,使用起来就很方便,那么如何自己做一个呢?也找了很多文档,也遇到很多坑,这里就来总结一下 phar安装 现在直接装yum php-cli包就有phar文件,很方便 可通过phar help查看…

【数据结构】_顺序表

目录 1. 概念与结构 1.1 静态顺序表 1.2 动态顺序表 2. 动态顺序表实现 2.1 SeqList.h 2.2 SeqList.c 2.3 Test_SeqList.c 3. 顺序表性能分析 线性表是n个具有相同特性的数据元素的有限序列。 常见的线性表有:顺序表、链表、栈、队列、字符串等&#xff1b…

OPencv3.4.1安装及配置教程

来到GitHub上opencv的项目地址 https://github.com/opencv/opencv/releases/tag/3.4.1 以上资源包都是 OpenCV 3.4.1 版本相关资源,它们的区别如下: (1). opencv-3.4.1-android-sdk.zip:适用于 Android 平台的软件开发工具包(SDK…

世上本没有路,只有“场”et“Bravo”

楔子:电气本科“工程电磁场”电气研究生课程“高等电磁场分析”和“电磁兼容”自学”天线“、“通信原理”、“射频电路”、“微波理论”等课程 文章目录 前言零、学习历程一、Maxwells equations1.James Clerk Maxwell2.自由空间中传播的电磁波3.边界条件和有限时域…

ZYNQ-IP-AXI-GPIO

AXI GPIO 可以将 PS 端的一个 AXI 4-Lite 接口转化为 GPIO 接口,并且可以被配置为单端口或双端口,每个通道的位宽可以独立配置。 通过使能三态门可以将端口动态地配置为输入或输出。 AXIGPIO 是 ZYNQ PL 端的一个 IP 核,可以将 AXI-Lite Mas…

20.Word:小谢-病毒知识的科普文章❗【38】

目录 题目​ NO1.2.3文档格式 NO4.5 NO6.7目录/图表目录/书目 NO8.9.10 NO11索引 NO12.13.14 每一步操作完,确定之后记得保存最后所有操作完记得再次删除空行 题目 NO1.2.3文档格式 样式的应用 选中应用段落段落→开始→选择→→检查→应用一个一个应用ctr…

为什么应用程序是特定于操作系统的?[计算机原理]

你把WINDOWS程序复制到MAC上使用,会发现无法运行。你可能会说,MAC是arm处理器,而WINDWOS是X86 处理器。但是在2019年,那时候MAC电脑还全是Intel处理器,在同样的X86芯片上,运行MAC和WINDOWS 程序还是无法互相…