先罗列一下编译环境以及教程来源:
- 编译程序: VScode
- python版本:3.6.6
- Anaconda版本:Anaconda3-2019-10
- tensorflow版本:2.0.0
- pandas版本:0.25.1
逻辑回归与线性回归
归输出的值是简单的是与否,使用sigmoid激活函数将输出的结果映射到0-1之间,输出一个概率值。
逻辑回归的损失函数,平方差损失函数惩罚的是损失为同一数量级的情况,对于分类问题,他输出的值会很小,速度会非常慢。我们使用交叉熵损失函数,输出更大损失函数的值
交叉熵损失函数刻画的是实际输出概率与期望输出概率之间的距离,值越小概率越接近。
公式:
p为期望输出,q为实际输出
h
(
p
,
q
)
=
−
∑
x
p
(
x
)
log
q
(
x
)
h(p,q)=-\sum_{x}^{}p(x)\log{q(x)}
h(p,q)=−x∑p(x)logq(x)
上述函数会放大损失,方便训练
以下是一个例子:
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/credit-a.csv',header=None)
print(data.head())
x = data.iloc[:,:-1]
y = data.iloc[:,-1].replace(-1,0)
model = tf.keras.Sequential([
tf.keras.layers.Dense(4,input_shape=(15,),activation='relu'),
tf.keras.layers.Dense(4,activation='relu'),
tf.keras.layers.Dense(1,activation='sigmoid')
])
# #
check_path="./tensorflow-model/lessonThree/ch-1.ckpt"
dir_path = os.path.dirname(check_path)
callback = tf.keras.callbacks.ModelCheckpoint(check_path,save_weights_only=True,verbose=1,period=200)#
#第一个参数自动保存的路径,第二个是保存权重还是模型,第三个参数表示是否显示提示,第四个指步长
print(model.summary())
model.compile(optimizer='adam',loss='binary_crossentropy',metrics=["acc"])
history = model.fit(x,y,epochs=2000,callbacks=[callback])
#训练过程中的记录
model.save("./tensorflow-model/lessonThree/modal.h5")
#保存模型
model.save_weights("./tensorflow-model/lessonThree/modal_weight")
plt.plot(history.epoch,history.history.get("acc"))
plt.show()
#建立新的模型用load_weights,载入权重
结果如下图:
softmax分类
softmax要求每一个样本必须属于某一个类别,而且可能的样本均被覆盖。
公式如下:
θ
(
z
)
j
=
e
j
z
∑
k
=
1
K
e
k
z
,
f
o
r
j
=
1
,
2
,
3.....
,
K
\theta(z)_j=\frac{e^z_j}{\sum_{k=1}^Ke^z_k} ,for j=1,2,3.....,K
θ(z)j=∑k=1Kekzejz,forj=1,2,3.....,K
softmax各样本分量和为1,只有两个类别时,与上文相同。
而在tf.keras中我们可以使用:
categorical_crossentropy#
sparse_categorical_crossentropy#数字编码
来计算交叉熵
以下是fashion mnist数据集的训练模型代码:
import tensorflow as tf
import pandas as pd
import matplotlib.pyplot as plt
import os
print("Tensorflow version: {}".format(tf.version))
(train_image,train_label),(test_image,test_label) = tf.keras.datasets.fashion_mnist.load_data()#网络下载
print("train_image :" + str(train_image.shape))
#建立新的模型用load_weights,载入权重
#归一化
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的向量
model.add(tf.keras.layers.Dense(128,activation='relu'))
#过大会导致过拟合,太小会丢失特征
model.add(tf.keras.layers.Dense(10,activation='softmax'))
#计算映射到概率
model.compile(
optimize='adam',
loss='sparse_categorical_crossentropy',
metrics=['acc']
)
#check_path="./tensorflow-model/lessonThree/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)
#第一个参数自动保存的路径,第二个是保存权重还是模型,第三个参数表示是否显示提示,第四个指步长
model.fit(train_image,train_label,epochs=10)
#model.save("./tensorflow-model/lessonThree/modal.h5")
#保存模型
#model.save_weights("./tensorflow-model/lessonThree/modal_weight")
#建立新的模型用load_weights,载入权重
model.evaluate(test_image,test_label)
#评估模型