一、基于TensorFlow框架的线性回归
1.1、输入数据
import tensorflow as tf
import numpy as np
seed = 42
tf.random.set_seed(seed)
# 输入数据
data = [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2],
[-1.4, -15.7], [-1.4, -37.3], [-1.8, -49.1],
[1.5, 75.6], [0.4, 34.0], [0.8, 62.3]]
# 转换为numpy数组
data = np.array(data)
x_data = data[:, 0]
y_data = data[:, 1]
# 装换为 TensorFlow张量
x_train = tf.constant(x_data, dtype=tf.float32)
y_train = tf.constant(y_data, dtype=tf.float32)
# 创造数据集
buffer_size = len(data)
data = tf.data.Dataset.from_tensor_slices((x_train, y_train))
data = data.shuffle(buffer_size=buffer_size).batch(len(data)).prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
1.2、定义前向模型
1.2.1、方案一
model=tf.keras.Sequential([tf.keras.layers.Dense(1,input_shape=(1,))])
1.2.2、方案二
model=tf.keras.Sequential()
model.add(tf.keras.layers.Dense(1,input_shape=(1,)))
1.2.3、方案三
model=tf.keras.Sequential()
model.add(tf.keras.layers.Input(shape=(1,)))
model.add(tf.keras.layers.Dense(1))
1.2.4、方案四
x_train = tf.constant(np.expand_dims(x_data,axis=1), dtype=tf.float32)
#前面的x_train要修改成这样增加一个维度
class Linear(tf.keras.Model):
def __init__(self):
super().__init__()
self.linear=tf.keras.layers.Dense(1)
def __call__(self, x, **kwargs):
x=self.linear(x)
return x
model=Linear()
1.2.5、方案五
class Linear(tf.keras.Model):
def __init__(self):
super().__init__()
self.linear=tf.keras.layers.Dense(1)
def __call__(self, x, **kwargs):
x=self.linear(x)
return x
model=Linear()
1.3、定义损失函数和优化器
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)
model.compile(optimizer=optimizer, loss="mean_squared_error")
1.4、输出数据
1.4.1、方案一
for epoch in range(1, 501):
total_loss = 0
for batch_x, batch_y in data:
history = model.fit(x_train, y_train, verbose=0)
loss = history.history["loss"][0]
total_loss += loss
# 计算平均损失
avg_loss = total_loss / len(data)
# 5、显示频率设置
if epoch % 10 == 0 or epoch == 1:
print(f"epoch:{epoch}, avg_loss:{avg_loss}")
1.4.2、方案二
history = model.fit(x_train, y_train, epochs=epoches)
1.5、完整代码
import tensorflow as tf
import numpy as np
# 设置随机种子,确保结果可重复
seed = 42
tf.random.set_seed(seed)
# 输入数据
data = [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2],
[-1.4, -15.7], [-1.4, -37.3], [-1.8, -49.1],
[1.5, 75.6], [0.4, 34.0], [0.8, 62.3]]
# 转换为numpy数组
data = np.array(data)
x_data = data[:, 0] # 提取x值
y_data = data[:, 1] # 提取y值
# 装换为 TensorFlow张量
x_train = tf.constant(x_data, dtype=tf.float32) # 将x_data转换为TensorFlow张量
y_train = tf.constant(y_data, dtype=tf.float32) # 将y_data转换为TensorFlow张量
# 创造数据集
buffer_size = len(data) # Equal to the dataset size
data = tf.data.Dataset.from_tensor_slices((x_train, y_train)) # 创建TensorFlow数据集
data = data.shuffle(buffer_size=buffer_size).batch(len(data)).prefetch(buffer_size=tf.data.experimental.AUTOTUNE) # 洗牌,分批,预取数据
# 定义前向模型
def Linear():
# 定义输入层,输入形状为1
input = tf.keras.layers.Input(shape=(1,), dtype=tf.float32)
y = tf.keras.layers.Dense(1)(input) # 定义一个输出为1的全连接层
model = tf.keras.Model(inputs=input, outputs=y) # 创建模型
return model
model = Linear() # 实例化模型
# 3、定义损失函数和优化器
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01) # 使用随机梯度下降作为优化器
model.compile(optimizer=optimizer, loss="mean_squared_error") # 编译模型,指定损失函数为均方误差
# 4、开始迭代
for epoch in range(1, 501):
total_loss = 0 # 初始化总损失
for batch_x, batch_y in data:
history = model.fit(x_train, y_train, verbose=0) # 训练模型,不输出详细信息
loss = history.history["loss"][0] # 获取当前批次的损失
total_loss += loss # 累加损失
# 计算平均损失
avg_loss = total_loss / len(data)
# 5、显示频率设置
if epoch % 10 == 0 or epoch == 1: # 每10个epoch或第一个epoch输出一次
print(f"epoch:{epoch}, avg_loss:{avg_loss}") # 打印当前epoch及其平均损失
二、模型的保存与加载
2.1、全都保存
import numpy as np
import tensorflow as tf
model=tf.keras.models.load_model('./my_model.h5')
input_data = np.array([[1.5]])
pre = model.predict(input_data)
print(f"预测结果: {pre[0][0]}")
#1/1 [==============================] - 0s 76ms/step
#[[82.21264]]
2.2、只保存权重函数
import numpy as np
import tensorflow as tf
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()
input_data = np.array([[1.5]])
model.load_weights("my_model_weights.h5")
pre = model.predict(input_data)
print(pre)
2.3、只保存权重类
import numpy as np
import tensorflow as tf
class Linear(tf.keras.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()
input_data = np.array([[1.5]])
_ = model(input_data)
model.load_weights("my_model_weights.h5")
pre = model.predict(input_data)
print(pre)
三、网络结构查看
3.1、summary
import tensorflow as tf
#1.
model=tf.keras.models.load_model('my_model_weights.h5')
print(model.summary())
3.2、plot_model
请先安装
import tensorflow as tf
model=tf.keras.models.load_model('my_model.h5')
tf.keras.utils.plot_model(model,to_file='model.png',show_dtype=True)
3.3、netron
更详细介绍请参考
Python----机器学习(PyTorch模型可视化:summary,netron,TensorboardX)
3.4、tensorboard
import tensorflow as tf
import numpy as np
seed = 42
tf.random.set_seed(42)
# 1、散点输入,定义输入数据
data = [[-0.5, 7.7], [1.8, 98.5], [0.9, 57.8], [0.4, 39.2], [-1.4, -15.7], [-1.4, -37.3], [-1.8, -49.1], [1.5, 75.6], [0.4, 34.0], [0.8, 62.3]]
# data列表10*2
# 转换成numpy
data = np.array(data)
x_data = data[:, 0]
y_data = data[:, 1]
# 转换成TensorFlow张量
# x_train = tf.constant(x_data, dtype=tf.float32)
x_train = tf.constant(np.expand_dims(x_data, axis=1), dtype=tf.float32)
y_train = tf.constant(y_data, dtype=tf.float32)
dataset = tf.data.Dataset.from_tensor_slices((x_train, y_train))
dataset = dataset.shuffle(buffer_size=10)
dataset = dataset.batch(10)
# CPU取数据同时GPU、TPU训练,CPU会预先取出来一批数据,在CPU上训练无效果
dataset = dataset.prefetch(buffer_size=tf.data.experimental.AUTOTUNE)
# 2、定义前向模型
# 方案4
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()
# 3、定义损失函数和优化器
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01)
model.compile(optimizer=optimizer, loss="mean_squared_error")
tc=tf.keras.callbacks.TensorBoard(log_dir='logs')
model.fit(x_train,y_train,epochs=500,callbacks=[tc])
D:\Anaconda3\python.exe D:\Anaconda3\envs\general\Scripts\tensorboard.exe --logdir=D:\xxx\xxx\logs
其中:
D:\Anaconda3\python.exe python地址
D:\Anaconda3\envs\general\Scripts\tensorboard.exe tensorboard的地址
--logdir=D:\xxx\xxx\logs 该文件所在的文件夹地址
更详细介绍请参考
Python----机器学习(PyTorch模型可视化:summary,netron,TensorboardX)