Python----机器学习(基于TensorFlow框架的线性回归)

发布于:2025-04-08 ⋅ 阅读:(31) ⋅ 点赞:(0)

一、基于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

请先安装

Download | Graphviz

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)