tensorflow模型保存、读取与可训练参数提取

一、保存、读取说明

  我们创建好模型之后需要保存模型,以方便后续对模型的读取与调用,保存模型我们可能有下面三种需求:1、只保存模型权重参数;2、同时保存模型图结构与权重参数;3、在训练过程的检查点保存模型数据。下面分别对这三种需求进行实现。

 

二、仅保存模型参数

  仅保存模型参数可以用一下的API:

  Model.save_weights(file_path)  # 将文件保存到save_path
  Model.load_weights(file_path)  # 将文件读取到save_path

  注意:由于save_weights只是保存权重w、b的参数值,所以在加载时最好保证我们的模型结构和原来保存的模型结构是相同的,否则可能会报错。.

  模型在保存之后会有多个文件:

  • index类型文件,在分布式计算中,索引文件会指示哪些权重存储在哪个分片。
  • checkpoint类型文件,检查文件点包含: 一个或多个包含模型权重的分片
  • 如果您只在一台机器上训练模型,那么您将有一个带有后缀的分片:.data-00000-of-00001

复制代码

import tensorflow as tf
import os

# 读取数据集
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.fashion_mnist.load_data()

# 数据集归一化
train_images = train_images / 255
train_labels = train_labels / 255  # 进行数据的归一化,加快计算的进程

# 创建模型结构
net_input=tf.keras.Input(shape=(28,28))
fl=tf.keras.layers.Flatten()(net_input)#调用input
l1=tf.keras.layers.Dense(32,activation="relu")(fl)
l2=tf.keras.layers.Dropout(0.5)(l1)
net_output=tf.keras.layers.Dense(10,activation="softmax")(l2)

# 创建模型类
model = tf.keras.Model(inputs=net_input, outputs=net_output)

# 查看模型的结构
model.summary()

# 模型编译
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
              loss="sparse_categorical_crossentropy",
              metrics=['acc'])

# 模型训练
model.fit(train_images, train_labels, batch_size=50, epochs=5, validation_split=0.1)

# 模型存放路径
save_path = './save_weights/'
model.save_weights(save_path)

# 模型加载
model.load_weights(save_path)

# # 定义一个与原模型结构不同的模型
# net_in=tf.keras.Input(shape=(748,))
# net_out=tf.keras.layers.Dense(10,activation="softmax")(net_in)
# 
# # 用不同结构的模型读取参数,这里会报错
# model2=tf.keras.Model(inputs=net_in,outputs=net_out)
# model2.load_weights(save_path)

复制代码

 

三、同时保存结构与参数

  Keras使用HDF5标准提供基本保存格式,出于我们的目的,可以将保存的模型视为单个二进制blob。

  保存完整的模型非常有用,使我们可以在TensorFlow.js(HDF5Saved Model) 中加载它们,然后在Web浏览器中训练和运行它们,或者使用TensorFlow Lite(HDF5Saved Model)将它们转换为在移动设备上运行。

复制代码

# 模型训练
model.fit(train_images, train_labels, batch_size=50, epochs=5, validation_split=0.1)

# 保存模型
model.save('net_model.h5')

# 模型加载
new_model=tf.keras.models.load_model('net_model.h5')

复制代码

 

四、在训练过程的检查点保存模型数据

  在训练过程的检查点保存模型数据有两个作用:1、我们可以保存训练各个节点的数据,便于我们把训练效果最好的节点的模型挑选出来。2、可以随时先暂停训练模型,当想要训练时继续训练。

  在训练的检查点保存模型需要用到tf.keras.callbacks.ModelCheckpoint()类,这个是一个回调类,可以以列表形式传入到fit()方法的callbacks参数中。

  回调中类,文件名以.ckpt作为后缀,如文件路径'./checkpoint/train.ckpt',会在checkpoint生成三个文件,后缀与Model.save_weights()方法创建的文件后缀相同,意义也相同。以下为回调类的参数:

 

  tf.keras.callbacks.ModelCheckpoint()

  • filepath:string,保存模型文件的路径。
  • monitor:监控:要监控的数量。
  • verbose详细:详细模式,0或1。
  • save_best_only:如果save_best_only = True,则不会覆盖根据监控数量的最新最佳模型。
  • save_weights_only:如果为True,则只有模型的权重
    保存(model.save_weights(filepath)),否则保存完整模型(model.save(filepath))。
  • mode:{auto,min,max}之一。 如果save_best_only =
    True,则根据监控数量的最大化或最小化来决定覆盖当前保存文件。
    对于val_acc,这应该是max,对于val_loss,这应该是min等。在自动模式下,从监控量的名称自动推断方向。
  • period:检查点之间的间隔(时期数)。

  

复制代码

# 模型编译
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
              loss="sparse_categorical_crossentropy",
              metrics=['acc'])

# 创建一个保存模型的回调函数,每5个周期保存一次权重
cp_callback = tf.keras.callbacks.ModelCheckpoint(
    filepath='./checkpoint/train.ckpt',
    verbose=1,
    save_weights_only=True,
    period=5
)

# 模型训练
model.fit(train_images, train_labels, batch_size=50, epochs=5, validation_split=0.1, callbacks=[cp_callback])

# 加载模型
model.load_weights('./checkpoint/train.ckpt')

# # 继续训练模型
# model.fit()

复制代码

 

五、模型可训练参数的提取

  有时候我们需要查看模型的参数,但是模型参数的显示有时候由于数据过多不能再控制台全部显示,所以需要存放到文件来查看。以下是提取可训练参数的方法:

复制代码

# 参看可训练参数
import numpy as np
model.trainable_variables

# 设置全部可训练参数可打印,不然数据过多,有一部分会以省略号的形式显示
np.set_printoptions(threshold=np.inf)

# 可训练参数保存到文件
with open('trainable.txt', mode='w',encoding = "utf-8") as f:
    for t_v in model.trainable_variables:
        f.writelines(str(t_v.name) + '\n')  # 保存参数名字
        f.writelines(str(t_v.shape) + '\n')  # 保存参数形状
        f.writelines(str(t_v.numpy()) + '\n')  # 保存参数数值
  • 10
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 好的,我可以给你提供一个基本的 TensorFlow 代码示例,帮助你实现上述功能。 首先,我们需要使用 TensorFlow 的 `pandas` 库将 CSV 文件读入并转换为 Pandas 数据帧,然后从数据帧中提取输入和输出样本: ``` import tensorflow as tf import pandas as pd # 读入 CSV 文件 df = pd.read_csv('my_data.csv') # 提取输入和输出样本 X = df[df.columns[:-1]].values y = df[df.columns[-1]].values ``` 接下来,我们需要将输入样本转换为张量,并使用 TensorFlow 的 `layers` 库构造一个神经网络,这样就可以通过调用该神经网络的方法来对输入进行预测了。 具体来说,我们可以使用 `tf.data.Dataset` 将输入样本转换为 TensorFlow 张量,然后使用 `tf.keras.layers` 中的层来构造神经网络模型。例如,我们可以使用 `tf.keras.layers.Dense` 层来构建一个具有 32 个输入特征和 1 个输出特征的神经网络: ``` # 将输入样本转换为 TensorFlow 张量 dataset = tf.data.Dataset.from_tensor_slices((X, y)) # 构建神经网络模型 model = tf.keras.Sequential([ tf.keras.layers.Dense(32, input_shape=(32,), activation='relu'), tf.keras.layers.Dense(1, activation=' ### 回答2: 首先,使用TensorFlow可以很方便地从CSV文件中读取数据。要读取CSV文件,可以使用`tf.data.experimental.CsvDataset`功能。首先,我们需要确保CSV文件的格式正确,并且正确地设置每个列的数据类型。 假设我们的CSV文件有两个列,一个是输入参数'features',一个是输出参数'label'。其中'features'包含32个32位的浮点数,'label'是一个单独的32位整数。我们将首先构建一个用于读取CSV文件的数据集。 ```python import tensorflow as tf # 设置CSV文件路径和特征/标签的数据类型 csv_path = 'data.csv' feature_dtype = [tf.float32] * 32 # 32个32位浮点数 label_dtype = tf.float32 # 从CSV文件中读取数据 csv_dataset = tf.data.experimental.CsvDataset(csv_path, [feature_dtype, label_dtype], header=True) ``` 接下来,我们将构建一个神经网络模型,并使用读取的数据集进行训练。 ```python # 构建神经网络模型 model = tf.keras.Sequential([ tf.keras.layers.Dense(64, activation=tf.nn.relu), tf.keras.layers.Dense(1, activation=tf.nn.sigmoid) ]) # 编译模型 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) # 将数据集拆分为特征和标签 X = [] y = [] for features, label in csv_dataset: X.append(features) y.append(label) X = tf.stack(X) y = tf.stack(y) # 训练模型 model.fit(X, y, epochs=10) # 保存模型 model.save('model.h5') ``` 现在,模型已经训练保存为`model.h5`文件。我们可以使用该模型进行预测。 ```python # 加载模型 model = tf.keras.models.load_model('model.h5') # 进行预测 input_data = [] # 输入数据 prediction = model.predict(tf.expand_dims(input_data, axis=0)) ``` 现在,`prediction`是我们预测的输出。请注意,`input_data`应具有与训练时相同的形状和数据类型。 ### 回答3: TensorFlow是一个开源的机器学习框架,可以用来构建和训练神经网络模型。下面是使用TensorFlow从csv文件中读取数据并构造一个32位的输入参数和1位参数的输出,以及训练保存模型,并使用该模型进行预测的代码示例。 首先,我们需要准备一个包含输入和输出数据的csv文件,假设文件名为"data.csv",包含32列的输入参数和1列的输出参数。 以下是代码示例: ``` import tensorflow as tf import numpy as np # 读取csv文件 data = np.genfromtxt('data.csv', delimiter=',', dtype=np.float32) # 分割输入和输出数据 x_data = data[:, :-1] y_data = data[:, -1:] # 构造神经网络模型 input_size = x_data.shape[1] output_size = y_data.shape[1] # 定义输入和输出占位符 x = tf.placeholder(tf.float32, [None, input_size]) y = tf.placeholder(tf.float32, [None, output_size]) # 定义神经网络结构 hidden_layer = tf.layers.dense(x, 32, activation=tf.nn.relu) output_layer = tf.layers.dense(hidden_layer, output_size, activation=None) # 定义损失函数和优化器 loss = tf.reduce_mean(tf.square(output_layer - y)) optimizer = tf.train.GradientDescentOptimizer(0.01) train_op = optimizer.minimize(loss) # 创建会话并进行模型训练 with tf.Session() as sess: sess.run(tf.global_variables_initializer()) for epoch in range(100): _, loss_value = sess.run([train_op, loss], feed_dict={x: x_data, y: y_data}) print("Epoch:", epoch, " Loss:", loss_value) # 保存模型 saver = tf.train.Saver() saver.save(sess, 'model.ckpt') # 使用保存模型进行预测 with tf.Session() as sess: # 加载模型 saver = tf.train.Saver() saver.restore(sess, 'model.ckpt') # 构造预测输入数据 test_data = np.array([[1, 2, 3, ...]]) # 根据实际情况填写输入数据 # 进行预测 prediction = sess.run(output_layer, feed_dict={x: test_data}) print("Prediction:", prediction) ``` 在上述代码中,我们首先读取名为"data.csv"的csv文件,并将其分割为输入参数x_data和输出参数y_data。然后,我们定义了一个包含一个隐藏层的神经网络模型,隐藏层的大小为32。接下来,我们定义了损失函数和优化器,并使用训练集进行模型训练。最后,我们使用保存模型进行预测,传入待预测的输入数据test_data,并输出预测结果prediction。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值