各位同学好,今天和大家分享一下TensorFlow2.0深度学习中的一个小案例。案例内容:现有348个气温样本数据,每个样本有8项特征值和1项目标值,进行回归预测,构建神经网络模型。
数据集免费: 神经网络回归预测--气温数据集-机器学习文档类资源-CSDN文库https://download.csdn.net/download/dgvv4/49801464 ;
1. 数据获取
导入所需要的库文件,获取气温数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
# 使用keras建模方法
from tensorflow.keras import layers
import warnings
warnings.filterwarnings('ignore')
#(1)数据获取
filepath = 'C:\\...\\temps.csv'
features = pd.read_csv(filepath)
temp_2代表前天的最高温度,temp_1代表昨天的最高温度,预测目标值为actual
2. 数据可视化
我们绘制 日期-温度曲线,首先需要将特征year、month、day组合在一起,拼接成一个字符串,再转变成一个 datetime类型的数据。
# 处理时间数据,将年月日组合在一起
import datetime
# 获取年月日数据
years = features['year']
months = features['month']
days = features['day']
# 将年月日拼接在一起--字符串类型
dates = [] # 用于存放组合后的日期
for year,month,day in zip(years,months,days):
date = str(year)+'-'+str(month)+'-'+str(day) #年月日之间用'-'向连接
dates.append(date)
# 转变成datetime格式
times = []
for date in dates:
time = datetime.datetime.strptime(date,'%Y-%m-%d')
times.append(time)
# 看一下前5行
times[:5]
处理好了x轴的数据,我们现在来对几个特征绘制曲线
# 可视化,对各个特征绘图
# 指定绘图风格
plt.style.use('fivethirtyeight')
# 设置画布,2行2列的画图窗口,第一行画ax1和ax2,第二行画ax3和ax4
fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(2,2,figsize=(20,10))
# ==1== actual特征列
ax1.plot(times,features['actual'])
# 设置x轴y轴标签和title标题
ax1.set_xlabel('');ax1.set_ylabel('Temperature');ax1.set_title('actual temp')
# ==2== 前一天的温度
ax2.plot(times,features['temp_1'])
# 设置x轴y轴标签和title标题
ax2.set_xlabel('');ax2.set_ylabel('Temperature');ax2.set_title('temp_1')
# ==3== 前2天的温度
ax3.plot(times,features['temp_2'])
# 设置x轴y轴标签和title标题
ax3.set_xlabel('Date');ax3.set_ylabel('Temperature');ax3.set_title('temp_2')
# ==4== friend
ax4.plot(times,features['friend'])
# 设置x轴y轴标签和title标题
ax4.set_xlabel('Date');ax4.set_ylabel('Temperature');ax4.set_title('friend')
# 轻量化布局调整绘图
plt.tight_layout(pad=2)
3. 特征处理
首先我们需要划分特征值和目标值。在原数据中提取特征值和目标值,'actual'存放的是当日最高温度。
# 获取目标值y,从Series类型变成数组类型
targets = np.array(features['actual'])
# 获取特征值x,即在原数据中去掉目标值列,默认删除行,需要指定轴axis=1指向列
features = features.drop('axtual',axis=1)
# 把features从DateFrame变成数组类型
features = np.array(features)
由于特征值中存在字符串类型的数据, 'week'列都是字符串,因此我们需要对特征值进行 one-hot编码, 将字符串类型转变成数值类型。
# week列是字符串,重新编码,变成数值型
features = pd.get_dummies(features)
在处理完字符串数据之后,所有数据都变成了数字。为了避免因数据单元不同、跨度大而导致模型精度低的问题,对数值数据进行了标准化处理。
[En]
After processing the string data, all the data becomes numeric. In order to prevent the low accuracy of the model caused by different data units and large span, the numerical data is standardized.
# 导入标准化方法库
from sklearn import preprocessing
input_features = preprocessing.StandardScaler().fit_transform(features)
到此,对原始数据的处理结束,接下来构建神经网络模型。
4. 构建网络模型
我们使用keras建模方法,常用参数如下:
activation:激活函数,一般选relu
kernel_initializer, bias_initializer:权重与偏置参数的 初始化方法,有时候不收敛换个初始化方法就好了
kernel_regularizer, bias_regularizer:权重与偏置的正则化
inputs:输入
units:神经元个数
所有参数设置方法的参考:Module: tf | TensorFlow Core v2.7.0 (google.cn)
(1)网络搭建
首先我们导入 keras序列模型, tf.keras.Sequential(),按顺序一层一层添加网络层。layers代表不同层次的实现。
每个隐层的神经元数量可以随意变化,你可以自己试一试,我们需要预测这里的最高温度,所以输出层只需要一个神经元。权重初始化方法不同,您可以在上面的文档中找到合适的方法。
[En]
The number of neurons in each hidden layer changes at will, you can try it yourself, we need to predict the maximum temperature here, so the output layer only needs one neuron. Weight initialization methods are different, you can find the appropriate one in the above document.
# 构建层次
model = tf.keras.Sequential()
# 隐含层1设置16层,权重初始化方法设置为随机高斯分布,加入正则化惩罚项
model.add(layers.Dense(16,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
# 隐含层2设置32层
model.add(layers.Dense(32,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
# 输出层设置为1,即输出一个预测结果
model.add(layers.Dense(1,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
(2)优化器和损失函数
接下来需要指定 优化器和损失函数 model.compile(),在这里优化器使用梯度下降法,损失函数使用MSE均方误差。大家要根据自己的任务来选择,损失函数的选择对网络的结果影响很大。
# 优化器和损失函数
model.compile(optimizer=tf.keras.optimizers.SGD(0.001),loss='mean_squared_error')
(3)网络训练
制定完成后就可以开始训练了,网络 训练函数 model.fit()。输入特征值input_features,目标值targets,validation_split=0.25指测试集在输入数据中抽取0.25用于测试,epochs指迭代次数100次,每一次迭代128个样本。
# ==3== 网络训练
model.fit(input_features,targets,validation_split=0.25,epochs=100,batch_size=128)
返回训练损失和测试损失,可看到迭代100次后,训练集的损失24.675和测试集的损失29.01相差不大,证明没有出现过拟合现象 。如果出现训练集的损失很小,测试集的损失很大,说明存在过拟合,需要调整参数。
(4)网络模型结构
我们也可以看一下我们构建的网络模型结构, model.summary(),隐含层1有240个参数,它是怎么计算的呢?输入层的shape为[348,14],14个特征;第一个全连接层W的shape为[14,16],16代表隐含层1的特征个数,偏置参数b的shape为[1,16],y=Wx+b。因此参数个数为14*16+16=240。
(5)预测结果
网络模型预测函数model.predict()
# ==5== 预测模型结果
predict = model.predict(input_features)
这里我们对所有样本进行预测,以比较预测结果与实际结果之间的差异。
[En]
Here we predict all the samples to compare the differences between the predicted results and the actual results.
5. 结果展示
简单地画一张散点图来看看,就可以看到预测结果和实际结果大体相同,略有偏差。有兴趣的学生可以进一步进行特征工程,调整参数,取得更好的效果。
[En]
Simply draw a scatter chart to take a look, you can see that the predicted results and the actual results remain roughly the same, there is a slight deviation. Interested students can further carry out feature engineering and adjust parameters to achieve better results.
# 真实值,蓝色实现
fig = plt.figure(figsize=(10,5))
axes = fig.add_subplot(111)
axes.plot(dates,targets,'bo',label='actual')
# 预测值,红色散点
axes.plot(dates,predict,'ro',label='predict')
axes.set_xticks(dates[::50])
axes.set_xticklabels(dates[::50],rotation=45)
plt.legend()
plt.show()
完整代码
# 回归预测温度
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
# 使用keras建模方法
from tensorflow.keras import layers
import warnings
warnings.filterwarnings('ignore')
#(1)数据获取
filepath = 'C:\\..\\temps.csv'
features = pd.read_csv(filepath)
# tenmp2代表前两天的温度,temp1代表前一天的温度,目标值为actual
#(2)数据预处理
# ==1== 处理时间数据,将年月日组合在一起
import datetime
# 获取年月日数据
years = features['year']
months = features['month']
days = features['day']
# 将年月日拼接在一起--字符串类型
dates = []
for year,month,day in zip(years,months,days):
date = str(year)+'-'+str(month)+'-'+str(day)
dates.append(date)
# 转变成datetime格式
times = []
for date in dates:
time = datetime.datetime.strptime(date,'%Y-%m-%d')
times.append(time)
# 看一下前5行
times[:5]
#(3)可视化,对各个特征绘图
# 指定绘图风格
plt.style.use('fivethirtyeight')
# 设置画布,2行2列的画图窗口,第一行画ax1和ax2
fig,((ax1,ax2),(ax3,ax4)) = plt.subplots(2,2,figsize=(20,10))
# ==1== actual特征列
ax1.plot(times,features['actual'])
# 设置x轴y轴标签和title标题
ax1.set_xlabel('');ax1.set_ylabel('Temperature');ax1.set_title('actual temp')
# ==2== 前一天的温度
ax2.plot(times,features['temp_1'])
# 设置x轴y轴标签和title标题
ax2.set_xlabel('');ax2.set_ylabel('Temperature');ax2.set_title('temp_1')
# ==3== 前2天的温度
ax3.plot(times,features['temp_2'])
# 设置x轴y轴标签和title标题
ax3.set_xlabel('Date');ax3.set_ylabel('Temperature');ax3.set_title('temp_2')
# ==4== friend
ax4.plot(times,features['friend'])
# 设置x轴y轴标签和title标题
ax4.set_xlabel('Date');ax4.set_ylabel('Temperature');ax4.set_title('friend')
# 轻量化布局调整绘图
plt.tight_layout(pad=2)
#(4)对字符型数据one-hot编码
# week列是字符串,重新编码,变成数值型
features = pd.get_dummies(features)
#(5)划分特征值和目标值
# 获取目标值y,从Series类型变成数值类型
targets = np.array(features['actual'])
# 获取特征值x,即在原数据中去掉目标值列,默认删除行,需要指定轴axis=1指向列
features = features.drop('actual',axis=1)
# 把features从DateFrame变成数组
features = np.array(features)
#(6)标准化处理
from sklearn import preprocessing
input_features = preprocessing.StandardScaler().fit_transform(features)
#(7)keras构建网络模型
# ==1== 构建层次
model = tf.keras.Sequential()
# 隐含层1设置16层,权重初始化方法设置为随机高斯分布
# 加入正则化惩罚项
model.add(layers.Dense(16,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
model.add(layers.Dense(32,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
model.add(layers.Dense(1,kernel_initializer='random_normal',kernel_regularizer=tf.keras.regularizers.l2(0.01)))
# ==2== 指定优化器
model.compile(optimizer=tf.keras.optimizers.SGD(0.001),loss='mean_squared_error')
# ==3== 网络训练
model.fit(input_features,targets,validation_split=0.25,epochs=100,batch_size=128)
# ==4== 网络模型结构
model.summary()
# ==5== 预测模型结果
predict = model.predict(input_features)
#(7)展示预测结果
# 真实值,蓝色实现
fig = plt.figure(figsize=(10,5))
axes = fig.add_subplot(111)
axes.plot(dates,targets,'bo',label='actual')
# 预测值,红色散点
axes.plot(dates,predict,'ro',label='predict')
axes.set_xticks(dates[::50])
axes.set_xticklabels(dates[::50],rotation=45)
plt.legend()
plt.show()
Original: https://blog.csdn.net/dgvv4/article/details/121561940
Author: 立Sir
Title: 【神经网络】(1) 简单网络,实例:气温预测,附python完整代码和数据集
相关阅读
Title: Numpy报错:ImportError: numpy.core.multiarray failed to import
导入自定义的 python 模块时,出现以下报错:
ImportError: numpy.core.multiarray failed to import
from .cv2 import *
ImportError: numpy.core.multiarray failed to import
原因:
numpy 版本过低或者过高
解决:
- 查看numpy 版本:
pip show numpy
我当前环境中的 numpy 版本是:Version: 1.16.5
- 升级:
pip install -U numpy
(tensorflow) Robin-macbook-pro:~ robin$ pip install -U numpy
Collecting numpy
Downloading https://files.pythonhosted.org/packages/6a/9d/984f87a8d5b28b1d4afc042d8f436a76d6210fb582214f35a0ea1db3be66/numpy-1.19.5-cp36-cp36m-macosx_10_9_x86_64.whl (15.6MB)
|████████████████████████████████| 15.6MB 1.3MB/s
ERROR: tensorflow 1.13.1 has requirement protobuf>=3.6.1, but you'll have protobuf 3.6.0 which is incompatible.
Installing collected packages: numpy
Found existing installation: numpy 1.16.5
Uninstalling numpy-1.16.5:
Successfully uninstalled numpy-1.16.5
Successfully installed numpy-1.19.5
结果还是不行,遂给 numpy 降级: pip install -U numpy==1.14.0
(之前是 1.16.5
)
不仅造成了不少冲突,而且没效果:
(tensorflow) Robin-macbook-pro:~ robin$ pip install -U numpy==1.14.0
Collecting numpy==1.14.0
Downloading https://files.pythonhosted.org/packages/33/c4/1ea5344793c159556110e42c94c9374cb08ce2a2727374cd467bd97f6579/numpy-1.14.0-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl (4.7MB)
|████████████████████████████████| 4.7MB 230kB/s
ERROR: tensorflow 1.13.1 has requirement protobuf>=3.6.1, but you'll have protobuf 3.6.0 which is incompatible.
ERROR: pmdarima 1.3.0 has requirement numpy>=1.16, but you'll have numpy 1.14.0 which is incompatible.
ERROR: phik 0.9.8 has requirement numpy>=1.15.4, but you'll have numpy 1.14.0 which is incompatible.
ERROR: librosa 0.8.0 has requirement numpy>=1.15.0, but you'll have numpy 1.14.0 which is incompatible.
ERROR: astropy 4.0 has requirement numpy>=1.16, but you'll have numpy 1.14.0 which is incompatible.
Installing collected packages: numpy
Found existing installation: numpy 1.19.5
Uninstalling numpy-1.19.5:
Successfully uninstalled numpy-1.19.5
Successfully installed numpy-1.14.0
还是不行:
将numpy更到最新版本: pip install -U numpy
,
同时更新 opencv 的版本试试,这是当前版本:
本身就是最新版本,尝试过没用。
后来发现,问题在于
- ①
import numpy as numpy
会报错:ImportError: numpy.core.multiarray failed to import
- ②
import cv2
会报错:AttributeError: module 'logging' has no attribute 'Handler'
最后发现,最为离奇诡异的是,在不同的文件夹下面执行相同的代码( import numpy as np
)是没有任何问题的
(1)
/Users/robin/software/anaconda3/envs/tensorflow/bin/python3.6 /Users/robin/MLcode/Pycharm_Project/tensorflow/2021/0823_face_recognition_environment/test.py
Process finished with exit code 0
(2)
/Users/robin/software/anaconda3/envs/tensorflow/bin/python3.6 /Users/robin/MLcode/Pycharm_Project/tensorflow/2021/0823_face_recognition_environment/ui/test.py
Traceback (most recent call last):
File "/Users/robin/MLcode/Pycharm_Project/tensorflow/2021/0823_face_recognition_environment/ui/test.py", line 1, in <module>
import numpy as np
File "/Users/robin/software/anaconda3/envs/tensorflow/lib/python3.6/site-packages/numpy/__init__.py", line 187, in <module>
from .testing import Tester
File "/Users/robin/software/anaconda3/envs/tensorflow/lib/python3.6/site-packages/numpy/testing/__init__.py", line 10, in <module>
from unittest import TestCase
File "/Users/robin/software/anaconda3/envs/tensorflow/lib/python3.6/unittest/__init__.py", line 59, in <module>
from .case import (TestCase, FunctionTestCase, SkipTest, skip, skipIf,
File "/Users/robin/software/anaconda3/envs/tensorflow/lib/python3.6/unittest/case.py", line 278, in <module>
class _CapturingHandler(logging.Handler):
AttributeError: module 'logging' has no attribute 'Handler'
Process finished with exit code 1
最后我放弃治疗了,新建了一个文件夹,将文件移动过去了,就当做 Pycharm 抽风了吧
浪费一下午时间...!!!!
Original: https://blog.csdn.net/Robin_Pi/article/details/120544691
Author: Robin_Pi
Title: Numpy报错:ImportError: numpy.core.multiarray failed to import

【自然语言处理工具箱 LTP 】pyltp 使用教程

nodejs目录与文件遍历

八、ResNet的网络结构及其代码实现(花的三分类)

智能驾驶ADAS算法设计及Prescan仿真(1): 前向碰撞预警FCW算法设计与simulink仿真

【python opencv cuda】

OpenCV-Python实战(17)——人脸识别详解

机器学习(七)音频可视化第二篇

realtek没有禁用前面板_为什么HD声卡必须禁用前面板插孔检测前置耳机和麦克才可以有声…

cv2.error: OpenCV(4.5.5) D:…opencvmodulesdnnsrctensorflowtf_importer.cpp:2984: error: (-215

Ubuntu16.04 安装 OPENCV详细教程 避坑

如何使用交叉验证进行模型选择

Tensorflow keras中实现语义分割多分类指标:IOU、MIOU

快速将Keras模型转换成Tensorflow模型

国科大《高级人工智能》期末重点—符号主义部分
