前言
学习深度学习也有小半年了,因为平时还要上课,学习速度比较慢。目前三大框架——tensorflow、keras、pytorch 的基础内容都学了一遍。但不时回想前面的学习内容时,或多或少都有一些遗忘,因此在这里记录、回顾一下自己在学习这三个框架中写过的代码。
先来说说我眼中的神经网络。神经网络是利用输入层输入数据去经过n个包含m个节点的隐藏层,其中层与层之间每个神经元之间的链接上都有一个权值,从而去进行一些线性、非线性运算。最后得到输出数据来模拟人脑的思考、脑中神经元信息的传递。因此可以用神经网络来做很多分类、回归、重构的工作。
普通神经网络
共享单车项目
这是我学习深度学习后接触的第一个项目,其中只用到的简单的全链接网络。
项目目标
根据已有的一些数据来训练一个能够预测共享单车未来一段时间被使用的情况的网络。
数据
数据是excel文件,里面存有信息每一行包括:日期(季节、年月日、时刻)、天气、是否为节假日、温度、风速、使用人数。
思路
取其中一批数据作为训练数据、一批作为验证数据、另一批作为测试数据。训练时:用features作为输入,targets作为输出进行训练。用训练数据训练得到的参数去用验证集验证和用测试集测试(验证和测试时,只输入features,观察得到的targets与真实数据中的targets是否相近)。
选取季节、年月日、时刻、星期几、天气类型、温度、风速作为features(为了简化没有考虑节假日的情况)。未注册的使用人数、注册的使用人数、总使用人数作为targets。
数据处理
哑变量处理。其中因为年月日、温度、星期几、时刻,它们的数值并不能代表程度(如:温度高低,风速大小),因此需要把它们当作哑变量进行处理,防止它们数值的差异对结果造成影响。
量纲处理。另外像温度、风速、使用人数之间数据的大小差异大(如:t1时刻风速60,t2时刻风速4,相差56;而t1时刻温度21,t2时刻温度18,只相差了3),因此需要对这类型的数据进行一个归一化,统一到一定的范围。
网络结构
一个输入层、一个隐藏层(隐藏层输出后经过一个sigmoid函数)、一个输出层。
代码
作为第一个神经网络代码,没有用到任何框架,前项运算、反向传播、激活函数等都没有用api写,这样更能了解神经网络的底层逻辑。(注重看网络的训练代码)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os
data_path = r'hour.csv'
rides = pd.read_csv(data_path)
'''一.预处理
生成哑变量'''
dummy_fileds = ['season','mnth','hr','weekday','weathersit']
for each in dummy_fileds:
dummies = pd.get_dummies(rides[each],prefix = each)
rides = pd.concat([rides,dummies],axis = 1)
print(rides.shape)
'''去除多余参数'''
fileds_drop = ['instant','season','mnth','hr','weekday','weathersit',
'dteday','atemp','workingday']
data = rides.drop(fileds_drop,axis = 1)
'''量纲归一化'''
quant_features = ['temp','hum','cnt','windspeed','casual','registered']
scaled_features = {
}
#????????????????????为什么变成[]就不对了
for each in quant_features:
mean,std = data[each].mean(),data[each].std()
scaled_features[each] = [mean,std]
data.loc[:,each] = (data[each] - mean)/std
'''二.训练数据集'''
test_date = data[-21*24:]
data = data[:-21*24]
target_fileds = ['cnt','casual','registered']
test_features,test_targets = test_date.drop(target_fileds,axis = 1),test_date[target_fileds]
features,targets = data.drop(target_fileds,axis = 1),data[target_fileds]
train_features,train_targets = features[:60*24],targets[:60*24]
val_features,val_targets = features[60*24:],targets[60*24:]
'''超参数'''
iterations = 6000