一、为什么想写优快云?
最近在学习Python和深度学习有关知识,学习的内容较多,较难消化。需要对其整理,形成一个知识体系;另外做份笔记方便以后复习查看。
二、深度学习基础
本文的内容是基于《TensorFlow深度学习与入门与实践》,作者是日月光华老师。
1.代码的运行框架
(1)软件
- miniconda3
Miniconda3-py37_4.8.2-Windows-x86_64.exe - VS C++
VC_redist.x64.exe
(2)安装包
需要安装的包有:tensorflow-cpu==2.3.0(注:我的电脑主机显卡是AMD,所以就安装了cpu版本,没有选择GPU版本)、numpy 、pandas 、 matplotlib 、 sklearn、 notebook 。在Anaconda Prompt(miniconda3)中,使用pip方法安装,具体格式为:
pip install 【包名】 -i https://pypi.douban.com/simple/
// 下面举两个例子:
pip install tensorflow-cpu==2.3.0 -i https://pypi.douban.com/simple/
pip install notenook -i https://pypi.douban.com/simple/
然后在Anaconda Prompt(miniconda3)中,输入ipython notebook(jupyter notebook),进入网络页面的notebook,新建python文件,就可以编写python代码啦。
2.深度学习基础
一般有回归问题和分类问题。
(1)基础知识
-
单变量线性回归方法
连续线性回归预测的是 一个连续值。
例如:要估计“教育程度"和“收入”之间的关系,已知一组数据(一个教育年限对应一个收入),现在告诉一个新的教育年限,让预测收入是多少? 我们根据已知数据,可以做出一个散点图,目标就是要找到一个函数(线性函数)能表示这组数据的趋势:
f(x) =ax+b
该方程的未知数系数有斜率a和截距b,然后需要我们解出模型,即,求出系数 a,b。
怎么找呢?解决方法是引入一个损失函数(均方差):
L =[y-f(x)]²/n
不同的a,b,损失函数有不同的值。我们需要找到合适的a,b,使得均方差最小,即损失函数越小,说明预测值和真实值之间的误差最小。这时,a,b就是模型的最优解。 -
逻辑回归
属于分类问题,通常也叫二分类问题,结果为“是”或“否”的回答。
sigmoid 函数是一个概率分布函数,给定某个输入,它将输出为一个概率值。
对于分类问题,损失函数 使用 “交叉熵损失函数” 会更有效!
——交叉熵会输出一个更大的‘损失’。
-
多层感知器(多分类问题)
属于多分类问题,即结果有多种可能。对于多个选项的问题,我们可以使用softmax 函数, 它是对数几率回归在N个可能不同的值上的推广。
softmax函数可以将输出变成概率分布。
softmax 的样本分量之和为1,当只有两个类别时,与对数几率回归完全相同(即2分类)。
多分类中 使用 categorical_crossentropy (one-hot 编码) / sparse_categorical_crossentropy 来计算交叉熵。
(2)代码实现
- 单变量线性回归方法
import matplotlib.pyplot as plt
pandas.read_csv()
%matplotlib inline # jupyter 自带的魔术方法
# %matplotlib incline 有错
plt.scatter(data.Education,data.Income) # 教育和收入的散点图
x = data.Education # 数据准备
y = data.Income
# 模型构建——顺序模型
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(1,input_shape=(1,))) # dense 全连接层 , 1是输出参数,表示一个输出;
model.compile( optimizer = 'adam', # 训练使用的方法参数,优化方法adam
loss = 'mse' # 损失函数 选择均方差
)
history = model.fit(x,y,epochs=10000) # 训练执行
model.predict(x) # 预测x
model.predict(pd.Series(20)) # 预测指定教育年限
- 逻辑回归
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
data = pd.read_csv('.\dataset\credit-a.csv',header = None)
data.head() # 显示第一行。
x = data.iloc[:, :-1]
y = data.iloc[:, -1].replace(-1,0) # 将 y中的-1 换成 0
# 模型开始构建
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(4,input_shape=(15,),activation = 'relu'))
model.add(tf.keras.layers.Dense(4,activation = 'relu'))
model.add(tf.keras.layers.Dense(1,activation = 'sigmoid'))
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['acc']
)
history = model.fit(x,y,epochs=100)
plt.plot(history.epoch, history.history.get('loss')) # 绘图,随着次数的增加,loss的变化情况
plt.plot(history.epoch, history.history.get('acc'))
- 多层感知器
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
(train_image,train_label),(test_image,test_label) = tf.keras.datasets.fashion_mnist.load_data() # 加载Fishion MINIST 数据集
train_image = train_image/255 # 归一化,方便不同数据的比较。
test_image = test_image/255
model = tf.keras.Sequential()
model.add(tf.keras.layers.Flatten(input_shape = (28,28))) # 28*28 # flatten 层
model.add(tf.keras.layers.Dense(128,activation = 'relu'))
model.add(tf.keras.layers.Dense(10,activation = 'softmax'))
model.compile(optimizer='adam',
loss = 'sparse_categorical_crossentropy', # 顺序编码 使用sparse_categorical_crossentropy
metrics=['acc']
)
model.fit(train_image,train_label,epochs=5 )
model.evaluate(test_image,test_label) # 使用测试数据集验证。
结语
还有深度学习的一些基本概念,如梯度下降、独热编码、优化函数、学习速率、反向传播,网络优化 与 超参数选择等等,可以留在下期。