基于Tensorflow的神经网络模型搭建——气温预测
基于Tensorflow的神经网络模型搭建
环境:
Anaconda3
python 3.8.10
TensorFlow 2.3.0
numpy 1.22.4
Pycharm 2022.1
文章目录
回归问题预测
- Tensorflow2.x 版本中将使用大量的Keras的简介建模方法
导包
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
import datetime
import pandas as pd
from sklearn import preprocessing
from tensorflow.keras import layers
import tensorflow.keras
import warnings
warnings.filterwarnings('ignore')
------------------------------------------------------
# 忽略
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
至于为什么加入忽略,这里不多赘述,想要研究到底为什么的小伙伴可以自行步入下面的链接
读取文件
文件如下,需要请自行下载:
链接:https://pan.baidu.com/s/1o0IyPFJNrurLRCUbji6_EA?pwd=knsw 提取码:knsw
tips:csv颜色插件如图,需要请自行搜索并应用
features = pd.read_csv('temps.csv')
features.head()
print('数据维度:', features.shape)

"""
表中数据说明:
year,month,day,week分别代表具体时间
temp_2:前天的最高温度
temp_1:昨天的最高温度
average:历史中,每一年平均最高温度值
actual:标签值,当天真实最高温度
friend:你哥们预测的
"""
日期格式处理
为方便时间数据的处理和展示等操作,这里使用 datetime 对其进行格式更改
import datetime
# 分别得到年、月、日
years = features['year']
months = features['month']
days = features['day']
# datetime格式
dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in
zip(years, months, days)]
dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates]
特征可视化展示
tips:
拿到自己的数据之后需要做的事:
1、数据处理
2、检查数据有无异常值
# 画图
plt.style.use('fivethirtyeight')
# 设置布局
fig, ((ax1, ax2), (ax3, ax4)) = plt.subplots(nrows=2, ncols=2, figsize=(10, 10))
fig.autofmt_xdate(rotation=45)
# 标签值
ax1.plot(dates, features['actual'])
ax1.set_xlabel('')
ax1.set_ylabel('Temperature')
ax2.set_title('Max Temp')
# 昨天
ax2.plot(dates, features['temp_1'])
ax2.set_xlabel('')
ax2.set_ylabel('Temperature')
ax2.set_title('Previous Max Temp')
# 前天
ax3.plot(dates, features['temp_2'])
ax3.set_xlabel('')
ax3.set_ylabel('Temperature')
ax3.set_title('Two Days Prior Max Temp')
# friend
ax4.plot(dates, features['friend'])
ax4.set_xlabel('')
ax4.set_ylabel('Temperature')
ax4.set_title('Friend Estimate')
plt.tight_layout(pad=2)
plt.show()

数据预处理
由于数据中 week 这一列的数据是字符串形式,需要对其进行预处理
# 独热编码
features = pd.get_dummies(features)
# features.head(5)
# 标签
labels = np.array(features['actual'])
# 在特征中去掉标签
features = features.drop('actual', axis=1)
# 名字单独保存
features_list = list(features.columns)
# 转换成合适格式
features = np.array(features)
input_features = preprocessing.StandardScaler().fit_transform(features)
print(input_features[0])
对于 input_features = preprocessing.StandardScaler().fit_transform(features) 这句话,需要包为 sklearn

基于Kras构建网络模型
构造网络模型
一些常用参数如下:
activation:激活函数选择,一般常用relu
kernel_initializer, bias_initializer:权重与偏置参数的初始化方法,有时候不收敛,换种初始化就好了
kernel_regularizer, bias_regularizer:要不要加入正则化
inputs:输入,自己指定 或 让网络模型自己选择
units:神经元个数
这里自己选择神经元个数,也可以根据输入特征来画图进行推导,hidden层自己选择适当添加

由于使用的是 Tensorflow2.x 所以只需要其中使用的每个Hidden有多少个神经元,输出有几个结果即可
# 按顺序构造神经元
model = tf.keras.Sequential()
model.add(layers.Dense(16))
model.add(layers.Dense(32))
model.add(layers.Dense(1))
其中,layers里有很多层的实现,如卷积层等等…,这里用的是全连接层

配置网络参数
指定优化器和损失函数,并使用迭代的方式优化网络模型
model.compile(optimizer=tf.keras.optimizers.SGD(0.001),
loss='mean_squared_error')
model.fit(input_features, labels, validation_split=0.25, epochs=10, batch_size=128)
解释_fit函数参数:
1、x 2、y
3、自行切割出25%的数据作为验证集
4、迭代次数
5、每次迭代样本数
"""
源码
"""
@enable_multi_worker
def fit(self,
x=None,
y=None,
batch_size=None,
epochs=1,
verbose=1,
callbacks=None,
validation_split=0.,
validation_data=None,
shuffle=True,
class_weight=None,
sample_weight=None,
initial_epoch=0,
steps_per_epoch=None,
validation_steps=None,
validation_batch_size=None,
validation_freq=1,
max_queue_size=10,
workers=1,
use_multiprocessing=False):
若使用其他优化器可自行步入官方文档进行查阅(我觉得这很pytorch)

其中loss是训练损失结果,val_loss是验证损失结果
目前看来,训练损失还凑合,但是验证损失比较大,处于****过拟合状态
如何理解欠拟合和过拟合,请看此文章 理解过拟合 - 知乎
那么如何调参保证不让他过拟合,让他收敛呢???
通过下面的方法,将模型参数打印出来看一下
model.summary()

可以看到每一层计算后的结果,当然可以往前推计算出特征值个数
调参
更改一下初始化方法的参数试试
kernel_initializer
这里先使用随机高斯分布进行调参
学习入口:正态(高斯)分布
model = tf.keras.Sequential()
model.add(layers.Dense(16, kernel_initializer='random_normal'))
model.add(layers.Dense(32, kernel_initializer='random_normal'))
model.add(layers.Dense(1, kernel_initializer='random_normal'))
为了让他多学一会,我又将epoch上调到100
model.compile(optimizer=tf.keras.optimizers.SGD(0.001),
loss='mean_squared_error')
model.fit(input_features, labels, validation_split=0.25, epochs=100, batch_size=128)
可以看到,这次效果好了一点,当然了,epoch上调起了决定性作用hhhh

这回将高斯分布剔除,再跑一边看看,高斯分布的影响

当然,这个的优化还是有作用的,毕竟那几个三位数也不怎么样
kernel_regularizer
这回再加入正则化惩罚项试试
model = tf.keras.Sequential()
model.add(layers.Dense(16, kernel_initializer='random_normal', kernel_regularizer=tf.keras.regularizers.l2(0.03)))
model.add(layers.Dense(32, kernel_initializer='random_normal', kernel_regularizer=tf.keras.regularizers.l2(0.03)))
model.add(layers.Dense(1, kernel_initializer='random_normal', kernel_regularizer=tf.keras.regularizers.l2(0.03)))

可以看到,效果有一点提升,但是不那么明显
模型预测
predict = model.predict(input_features)
predict.shape
-------------------------------------------------------
"""
(348, 1)
"""
测试结果
为了让模型更可靠,我将epoch上调至10000次,并将结果可视化
plt.style.use('fivethirtyeight')
# 创建表保存日期和其对应的标签数值
dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in
zip(years, months, days)]
dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in dates]
true_data = pd.DataFrame(data={'date': dates, 'actual': labels})
# 创建表保存日期和其对应的模型预测值
months = features[:, features_list.index('month')]
days = features[:, features_list.index('day')]
years = features[:, features_list.index('year')]
test_dates = [str(int(year)) + '-' + str(int(month)) + '-' + str(int(day)) for year, month, day in
zip(years, months, days)]
test_dates = [datetime.datetime.strptime(date, '%Y-%m-%d') for date in test_dates]
predictions_data = pd.DataFrame(data={'date': test_dates, 'prediction': predict.reshape(-1)})
# 真实值
plt.plot(true_data['date'], true_data['actual'], 'b-', label='actual')
# 预测值
plt.plot(predictions_data['date'], predictions_data['prediction'], 'ro', label='prediction')
plt.xticks(rotation='60')
plt.legend()
# 图名
plt.xlabel('Date')
plt.ylabel('Maximum Temperature (F)')
plt.title('Actual and Predicted Values')
plt.tight_layout(pad=2)
plt.show()

可见结果还是可以接受的,啊。。。。右上角那个点是怎么回事儿??!!
To be continued…
基于Tensorflow的神经网络模型搭建——气温预测的更多相关文章
- 深度学习之PyTorch实战(2)——神经网络模型搭建和参数优化
上一篇博客先搭建了基础环境,并熟悉了基础知识,本节基于此,再进行深一步的学习. 接下来看看如何基于PyTorch深度学习框架用简单快捷的方式搭建出复杂的神经网络模型,同时让模型参数的优化方法趋于高效. ...
- TensorFlow-Bitcoin-Robot:一个基于 TensorFlow LSTM 模型的 Bitcoin 价格预测机器人
简介 TensorFlow-Bitcoin-Robot:一个基于 TensorFlow LSTM 模型的 Bitcoin 价格预测机器人. 文章包括一下几个部分: 1.为什么要尝试做这个项目? 2.为 ...
- TensorFlow-Bitcoin-Robot:一个基于 TensorFlow LSTM 模型的 Bitcoin 价格预测机器人。
简介 TensorFlow-Bitcoin-Robot:一个基于 TensorFlow LSTM 模型的 Bitcoin 价格预测机器人. 文章包括一下几个部分: 1.为什么要尝试做这个项目? 2.为 ...
- 通过TensorFlow训练神经网络模型
神经网络模型的训练过程其实质上就是神经网络参数的设置过程 在神经网络优化算法中最常用的方法是反向传播算法,下图是反向传播算法流程图: 从上图可知,反向传播算法实现了一个迭代的过程,在每次迭代的开始,先 ...
- 利用Tensorflow实现神经网络模型
首先看一下神经网络模型,一个比较简单的两层神经. 代码如下: # 定义参数 n_hidden_1 = 256 #第一层神经元 n_hidden_2 = 128 #第二层神经元 n_input = 78 ...
- 基于 Keras 用 LSTM 网络做时间序列预测
目录 基于 Keras 用 LSTM 网络做时间序列预测 问题描述 长短记忆网络 LSTM 网络回归 LSTM 网络回归结合窗口法 基于时间步的 LSTM 网络回归 在批量训练之间保持 LSTM 的记 ...
- 手写数字识别 ----卷积神经网络模型官方案例注释(基于Tensorflow,Python)
# 手写数字识别 ----卷积神经网络模型 import os import tensorflow as tf #部分注释来源于 # http://www.cnblogs.com/rgvb178/p/ ...
- Keras结合Keras后端搭建个性化神经网络模型(不用原生Tensorflow)
Keras是基于Tensorflow等底层张量处理库的高级API库.它帮我们实现了一系列经典的神经网络层(全连接层.卷积层.循环层等),以及简洁的迭代模型的接口,让我们能在模型层面写代码,从而不用仔细 ...
- 【TensorFlow/简单网络】MNIST数据集-softmax、全连接神经网络,卷积神经网络模型
初学tensorflow,参考了以下几篇博客: soft模型 tensorflow构建全连接神经网络 tensorflow构建卷积神经网络 tensorflow构建卷积神经网络 tensorflow构 ...
- 利用Tensorflow实现卷积神经网络模型
首先看一下卷积神经网络模型,如下图: 卷积神经网络(CNN)由输入层.卷积层.激活函数.池化层.全连接层组成,即INPUT-CONV-RELU-POOL-FC池化层:为了减少运算量和数据维度而设置的一 ...
随机推荐
- 【Maven】仓库
在 Maven 的术语中,仓库是一个位置(place). Maven 仓库是项目中依赖的第三方库,这个库所在的位置叫做仓库. 在 Maven 中,任何一个依赖.插件或者项目构建的输出,都可以称之为构件 ...
- access的多个left outer join连接
虽然你有一万个理由,但是选择ACCESS数据库就是一个不能再蠢的决定. 从AC990账务系统中采集凭证记录,需要做多个左连接.在sql server管理器中执行蛮好,没有问题.可是在程序中就一堆Err ...
- C#连接小智服务器并将音频解码播放过程记录
前言 最近小智很火,本文记录C#连接小智服务器并将音频解码播放的过程,希望能帮助到对此感兴趣的开发者. 如果没有ESP-32也想体验小智AI,那么这两个项目很适合你. 1.https://github ...
- wpf关于设备无关性的理解
wpf的像素单位是1/96*系统dpi.当前系统dpi是96,那么wpf的一个单位长就是1px像素.这个系统dpi的意思就是物理单位一英寸里有多少个像素点,比如windows标准的96dpi,意味着一 ...
- verilog利用线性插值实现正弦波生成器(dds)
verilog实现线性插值实现正弦波生成器 最近在项目上遇到一个需要在低资源FPGA上实现FFT逻辑的项目,而且要求实现窗函数.对于窗函数来说,莫非是实现正弦波生成器,正弦波生成器可以利用DDS模 ...
- SpringBoot 部署:外置依赖包
目录: 1.前言 2.瘦身前的Jar包 3.解决方案 一.前言 SpringBoot部署起来虽然简单,如果服务器部署在公司内网,速度还行,但是如果部署在公网(阿里云等云服务器上),部署起来实在头疼:编 ...
- (原创)[开源][.Net Framework 4.5] SimpleMVVM(极简MVVM框架)更新 v1.1,增加NuGet包
一.前言 意料之外,也情理之中的,在主业是传统行业的本人,技术的选型还是落后于时代. 这不,因现实需要,得将大库中的 WPF MVVM 相关部分功能拆分出来独立使用,想着来都来了,就直接开源得了,顺便 ...
- ArrayBlockingQueue的put方法底层原理
一.ArrayBlockingQueue的put方法底层原理 ArrayBlockingQueue 是 Java 并发包 (java.util.concurrent) 中的一个基于数组实现的有界阻塞队 ...
- mysql、PikaDB的使用方法和优化策略
Mysql 字段选择 尽量选用INT,BIGINT,4字节8字节的消耗小于varchar.字符串选择VARCHAR增加拓展性. 时间应使用时间戳BIGINT存储,不使用DATETIME. 不使用BLO ...
- thinkphphp 计算分页 和分页总数 和sql计算分页 php
利用page计算分页 $p=input('p')?input('p'):1; $limit=6; $res=db('points_log')->where(['p_uid'=>$uid,' ...
