用TensorFlow实现线性回归
说明
本文采用TensorFlow框架进行讲解,虽然之前的文章都采用mxnet,但是我发现tensorflow提供了免费的gpu可供使用,所以果断开始改为tensorflow,若要实现文章代码,可以使用colaboratory进行运行,当然,如果您已经安装了tensorflow,可以采用python直接运行。
贡献
学习时采取动手学深度学习第二版作为教材,但由于本书通过引入d2l(著者自写库)进行深度学习,我希望将d2l的影响去掉,即不使用d2l,使用tensorflow,这一点通过查询GitHub中d2l库提供的相关函数尝试进行实现。
如果本系列文章具有良好表现,将译为英文版上传至Github。
预备知识
学习本篇文章之前,您最好具有以下基础知识:
- 线性回归的基础知识
- python的基础知识
基本原理
使用一个仿射变换,通过y=wx+b的模型来对数据进行预测(w和x均为矩阵,大小取决于输入规模),反向传播采用随机梯度下降对参数进行更新,参数包括w和b,即权重和偏差。

实现过程
生成数据集
只需要引入tensorflow即可,synthetic_data()函数将初始化X和Y,即通过真实的权重和偏差值生成数据集。
import tensorflow as tfdef synthetic_data(w, b, num_examples):X = tf.zeros((num_examples, w.shape[0]))X += tf.random.normal(shape=X.shape)y = tf.matmul(X, tf.reshape(w, (-1, 1))) + by += tf.random.normal(shape=y.shape, stddev=0.01)y = tf.reshape(y, (-1, 1))return X, ytrue_w = tf.constant([2, -3.4])
true_b = 4.2
features, labels = synthetic_data(true_w, true_b, 1000)
读取数据集
加载刚刚生成的数据集,is_train表示是否进行打乱,默认对数据进行打乱处理,使用load_array函数加载数据集。
def load_array(data_arrays, batch_size, is_train=True):dataset = tf.data.Dataset.from_tensor_slices(data_arrays)if is_train:dataset = dataset.shuffle(buffer_size=1000)dataset = dataset.batch(batch_size)return datasetbatch_size = 10
data_iter = load_array((features, labels), batch_size)
定义模型
模型使用keras API实现,keras是tensorflow中机器学习相关的库。先使用Sequential类定义承载容器,之后添加一个单神经元的全连接层。在TensorFlow中,Sequential表示容器相关的类,layer表示层相关的类。线性回归只需要通过keras中的单神经元的全连接层即可实现,神经元的值即为输出结果。
net = tf.keras.Sequential()
net.add(tf.keras.layers.Dense(1))
示例的线性回归仅有一个输入X,实际在其他线性回归过程中,很有可能有多个x及其对应的w,但keras的代码均不会发生改变,因为keras的Dense类可以自动判断输入的个数。

初始化模型参数
stddev表示标准差,initializer生成一个标准差为1,均值为0的正态分布。在构建全连接层时,使用该正态分布进行初始化。
initializer = tf.initializers.RandomNormal(stddev=0.01)
net = tf.keras.Sequential()
net.add(tf.keras.layers.Dense(1, kernel_initializer=initializer))
定义损失函数和优化算法
损失函数使用平方损失函数进行计算,训练时使用小批量随机梯度下降SGD方法进行训练,学习率为0.03。
loss = tf.keras.losses.MeanSquaredError()
trainer = tf.keras.optimizers.SGD(learning_rate=0.03)
训练
运行以下代码可以观察训练结果。运行轮次为3轮,每一轮对所有训练集数据进行学习。计算w和b的梯度值,使用梯度下降更新权重w和偏差b。每一轮输出损失函数的值,最终显示权重和偏差的估计误差。
num_epochs = 3
for epoch in range(num_epochs):for X, y in data_iter:with tf.GradientTape() as tape:l = loss(net(X, training=True), y)grads = tape.gradient(l, net.trainable_variables)trainer.apply_gradients(zip(grads, net.trainable_variables))l = loss(net(features), labels)print(f'epoch {epoch + 1}, loss {l:f}')
w = net.get_weights()[0]
print('w的估计误差:', true_w - tf.reshape(w, true_w.shape))
b = net.get_weights()[1]
print('b的估计误差:', true_b - b)
运行结果
epoch 1, loss 0.000194
epoch 2, loss 0.000091
epoch 3, loss 0.000091
w的估计误差: tf.Tensor([-0.00026917 0.00094557], shape=(2,), dtype=float32)
b的估计误差: [4.7683716e-06]
改进尝试
- 更改SGD优化算法为Adam
- 更改MeanSquaredError为其他损失函数
对于上述改进,损失均有显著增加,表明原有方法已为最好方法。
相关文章:
用TensorFlow实现线性回归
说明 本文采用TensorFlow框架进行讲解,虽然之前的文章都采用mxnet,但是我发现tensorflow提供了免费的gpu可供使用,所以果断开始改为tensorflow,若要实现文章代码,可以使用colaboratory进行运行,当然&#…...
IT计算机软件系统类毕业论文结构指南:从标题到结论的全景视角
一、背景 在快速发展的IT和人工智能领域,毕业论文不仅是学术研究的重要成果,也展示了学生掌握新技术和应用的能力。随着大数据和智能系统的复杂性增加,毕业设计(毕设)的论文章节安排变得尤为关键。一个结构清晰、内容详…...
leetcode27:移除元素(正解)
移除元素 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素。元素的顺序可能发生改变。然后返回 nums 中与 val 不同的元素的数量。 假设 nums 中不等于 val 的元素数量为 k,要通过此题,您需要执行以下操作…...
docker部署nginx--(部署静态文件和服务)
文档参考 1、http://testingpai.com/article/1649671014266 2、下载nginx docker pull nginx:alpine 然后启动nginx, docker run --rm -it -p 9192:80 nginx:alpine /bin/sh 关闭容器后,自动删除该容器 进入后,启动nginx, nginx进行curl h…...
websocket的介绍及springBoot集成示例
目录 一、什么是Websocket 二、Websocket特点 三、WebSocket与HTTP的区别 四、常见应用场景 五、SpringBoot集成WebSocket 1. 原生注解 2. Spring封装 一、什么是Websocket WebSocket 是一种在单个 TCP 连接上进行 全双工 通信的协议,它可以让客户端和服务器…...
软件测试-自动化测试
自动化测试 测试人员编写自动化测试脚本,维护并解决自动化脚本问题 自动化的主要目的就是用来进行回归测试 回归测试 常见面试题 ⾃动化测试能够取代人工测试吗? ⾃动化测试不⼀定⽐人工测试更能保障系统的可靠性,⾃动化测试是测试⼈员手…...
Linux 安装TELEPORT堡垒机
一、查看官方文档 堡垒机官网地址:走向成功 - Teleport,高效易用的堡垒机 (一)官网资源链接 -》Teleport 在线文档 (二)手动下载安装包 二、压缩包下载和安装 (一)加压下载的安装…...
【14】即时编译器的中间表达形式
中间表达形式(IR) 编译器一般被分为前端和后端。 前端会对输入的程序进行词法分析、语法分析和语义分析,然后生成中间表达形式(IR);后端对IR进行优化,生成目标代码 不考虑解释执行的话…...
Mysql(三)---增删查改(基础)
文章目录 前言1.补充1.修改表名1.2.修改列名1.3.修改列类型1.4.增加新列1.5.删除指定列 2.CRUD3.新增(Create)3.1.单行插入3.2.指定列插入3.3.多行插入 4.数据库的约束4.1.约束的分类4.2.NULL约束4.3.Unique约束4.4.Default 默认值约束4.5.PRIMARY KEY:主键约束4.6.…...
Dialog实现原理分析
在 Android 中,对话框(Dialog)是一种非常常见的用户界面组件,用于向用户提供额外的信息或者请求用户的确认。Android 提供了几种不同类型的对话框,例如简单的消息对话框 (AlertDialog)、进度条对话框 (ProgressDialog)…...
21.1 基于Netty实现聊天
21.1 基于Netty实现聊天 一. 章节概述二. `Netty`介绍三. 阻塞与非阻塞1. 阻塞与非阻塞简介2. BIO同步阻塞3. NIO同步非阻塞4. AIO异步非阻塞IO5. 异步阻塞IO(用的极少)6. 总结四. Netty三种线程模型1. 单线程模型2. 多线程模型3. 主从线程模型五. 构建Netty服务器************…...
尼卡音乐 v1.0.5 — 全新推出的免费音乐听歌软件
尼卡音乐是一款全新推出的免费音乐听歌软件,无需注册登录,打开即拥有全部功能。聚合了六大音源曲库、歌单、排行榜,支持在线试听、无损下载以及高清MV播放。资源全、无广告、更新快,适合寻找高品质音乐体验的用户。 拿走的麻烦评…...
Scratch深潜:解锁递归与分治算法的编程之门
亮眼标题:“Scratch深潜:解锁递归与分治算法的编程之门” 在编程的世界里,递归和分治算法是解决问题的强大工具。Scratch,这款广受儿童和初学者欢迎的图形化编程语言,以其独特的拖拽式编程块,激发了无数年…...
【1.0】vue3的创建
【1.0】vue3的创建 【一】vue3介绍 vue2的所有东西,vue3都兼容 vue3中写js代码由两种,组合式和配置项 配置项api,就是vue2的写法,将数据放进data,方法放进methods等 export default{data(){return {}},methods:…...
刷刷前端手写题
闭包用途 闭包 闭包让你可以在一个内层函数中访问到其外层函数的作用域 防抖 描述 前面所有触发都被取消,最后一次执行,在规定时间之后才会触发,也就是说如果连续快速的触发,用户操作频繁,但只会执行一次 。 常用场…...
论文解读:LONGWRITER: UNLEASHING 10,000+ WORD GENERATION FROM LONG CONTEXT LLMS
摘要 现象:当前的大预言模型可以接受超过100,000个tokens的输入,但是却难以生成超过2000个token的输出。 原因:监督微调过程(SFT)中看到的样本没有足够长的样本。 解决方法: Agent Write,可以将长任务分解为子任务&a…...
一文了解Ansible原理以及常见使用模块
ansible使用手册 1. 简述 Ansible 是一种开源的自动化工具,主要用于配置管理、应用程序部署和任务自动化。 它使用简单的 YAML 语言来定义自动化的任务【playbook】,使得配置和部署变得更加直观和易于管理。 基于SSH协议连接到远程主机来执行指令。 2…...
JavaEE从入门到起飞(九) ~Activiti 工作流
工作流 当一道流程逻辑需要用到多个表单的提交和多个角色的审核共同完成的时候,就可以使用工作流。 工作流一般使用的是第三方技术,也就是说别人帮你创建数据库表和service层、mapper层,你只需要注入工具接口即可使用。 原理:一…...
微服务的保护
一、雪崩问题及解决方案 1.雪崩问题 微服务之间,一个微服务依赖多个其他的微服务。当一个微服务A依赖的一个微服务B出错时,微服务A会被阻塞,但其他不依赖于B的微服务不会受影响。 当有多个微服务依赖于B时,服务器支持的线程和并…...
2024前端面试题-网络篇
1.跨域问题 同源策略:需要协议、域名、端口号相同跨域原因:不符合同源策略便会产生跨域问题解决跨域:JSONP、配置代理、通过CORS解决 2.RPC和HTTP的区别 主要区别是序列化和反序列化,RPC通过二进制高效传输,HTTP是j…...
如何快速提取B站CC字幕:面向新手的完整工具指南
如何快速提取B站CC字幕:面向新手的完整工具指南 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 你是否曾经为了获取B站视频的字幕而烦恼?想…...
英雄联盟游戏效率工具League Akari:智能自动化与数据分析完整指南
英雄联盟游戏效率工具League Akari:智能自动化与数据分析完整指南 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 还在为BP阶段手速…...
Cursor编辑器Markdown实时预览插件CursorMD深度解析与实战指南
1. 项目概述:当代码编辑器遇上Markdown预览如果你和我一样,日常开发的主力工具是Cursor,同时又经常需要撰写技术文档、项目README或者个人博客,那你一定体会过那种在编辑器、浏览器和笔记软件之间反复横跳的割裂感。Cursor作为一款…...
从干扰三要素到实战:辐射发射的工程化抑制与诊断方法
1. 项目概述:从一道周五小测题聊起辐射发射那天在EE Times上翻到一篇2014年的老文章,标题叫“Friday Quiz: Radiated Emissions”,作者是Martin Rowe。文章开头就抛出了一个非常基础,但又直击电磁兼容(EMC)…...
oh-my-prompt:模块化终端提示符引擎的设计、配置与性能优化
1. 项目概述:一个为现代终端量身定制的提示符引擎如果你和我一样,每天有超过一半的工作时间是在终端(Terminal)里度过的,那么一个高效、美观且信息丰富的命令行提示符(Prompt)绝对能让你事半功倍…...
移动端优化gh_mirrors/ti/til:PWA渐进式Web应用开发的终极指南
移动端优化gh_mirrors/ti/til:PWA渐进式Web应用开发的终极指南 【免费下载链接】til :memo: Today I Learned 项目地址: https://gitcode.com/gh_mirrors/ti/til GitHub 加速计划(ti/til)是一个记录日常学习的开源项目,通过…...
Agent:它不是更聪明的大模型,而是让大模型持续推进任务的“大脑+身体”系统!
本文深入探讨了Agent与大模型的关系,强调Agent并非模型本身,而是一套围绕模型组织的运行机制。文章详细解析了Agent的核心机制,包括状态管理、控制循环和工具调用,并阐述了System Prompt、AGENTS.md、Skill和Tool等概念在Agent系统…...
MCP Loom:快速构建AI工具与数据连接器的开发框架
1. 项目概述:MCP Loom,一个连接AI与真实世界的“织布机”如果你最近在折腾AI应用开发,特别是想让你的AI助手(比如Claude、Cursor等)能直接操作你电脑上的文件、数据库,甚至调用外部API,那么你很…...
5分钟精通VinXiangQi:免费AI象棋助手的完整使用教程
5分钟精通VinXiangQi:免费AI象棋助手的完整使用教程 【免费下载链接】VinXiangQi Xiangqi syncing tool based on Yolov5 / 基于Yolov5的中国象棋连线工具 项目地址: https://gitcode.com/gh_mirrors/vi/VinXiangQi VinXiangQi是一款基于YOLOv5深度学习技术的…...
Neovim涂抹光标插件:提升编码体验的动态轨迹设计
1. 项目概述:一个为Neovim设计的“涂抹光标”插件 如果你和我一样,是个重度Neovim用户,每天有超过8小时的时间泡在终端和代码编辑器里,那你肯定对光标的“存在感”有要求。默认的方块或下划线光标,在长时间编码后&…...
