用Python构建一个简单的神经网络

news2024/11/22 20:00:25

准备工作

首先我们需要使用到vscode

终端

窗口下输入安装:pip3 install tensorflow pandas numpy keras


代码编写

导入库

import tensorflow as tf
from tensorflow.keras.models import Sequential  
from tensorflow.keras.layers import Dense
import pandas as pd
import numpy as np
相关知识:
Sequential 模型

是 Keras 提供的一种简单的模型类型,它允许我们按顺序(从输入到输出)堆叠不同的神经网络层。它的主要作用包括:

  1. 简单易用:通过简单的顺序结构定义神经网络,适用于大多数标准的前馈神经网络。
  2. 堆叠层次:允许按顺序添加各种类型的神经网络层,例如全连接层 (Dense)、卷积层、循环层等,构建起整个神经网络模型。
  3. 快速搭建:对于简单的神经网络结构,使用 Sequential 模型可以更快速地创建和调试模型,适合初学者和快速原型开发。
Dense

是神经网络中最基本的层之一,也称为全连接层或密集连接层。它的作用包括:

  1. 特征学习:每个神经元与上一层的所有神经元都连接,每个连接都有一个权重,通过学习这些权重可以进行特征的自动提取和学习。
  2. 非线性变换:通过激活函数(如ReLU、sigmoid等),引入非线性变换,使得神经网络能够学习复杂的数据模式和特征。
  3. 输出预测:在输出层使用 Dense 层时,神经网络可以通过学习权重和偏置来生成输出预测,如回归中的数值预测、分类中的概率分布等。

总的来说,Sequential模型是一种容器,用于按顺序堆叠神经网络层次,而Dense层是其中一种基本的全连接神经网络层类型,用于实现特征学习和非线性变换。


数据准备

定义了一个包含房间数量、浴室数量、房屋面积、地理位置和房价的数据集,并将其转换为DataFrame格式。

data = {
    'bedrooms' : [3,4,2,5],
    'bathrooms' : [2,3,1,4],
    'sqft' : [1500,2000,800,2500],
    'location' : [1,2,1,2], # 1:市区,2:郊区
    'price' : [300000,450000,200000,500000]
}
df = pd.DataFrame(data)# 将数据转换为DataFrame格式

# 特征变量:房间数量、浴室数量、房屋面积、地理位置
x = df[['bedrooms','bathrooms','sqft','location']]

y = df[['price']]# 目标变量:房价

解释:将数据转换为DataFrame格式(使用 pd.DataFrame(data))使得能够方便地选择特征和标签,并且能够利用pandas提供的数据处理和分析功能来准备和探索数据。


模型定义

使用 Sequential() 创建一个顺序模型。

model = Sequential()  # 创建Sequential模型,用于按顺序堆叠神经网络层次

添加了一个具有64个神经元和ReLU激活函数的输入层,接受四个特征作为输入。

model.add(Dense(units=64, activation='relu', input_shape=(4,)))

添加了一个具有32个神经元和ReLU激活函数的隐藏层。

model.add(Dense(units=32, activation='relu'))

添加了一个输出层,用于输出单个数值(房价预测)。

model.add(Dense(units=1))


模型编译和训练

使用 compile() 方法编译模型,指定优化器为Adam,损失函数为均方误差(用于回归问题)。

model.compile(optimizer='adam', loss='mean_squared_error')
为什么要编译模型?

编译模型的过程实际上是在定义模型的训练过程中所需的一些关键设置。当你调用 model.compile() 时,你需要指定以下几个参数:

  1. 优化器(Optimizer):用于控制模型如何进行参数更新,以最小化损失函数。优化器决定了模型在训练过程中如何调整权重和偏置。常见的优化器包括随机梯度下降(SGD)、Adam、RMSprop等。
  2. 损失函数(Loss function):用于衡量模型预测结果与真实标签之间的差异。损失函数的选择取决于你的问题类型,例如均方误差(MSE)适用于回归问题,交叉熵适用于分类问题。
  3. 评估指标(Metrics):用于监控训练和测试过程中模型性能的指标,如准确率、均方误差等。

  编译模型的目的是将这些配置参数与模型结合起来,为训练过程提供指导。这样,当你调用 model.fit() 方法进行训练时,模型就知道如何计算损失、如何优化权重,并在训练过程中输出评估指标。

为什么使用Adam优化器和均方误差损失函数?

Adam优化器:Adam(Adaptive Moment Estimation)优化器结合了动量方法和自适应学习率方法,被广泛认为在实践中表现良好。它能够自适应地调整每个参数的学习率,通常能够更快地收敛到全局最优点。相比于传统的随机梯度下降(SGD),Adam通常能够更有效地处理大型数据集和高维空间。

均方误差损失函数(Mean Squared Error,MSE):对于回归问题,MSE 是一个常用的损失函数。它计算预测值与真实值之间的平方差的平均值。MSE 在数学上可微分且凸,这使得优化过程更加稳定和可行。通过最小化MSE,模型可以更好地学习到训练数据中的模式,从而产生更精确的预测。

  综上所述,编译模型是为了设置模型训练所需的参数,包括优化器和损失函数。选择Adam优化器和均方误差损失函数通常是因为它们在实践中表现良好,并且能够有效地推动模型学习和收敛到合适的解决方案。

使用 fit() 方法训练模型,传入特征 x 和目标 y,进行100个epoch的训练,每次训练一个样本(批量大小为1)。

model.fit(x, y, epochs=100, batch_size=1)
Epoch

是指整个训练数据集被送入神经网络中,并完成一次正向传播和反向传播(即参数更新)的过程。换句话说,一个epoch表示神经网络已经看过整个训练数据集一次。

为什么要训练100个epoch?

训练100个epoch的意义在于确保模型有足够的时间从数据中学习到足够的特征和模式。具体到训练的次数,通常有以下几个考虑因素:

  1. 收敛到最优解:在开始阶段,模型可能表现得比较糟糕,但随着训练的进行,模型会逐渐优化参数,损失函数会逐渐减小,性能会逐渐提升。训练多个epoch有助于模型更好地收敛到最优解。
  2. 防止过拟合:通过多次epoch的训练,可以观察到模型在训练集和验证集上的性能变化。如果模型在训练集上表现优秀而在验证集上表现糟糕,可能是过拟合的迹象,此时可以通过早停(early stopping)等技术来避免。
  3. 处理大数据集:在处理大数据集时,通常需要更多的epoch来确保模型充分学习到数据的特征和模式。

为什么批量大小设置为1?
  1. 批量大小是指在每次参数更新时所使用的样本数。批量大小为1意味着每次只用一个样本来更新参数。选择批量大小的主要考虑因素包括:
  2. 内存限制:大批量大小可能会导致内存不足,特别是在处理大数据集时。
  3. 收敛速度:较小的批量大小可以更频繁地更新参数,可能会加快模型的收敛速度。
  4. 稳定性:较大的批量大小可能会导致参数更新方向不稳定,而较小的批量大小通常能够提供更加稳定的梯度估计。

  选择批量大小为1可能是为了更细粒度地调整参数,尤其是在训练数据集较小或者希望更频繁地更新模型时。然而,较小的批量大小也可能会导致训练过程更加嘈杂和不稳定,需要通过合适的学习率和优化器来调整。

  综上所述,epoch表示模型看过整个数据集的次数,训练100个epoch通常是为了确保模型充分学习数据的特征和模式。而批量大小为1可能是出于对模型训练过程更细致控制的需要。


预测

准备一个新的样本输入 sample_input,包含房间数量、浴室数量、房屋面积和地理位置。

sample_input = np.array([[6,3,10000,1]])

使用 predict() 方法对样本进行价格预测,并输出预测结果。

predicted_price = model.predict(sample_input)

print(f"预测的价格为: ${predicted_price[0][0]:,.2f}")

完整代码

import tensorflow as tf
from tensorflow.keras.models import Sequential  
from tensorflow.keras.layers import Dense
import pandas as pd
import numpy as np

# 定义数据,包括房间数量、浴室数量、房屋面积、地理位置和房价
data = {
    'bedrooms' : [3,4,2,5],
    'bathrooms' : [2,3,1,4],
    'sqft' : [1500,2000,800,2500],
    'location' : [1,2,1,2], # 1:市区,2:郊区
    'price' : [300000,450000,200000,500000]
}

df = pd.DataFrame(data)# 将数据转换为DataFrame格式

x = df[['bedrooms','bathrooms','sqft','location']]# 特征变量:房间数量、浴室数量、房屋面积、地理位置
y = df[['price']]# 目标变量:房价

model = Sequential()  # 创建Sequential模型,用于按顺序堆叠神经网络层次

# 输入层
# 添加一个具有64个神经元和ReLU激活函数的全连接层,输入形状为(4,),对应四个特征
model.add(Dense(units=64, activation='relu', input_shape=(4,)))

# 隐藏层
# 添加一个具有32个神经元和ReLU激活函数的隐藏层
model.add(Dense(units=32, activation='relu'))

# 输出层
# 添加一个输出层,用于输出单个数值(房价预测)
model.add(Dense(units=1))

# 编译模型,使用Adam优化器和均方误差损失函数
model.compile(optimizer='adam', loss='mean_squared_error')

# 训练模型,使用输入x和目标y,训练100个epoch,批量大小为1
model.fit(x, y, epochs=100, batch_size=1)

# 准备一个样本输入,包含房间数量、浴室数量、房屋面积、地理位置
sample_input = np.array([[6,3,10000,1]])

# 使用训练好的模型进行价格预测
predicted_price = model.predict(sample_input)

print(f"预测的价格为: ${predicted_price[0][0]:,.2f}")  # 打印预测价格

最后

这篇文章只是给像我一样的初学者提供一点思路以及了解一些库的使用,具体改进和拓展可以通过爬虫技术(如BeautifulSoup库)从网站上获取房子的相关信息,例如房间数量、客厅数量、厕所数量、房屋面积、地理位置和价格。将爬取到的数据保存为Excel表格或者直接用pandas加载为DataFrame。我们也可以对数据进行预处理,对网络进行模型优化,将训练好的模型部署为Web服务或API,以便实时接收用户输入并返回预测结果,也添加用户界面(如Flask或Django)以便用户友好地输入房屋特征并获取预测价格。

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

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

相关文章

PyTorch深度学习实战(3)—— 小试牛刀:CIFAR-10分类

下面尝试从零搭建一个PyTorch模型来完成CIFAR-10数据集上的图像分类任务,步骤如下。 (1)使用torchvision加载并预处理CIFAR-10数据集。 (2)定义网络。 (3)定义损失函数和优化器。 (4…

面向服务架构(SOA)介绍

在汽车电子电气架构还处于分布式时代时,汽车软件的开发方式主要是采用嵌入式软件进行开发,而随着汽车智能化程度的加深,更加复杂且多样的功能需求让汽车软件在复杂度上再上一层。在整车的自动驾驶方面,由于未来高阶自动驾驶能力的…

JavaScript constructor原型原型继承

constructor 在 JavaScript 中,构造函数是一种特殊的函数,使用 new 关键字来调用,用于创建对象实例。JavaScript 中的构造函数通常通过 function 关键字定义。 例如: function Person(name, age) {this.name name;this.age a…

C语言预处理:开启编程新境界

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 1. 预处理符号 在C语言中,我们可以通过一些预定义符号查看文件的…

vue中post请求返回二进制流文件下载

1 .调用接口返回的如下图所示,此时看到是一个流文件 2.不管是get请求还是post请求都需要加上 下面这行代码 responseType: "blob", 3.我们自行二次封装的axios可能会导致乱码现象,建议直接用axios调用接口请求 4.关于Excel导出 POI 响应头设置 Content-Type: applica…

Tomcat高可用集群(实例详解)

一.环境准备 虚拟机的版本:VMware-workstation-full-15.5.6-16341506.exe系统镜像版本:CentOS-6.10-x86_64-bin-DVD1.iso,全新安装,桌面版,可上网系统内存大小:1GB系统硬盘大小:20GB连接工具版…

《决胜B端 产品经理升级之路》 知识点总结

什么是b端产品? b端产品是指面向企业或组织的经营管理问题,旨在解决企业规模、成本、效率、品质和风控等方面的产品。这些产品主要帮助企业提高运营效率、降低成本、改善品质和控制风险等。b端产品适用于各种行业和企业类型,可以为企业带来深…

WordPress原创插件:disable-gutenberg禁用古腾堡编辑器和小工具

WordPress原创插件:disable-gutenberg禁用古腾堡编辑器和小工具 disable-gutenberg插件下载:https://download.csdn.net/download/huayula/89616495

【zlm】针对单个设备的音频的编码的设置

目录 结论 原理 测试 结论 为了防止zlm音频配置里设置成opus优先,在国标推流时,调用push时,默认加上codecpcma 如下 https://10.60.100.196:10443/index/api/webrtc?applive&streamtest&typepush&codecpcma 原理 测试 …

ASP.Net Core设置接口根路径的方法

使用asp.net core开发微服务项目,需要给每个服务设置不同的根路径,这样既能使用网关转发请求,又方便对单个服务进行测试,保证请求路径的统一。 设置方法需要使用中间件,在Program.cs添加如下代码 app.UsePathBase(&qu…

量化投资基础(四)之AR、MA、ARMA与ARIMA模型

点赞、关注,养成良好习惯 Life is short, U need Python 量化投资基础系列,不断更新中 1 引言 时间序列经典模型主要有: 自回归模型(Auto Regressive,AR)移动回归模型(Moving Average,MA&…

无线领夹麦克风哪个品牌好,哪款领夹式麦克风性价比高

随着自媒体行业的蓬勃发展,内容创作者对高质量音频设备的需求日益增长。无线领夹麦克风,凭借其便携性、高音质与灵活性,正逐渐成为视频制作、直播互动及日常Vlog记录的标配工具。其兴起不仅反映了创作者对专业录音品质的追求,也体…

Web安全学习

1 计算机网络与协议 1.1 网络基础 1.1.1 计算机通信网的组成 计算机网络由通信子网和资源子网组成。 通信子网:负责数据的无差错和有序传递,其处理功能包括差错控制、流量控制、路由选择、网络互连等。 资源子网:是计算机通信的本地系统环境…

全球油价与棕榈油市场波动

一、油价暴跌与经济衰退担忧 周一(8月5日)欧盘时段,油价暴跌,两大主要基准油价均下跌逾2%,触及八个月低点。油价的急剧下跌主要是由于人们担心全球最大的石油消费国美国可能陷入衰退。全球疲弱的经济数据加剧了人们对燃…

绿色精益生产新潮流:环保也能成为竞争力!

在当今这个快速变化且竞争激烈的市场环境中,企业面临着前所未有的挑战。为了保持竞争力并实现可持续发展,企业必须不断探索和采用更高效、更灵活的生产管理方式。精益生产,作为一种源自日本丰田汽车公司的生产哲学,凭借其消除浪费…

Animate软件基本概念:组和文本

这里继续介绍Animate软件中的基本概念,组和文本两个概念。 FlashASer:AdobeAnimate2021软件零基础入门教程https://zhuanlan.zhihu.com/p/633230084 FlashASer:实用的各种Adobe Animate软件教程https://zhuanlan.zhihu.com/p/675680471 Fl…

Go - 10. * 值类型和指针类型的差异

目录 一.引言 二.接收者类型 三.代码示例 1.指针接收者 2.值接收者 3.运行结果对比 4.代码修改 5.刨根问底 四.总结 一.引言 go 语言中 func (c *Title) 和 func (c Title) 两个方法的传参差一个 * 号,二者的区别是一个是指针类型,一个是值类型…

scratch水仙花数 2024年6月scratch四级 中国电子学会图形化编程 少儿编程等级考试四级真题和答案解析

目录 scratch水仙花数 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、p…

深度学习入门(一):感知机与输入数据

单层感知机与多层感知机 单层感知机(Single-Layer Perceptron)和多层感知机(Multi-Layer Perceptron,简称MLP)是神经网络的基本形式,用于执行各种机器学习任务,包括分类和回归。它们都基于早期…

赚他10个亿...

体育竞技 & 商业价值 虽然昨天遭受了全球黑一,但四年一度的奥运会还是要关注的。 不知道最近大家是否有关注巴黎奥运会,印象深刻的项目又是哪个? 截止于发稿前,目前「金牌榜」上,中国以微弱优势位于第一&#xff0…