【神经网络】tensorflow实验8--梯度下降法

news2024/11/15 15:43:31

1. 实验目的

①掌握TensorFlow的可训练变量和自动求导机制
②能够使用TensorFlow实现梯度下降法,求解一元和多元线性回归问题

2. 实验内容

下载波士顿房价数据集,使用线性回归模型实现对波士顿房价的预测,并以可视化的形式输出模型训练的过程和结果。

3.实验过程

题目一:

下载波士顿房价数据集,使用属性“低收入人口比例”,训练一元线性回归模型,并测试其性能,以可视化的形式展现训练和测试的过程及结果。
要求:
(1)编写代码实现上述功能;
(2)尝试调试超参数,使模型达到最优的性能,请记录超参数的调试过程,并简要分析和总结;
(3)在程序中增加适当的代码,使其能够计算并记录模型训练时间。
提示:
(1)仅记录训练模型所需的时间,而不是程序运行的总时间
(2)记录程序段运行时间的方法:

import time        #导入Time库
start=time.clock()   #记录程序起始时间
...             #需要记录时间的程序段
end=time.clock()    #记录程序结束时间
print(“程序执行时间:”,end-start)

实验代码:

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
import time
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'   #你的 CPU 支持AVX2 FMA(加速CPU计算),但安装的 TensorFlow 版本不支持 解决、
start=time.process_time()
boston_housing = tf.keras.datasets.boston_housing
(train_x,train_y),(test_x,test_y) = boston_housing.load_data()  #导入训练集和测试集数据
x_train = train_x[:,12]   #使用低收入人口比例
y_train = train_y
x_test = test_x[:,12]
y_test = test_y
learn_rate = 0.009
iter = 1000
display_step =20#设置超参数

#设置模型得参数初始值
np.random.seed(612)
w = tf.Variable(np.random.randn())
b = tf.Variable(np.random.randn())
mse_train = []  #记录训练集上的损失   误差
mse_test = []   #记录测试集上的损失
for i in range(0,iter+1):
    with tf.GradientTape() as tape:   #梯度带对象的with语句,实现对w和b的自动监视
        pred_train = w*x_train + b
        loss_train = 0.5*tf.reduce_mean(tf.square(y_train-pred_train))    #计算训练集上的误差
        pred_test = w*x_test+b
        loss_test = 0.5*tf.reduce_mean(tf.square(y_test-pred_test))  #计算测试集上的误差
    mse_train.append(loss_train)
    mse_test.append(loss_test)
    dL_dw,dL_db = tape.gradient(loss_train,[w,b])  #使用训练集中的数据更新模型参数
    w.assign_sub(learn_rate*dL_dw)
    b.assign_sub(learn_rate*dL_db)
    if i % display_step == 0:
        print("i: %i,Train Loss: %f,Test Loss: %f"%(i,loss_train,loss_test))  #输出训练误差和测试误差
plt.figure(figsize=(15,10))
plt.subplot(221)
plt.scatter(x_train,y_train,color = 'b',label = "data")   #绘制散点图
plt.plot(x_train,pred_train,color = 'r',label = 'model')#蓝色的点是房间数的散点图,红线是训练得到的线性模型
plt.legend(loc = "upper left")

plt.subplot(222)
plt.plot(mse_train,color = 'b',linewidth=3,label = "train loss")
plt.plot(mse_test,color = 'r',linewidth=1.5,label = 'test loss')
plt.legend(loc = "upper left")#损失值和迭代次数变化的曲线


plt.subplot(223)
plt.plot(y_train,color = 'b',marker= "o",label = "true")
plt.plot(pred_train,color = 'r',marker = '.',label = 'predict')
plt.legend()#训练集实际房价和预测值的比较

plt.subplot(224)
plt.plot(y_test,color = 'b',marker= "o",label = "true")
plt.plot(pred_test,color = 'r',marker = '.',label = 'predict')
plt.legend()#测试集实际房价和预测值的比较

plt.show()
end=time.process_time()
print("程序执行时间:",end-start)

在这里插入图片描述

题目二:

使用波士顿房价数据集中的所有属性,训练多元线性回归模型,并测试其性能,以可视化的形式展现训练和测试模型的过程及结果。
要求:
(1)编写代码实现上述功能;
(2)记录超参数的调试过程,寻找使模型达到最佳性能的超参数;
(3)分析和总结:
在题目一和本题中,分别选择单一属性、全部属性建立和训练模型,比较两者的学习率、迭代次数等超参数,以及在训练集和测试集上的交叉熵损失、准确率和模型训练时间,以表格或其他合适的图表形式展示。分析以上结果,可以得到什么结论,或对你有什么启发。

代码:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
boston_housing=tf.keras.datasets.boston_housing
(train_x,train_y), (test_x,test_y) = boston_housing.load_data() #加载数据集

train_X=train_x[:,[5,12]]#数据处理,第6和13个属性,低收入人口及房屋面积
test_X=test_x[:,[5,12]]

num_train=len(train_X)
num_test=len(test_X)
x_train=(train_X-train_X.min(axis=0))/(train_X.max(axis=0)-train_X.min(axis=0))#数据处理
y_train=train_y

x_test=(test_X-test_X.min(axis=0))/(test_X.max(axis=0)-test_X.min(axis=0))
y_test=test_y
x0_train=np.ones(num_train).reshape(-1,1)
x0_test=np.ones(num_test).reshape(-1,1)
X_train=tf.cast(tf.concat([x0_train,x_train],axis=1),tf.float32)
X_test=tf.cast(tf.concat([x0_test,x_test],axis=1),tf.float32)

Y_train=tf.constant(y_train.reshape(-1,1),tf.float32)
Y_test=tf.constant(y_test.reshape(-1,1),tf.float32)

learn_rate=0.01#设置超参数
iter=2000
display_step=200

np.random.seed(612)#设置模型变量初始值
W=tf.Variable(np.random.randn(3,1),dtype=tf.float32)

mse_train=[]
mse_test=[]

for i in range(0,iter+1):
    with tf.GradientTape() as tape:
        PRED_train=tf.matmul(X_train,W)
        Loss_train=0.5*tf.reduce_mean(tf.square(Y_train-PRED_train))
        PRED_test=tf.matmul(X_test,W)
        Loss_test=0.5*tf.reduce_mean(tf.square(Y_test-PRED_test))
    mse_train.append(Loss_train)
    mse_test.append(Loss_test)

    dL_dW=tape.gradient(Loss_train,W)
    W.assign_sub(learn_rate*dL_dW)
    if i % display_step == 0:
        print("i: %i,Train Loss: %f,Test Loss: %f"% (i,Loss_train,Loss_test))
plt.figure(figsize=(20,4))#可视化输出

plt.subplot(131)
plt.ylabel("MSE")
plt.plot(mse_train,color="blue",linewidth=3)
plt.plot(mse_test,color="red",linewidth=1.5)

plt.subplot(132)
plt.plot(y_train,color="blue",marker="o",label="true_price")
plt.plot(PRED_train,color="red",marker=".",label="predict")
plt.legend(loc="upper right")
plt.ylabel("Price")

plt.subplot(133)
plt.plot(y_test,color="blue",marker="o",label="true_price")
plt.plot(PRED_test,color="red",marker=".",label="predict")
plt.legend(loc="upper right")
plt.ylabel("Price")

plt.show()

在这里插入图片描述

题目三:

从波士顿房价数据集中选择合适的属性使用多元线性回归模型预测房屋价格。
要求:
(1)属性分析:
观察波士顿房价数据集的可视化结果,分析各个属性对房价的影响。找出你认为最佳的属性组合,并说明理由;
(2)建立和训练模型:
编写代码,建立并训练多元线性回归模型预测房价,并测试模型性能;
(3)记录实验过程和结果:
记录超参数的调试过程,寻找使模型达到最佳性能的超参数、迭代次数和训练时间,并记录训练和测试过程及结果;
(4)分析和总结:
比较分别使用单一属性、全部属性和你自己选择的属性组合训练模型时,学习率、迭代次数等参数,以及在训练集和测试集上的交叉熵损失、准确率和训练时间等结果,以表格或其他合适的图表形式展示。通过以上结果,可以得到什么结论,或对你有什么启发。

代码:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
boston_housing=tf.keras.datasets.boston_housing
(train_x,train_y), (test_x,test_y) = boston_housing.load_data() #加载数据集

train_X=train_x[:,[5,12]]#数据处理,第6和13个属性,低收入人口及房屋面积
test_X=test_x[:,[5,12]]

num_train=len(train_X)
num_test=len(test_X)
x_train=(train_X-train_X.min(axis=0))/(train_X.max(axis=0)-train_X.min(axis=0))#数据处理
y_train=train_y

x_test=(test_X-test_X.min(axis=0))/(test_X.max(axis=0)-test_X.min(axis=0))
y_test=test_y
x0_train=np.ones(num_train).reshape(-1,1)
x0_test=np.ones(num_test).reshape(-1,1)
X_train=tf.cast(tf.concat([x0_train,x_train],axis=1),tf.float32)
X_test=tf.cast(tf.concat([x0_test,x_test],axis=1),tf.float32)

Y_train=tf.constant(y_train.reshape(-1,1),tf.float32)
Y_test=tf.constant(y_test.reshape(-1,1),tf.float32)

learn_rate=0.01#设置超参数
iter=2000
display_step=200

np.random.seed(612)#设置模型变量初始值
W=tf.Variable(np.random.randn(3,1),dtype=tf.float32)

mse_train=[]
mse_test=[]

for i in range(0,iter+1):
    with tf.GradientTape() as tape:
        PRED_train=tf.matmul(X_train,W)
        Loss_train=0.5*tf.reduce_mean(tf.square(Y_train-PRED_train))
        PRED_test=tf.matmul(X_test,W)
        Loss_test=0.5*tf.reduce_mean(tf.square(Y_test-PRED_test))
    mse_train.append(Loss_train)
    mse_test.append(Loss_test)

    dL_dW=tape.gradient(Loss_train,W)
    W.assign_sub(learn_rate*dL_dW)
    if i % display_step == 0:
        print("i: %i,Train Loss: %f,Test Loss: %f"% (i,Loss_train,Loss_test))
plt.figure(figsize=(20,4))#可视化输出

plt.subplot(131)
plt.ylabel("MSE")
plt.plot(mse_train,color="blue",linewidth=3)
plt.plot(mse_test,color="red",linewidth=1.5)

plt.subplot(132)
plt.plot(y_train,color="blue",marker="o",label="true_price")
plt.plot(PRED_train,color="red",marker=".",label="predict")
plt.legend(loc="upper right")
plt.ylabel("Price")

plt.subplot(133)
plt.plot(y_test,color="blue",marker="o",label="true_price")
plt.plot(PRED_test,color="red",marker=".",label="predict")
plt.legend(loc="upper right")
plt.ylabel("Price")

plt.show()

在这里插入图片描述

4.实验小结

① 实验过程中遇到了哪些问题,你是如何解决的?
数组切片取数据,取的不对.反复尝试.
② 在实验过程中,你认为影响模型性能的因素有哪些?
对数据有没有进行归一化处理,超参数的设置.
③ 梯度下降法可以求解凸函数的全局最小值,当函数是非凸函数时,是否可以使用梯度下降法,得到全局最小值,为什么?
不可以,可能陷入局部极小值
④ 在题目基本要求的基础上,你对每个题目做了那些扩展和提升?或者你觉得在编程实现过程中,还有哪些地方可以进行优化?
多尝试几次超参数的设置,尽量使模型最优

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Git】—— 版本控制(忽略文件、查看修改内容,撤销未提交的修改、查看历史提交记录)

目录 一、准备工作 二、忽略文件 三、查看修改内容 四、撤销未提交的修改 五、查看提交记录 前面学习了Git最基本的用法,包括安装Git、创建代码仓库以及提交本地代码。 下面将要学习版本控制。 一、准备工作 先选择一个项目,给它创建一个代码仓库&a…

Linux环境定时备份MySQL数据库

数据库备份常有,实现备份,大概需要3个步骤: 目录 1.创建数据库备份用户 2.创建数据库备份shell脚本 3.创建定时任务 1.创建数据库备份用户 为了数据安全,不建议使用root用户。举例:创建数据库备份用户 dump&#…

复现永恒之蓝[MS17_010]

目录 准备靶机 测试ping连通性 攻击漏洞 利用漏洞 准备靶机 1台kali,1台win7 win7系统可以在MSDN镜像网站里获取 注:将win7安装好,win7无法安装vmtools,若升级系统,可能会把永恒之蓝补丁打上,所以建议别升级系统 测试…

用Java创建可扩展的OpenAI GPT应用程序

ChatGPT 值得深入使用的方面之一是它的引擎,它不仅为基于Web的聊天机器人提供动力,还可以集成到Java应用程序中。 ▌Budget Journey App 想象一下,你想去一个城市旅行并且设置好了预算,你应该如何分配你的钱并让你的旅行难忘&am…

巧用千寻位置GNSS软件|逐点放样应用技巧

线路逐点放样是针对施工需要和设计要求,对线路 20、50、100间隔的整桩距或整桩号的特定桩位进行连续放样设定的程序。运用千寻位置GNSS软件如何快速实现线路逐点放样呢?让我们一探究竟吧! 点击【测量】->【线路逐点放样】,选择…

CMake : Linux 搭建开发 - g++、gdb

目录 1、环境搭建 1.1 编译器 GCC,调试器 GDB 1.2 CMake 2、G 编译 2.1 编译过程 编译预处理 *.i 编译 *.s 汇编 *.o 链接 bin 2.2 G 参数 -g -O[n] -l、-L -I -Wall、-w -o -D -fpic 3、GDB 调试器 3.1 调试命令参数 4、CMake 4.1 含义 4.2…

npm全局包及项目包的讲解与方法

看图可知 安装全局包和项目包 我们通过npm install 命令来安装包,简单说就是把包从npm的官网(或者是指定的镜像源)下载到我们自己的电脑中。那具体这个包下载到哪里了,还是有一点讲究的。 分成两类: 全局安装: 包被…

IntelliJ IDEA 新建安卓项目失败,网上的各种教程都不管用的看向这里!!!

目录 1、出现的问题: 2、解决办法: 1)新建项目 2)修改设置 3、注意 备注: 目的:最近开发机器人远程控制需要一个安卓app,之前是自己做了个H5app来用的,H5不是很稳定,所…

Kotlin基础

Kotlin基础 一.Kotlin介绍1.诞生2.Kotlin与JVM3.为什么学习kotlin?4.Kotlin跨平台特性 二.变量常量类型条件语句函数1.声明变量2.内置数据类型3.只读变量4.类型推断5.编译时常量6.条件语句:表达式7.String模板8.函数 三.匿名函数函数类型高阶函数&#x…

关于OKD(OpenShift)中组件资源介绍和命令行操作的一些笔记

写在前面 参加考试,会陆续分享一些 OpenShift 的笔记博文内容为 openshift 常见 API 资源对象介绍,包括所特有的 Route,IS,DC,BC 等。学习环境为 openshift v3 的版本,有些旧这里如果专门学习 openshift &a…

第一节 ogre源码编译与安装

一. 电脑环境要求 本机使用的编译环境为:系统为Windows 10, Microsoft Visual Studio Enterprise 2019,版本 16.11.26,cmake-3.18.6-win64-x64 这些为基本的操作环境自己可以从网上下载安装。 二. 依赖环境下载 DirectX SDK &a…

Blade项目的IDE支持

Blade是一个C/C构建工具,详细介绍见Blade构建工具。虽然功能强大,但是缺少IDE支持。本文介绍如何在Blade项目中使用IDE的智能提示、自动补全、自动跳转等特性。 1.VSCode VSCode的C/C插件(ms-vscode.cpptools)提供了C/C代码的智能提示、自动补全和调试…

Java编程设计语言-集合类

API(application programming interface)是JDK的重要组成部分,API提供了Java程序与运行它的系统软件(Java虚拟机)之间的接口,可以帮助开发者方便、快捷地开发Java程序 集合在程序设计中是一种重要的是数据结构,Java中提…

数据湖Iceberg-FlinkSQL-kafka类型表数据无法成功写入(6)

数据湖Iceberg-简介(1) 数据湖Iceberg-存储结构(2) 数据湖Iceberg-Hive集成Iceberg(3) 数据湖Iceberg-SparkSQL集成(4) 数据湖Iceberg-FlinkSQL集成(5) 数据湖Iceberg-FlinkSQL-kafka类型表数据无法成功写入(6) 数据湖Iceberg-Flink DataFrame集成(7) 数据湖Iceberg-FlinkSQL-…

Linux离线状态下在anaconda中安装pytorch

1. 下载与安装说明 下载地址(按安装方法选取) bz2压缩包下载地址:https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/win-64/?CM&ODwhl包下载 torch、torchversion、torchaudio下载地址:https://download.pytorc…

【OS】Linux Process Memory的探究

【OS】Linux Process Memory的探究 前言 刷B站刷到了南大OS的课程&#xff0c;不得不说酒吧舞的教育水平真滴高&#xff0c;狠狠的看了一些关于进程地址相关的课程。 进程地址空间 1.导言 先导入两个问题&#xff1a; 如下的程序会输出什么&#xff1f; #include<stdio…

axios的使用,axios的get请求、post请求方式、put请求方式

axios (发音&#xff1a;艾克C奥斯)是前端圈最火的、专注于数据请求的库。react/vue官方都推荐使用axios发送ajax请求&#xff0c;是一个基于 promise 的 HTTP 库&#xff0c;可以用在浏览器和 node.js 中。 中文官网地址&#xff1a;http://www.axios-js.com/ 英文官网地址&a…

快速下载VScode并配置Python运行环境【详细教程】

快速下载VScode并配置Python运行环境【详细教程】 博主&#xff1a;命运之光 目录 快速下载VScode并配置Python运行环境【详细教程】前言下载vscode第一步vscode官网下载第二步点击下载![请添加图片描述](https://img-blog.csdnimg.cn/1d76c427314b4ddcbd350e0a7e5449d5.png)第…

数据湖Iceberg-FlinkSQL集成(5)

文章目录 数据湖Iceberg-FlinkSQL集成环境准备**Flink与Iceberg的版本对应关系如下**jar包下载地址jar包上传到Flink lib目录下修改flink-conf.yaml配置 创建和使用Catalog创建语法说明Hive CatalogHadoop Catalog配置sql-client初始化文件 DDL语句创建数据库创建表创建分区表使…

ubuntu22.04安装ROS2

ubuntu22.04安装ROS2 0.前言一、安装ROS21.首先将本地的编码格式修改为utf-82.添加ROS2 GPG key3.安装ROS24.设置环境变量 二、简单测试1.Hello ROS&#xff01;2.ROS Turtle 三、总结 0.前言 最近也没找到什么特别感兴趣的小项目&#xff0c;不过偶然间看见ROS2这个东西&#…