先罗列一下编译环境以及教程来源:
- 编译程序: VScode
- python版本:3.6.6
- Anaconda版本:Anaconda3-2019-10
- tensorflow版本:2.0.0
- pandas版本:0.25.1
简单的线性模型
以上是简单的单层线性拟合模型。
代码以及注释如下:
import tensorflow as tf import pandas as pdimport matplotlib.pyplot as plt
print("Tensorflow version: {}".format(tf.version))
data = pd.read_csv('./tensorflow-data/Income1.csv')
x = data.Education
y = data.Incomemodel = tf.keras.Sequential()#顺序模型
model.add(tf.keras.layers.Dense(1,input_shape=(1,)))#建立模拟函数,参数:输入数据的维度与输出数据的维度
model.compile(optimizer='adam',loss='mse')#优化方法计算梯度贴近真实值,损失函数均方差
print(model.summary())
#返回模型的形状
print(model)
#history = model.fit(x,y,epochs=5000)#多次训练拟合模型
#plt.scatter(data.Education,data.Income)
plt.show()
梯度下降算法
致力于寻找函数极值点的算法,随机选取一点,计算梯度,根据设置好的步长向梯度变化最大的方向(增大或减少)移动,多次重复找到极值点。同时在tf的计算中,程序会自己选取多个随机起始点,以避免出现局部极值点的问题。
梯度下降的过程就是拟合真实函数的过程,是减少损失函数计算出的值的过程,也就是学习的过程。
梯度的输出是一个由若干导数构成的向量,它的每一个分量都对应函数对输入向量相应方向上的偏导。
多层感知器
单层神经元存在无法拟合异或运算的缺陷,也可以说单层神经元一般只能拟合线性可分的数据的模型。
激活函数负责规定输出,最简单的线性激活:大于或者小于阈值输出到下一神经元,反之则不进行输出。
-
relu函数小于阈值不进行输出,大于则进行输出
-
sigmoid激活把上一层的输出映射到0-1内,公式如下:
p ( X ) = 1 1 + e ( x ) p(X) = \frac {1} {1+e^{(x)}} p(X)=1+e(x)1
-
tanh激活做tanh运算
-
Leak relu激活部分小于阈值的值会被映射,不会被清零
多层感知器代码实现:
import tensorflow as tf
import pandas as pd
import matplotlib.pyplot as plt
print("Tensorflow version: {}".format(tf.version))
data = pd.read_csv('./tensorflow-data/Advertising.csv')
print(data.head())
x = data.iloc[:,1:-1]
y = data.iloc[:,-1]
model = tf.keras.Sequential([tf.keras.layers.Dense(10,input_shape=(3,),activation='relu'), tf.keras.layers.Dense(1)])
print(model.summary())
# plt.scatter(data.radio,data.sales)
plt.show()
结构如下:
中间层十个隐藏单元,40个由封装好的函数创建的参数,因为本次数据有三个特征量,每一个特征量需要一个权重,一组特征量需要一个偏移量。因此一个隐藏单元存在4个参数,得到一共40参数。
第二层十个单元输出的到的特征量需要十个权重,在加一个偏移量,得到11个参数。
代码如下:
import tensorflow as tf
import pandas as pd
import matplotlib.pyplot as plt
import os
print("Tensorflow version: {}".format(tf.version))
data = pd.read_csv('./tensorflow-data/Advertising.csv')
print(data.head())
x = data.iloc[:,1:-1]
y = data.iloc[:,-1]
model = tf.keras.Sequential([tf.keras.layers.Dense(10,input_shape=(3,),activation='relu'), tf.keras.layers.Dense(1)])
#
check_path="./tensorflow-model/lessonTwo/ch-1.ckpt"
dir_path = os.path.dirname(check_path)
callback = tf.keras.callbacks.ModelCheckpoint(check_path,save_weights_only=True,verbose=1,period=10)
#第一个参数自动保存的路径,第二个是保存权重还是模型,第三个参数表示是否显示提示,第四个指步长
print(model.summary())
model.compile(optimizer='adam',loss='mse')
history = model.fit(x,y,epochs=2000,callbacks=[callback])
model.save("./tensorflow-model/lessonTwo/modal.h5")#保存模型model.save_weights("./tensorflow-model/lessonTwo/modal_weight")
#建立新的模型用load_weights,载入权重