keras分类器模型代码
from keras.datasets import mnist
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import RMSprop
# 加载数据集
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# 数据集reshape, -1表示该参数不指定, 系统通过推断来获得
X_train = X_train.reshape(X_train.shape[0], -1) / 255.0
X_test = X_test.reshape(X_test.shape[0], -1) / 255.0
# 将label变为向量
y_train = np_utils.to_categorical(y_train, 10)
y_test = np_utils.to_categorical(y_test, 10)
# 构建分类器
model = Sequential([
Dense(32, input_dim = 784),
Activation('relu'),
Dense(10),
Activation('softmax')
])
# 选择并定义优化求解方法
rmsprop = RMSprop(lr = 0.001, rho = 0.9, epsilon = 1e-8, decay = 0.0)
# 选择损失函数、求解方法、度量方法
model.compile(optimizer = rmsprop, loss = 'categorical_crossentropy', metrics = ['accuracy'])
# 训练模型
model.fit(X_train, y_train, epochs = 2, batch_size = 32)
# 评估模型
loss, accuracy = model.evaluate(X_test, y_test)
print 'loss: ', loss
print 'accuracy: ', accuracy
结果
由于针对每个batch的准确率/召回率/查准率的计算意义不大,因而在keras2.0后训练过程中这三项metrics被取消了,因而若需要还需自行定义召回率/查准率/的计算函数
由于需要调用keras后台(本人使用的是tensorflow),针对张量进行批量处理,代码中,K为后台(keras.backend),y_true为真实值,y__pred为预测值
import keras.backend as K
from keras import Sequential
from keras.layers import Dense
def getPrecision(y_true, y_pred):
TP = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))#TP
N = (-1)*K.sum(K.round(K.clip(y_true-K.ones_like(y_true), -1, 0)))#N
TN=K.sum(K.round(K.clip((y_true-K.ones_like(y_true))*(y_pred-K.ones_like(y_pred)), 0, 1)))#TN
precision = TP / (TP + FP + K.epsilon())#TT/P
def getRecall(y_true, y_pred):
TP = K.sum(K.round(K.clip(y_true * y_pred, 0, 1)))#TP
P=K.sum(K.round(K.clip(y_true, 0, 1)))
recall = TP / (TP + FN + K.epsilon())#TP/(TP+FN)
在compile时候调用这两个函数
myModel.compile(optimizer="sgd",
loss="categorical_crossentropy",
metrics=["acc",getRecall,getPrecision])
然后训练时候可以用以下main函数检验一下
x=np.array([[0,0],[1,0],[1,1],[0,1]])
y=np.array([[0],[0],[1],[1]])
myModel =Sequential()
myModel.add(Dense(256,activation='sigmoid',input_shape=(2,)))
myModel.add(Dense(128,activation='sigmoid'))
myModel.add(Dense(64,activation='sigmoid'))
myModel.add(Dense(1,activation='sigmoid'))
myModel.compile(optimizer="adam",
loss="binary_crossentropy",
metrics=["acc",getRecall,getPrecision])
myModel.fit(x,y,epochs=300)
preY=myModel.predict(x)
15次迭代下训练结果展示如下:
预测结果为:
可见,模型基本把所有结果都预测为0,因而TP为0,因而recall和precision为0
300次迭代下训练结果展示如下:
预测结果为:
可见,初期欠拟合阶段,recall与precision产生差异,之后随着模型能力增强,recall与precision差异逐渐降低,直至都为1。
然后有的同学可能需要做其他运算,建议稍微学学tensorflow的张量运算,就能自己创造metrics啦~
然后关于伴随metrics的存取问题链接放这呐
目标函数解释
目标函数
1.mean_squared_error
2. mean_absolute_error
3.mean_absolute_percentage_error
4. mean_squared_logarithmic_error
5.squared_hinge
6.hinge
7.binary_crossentropy
8.categorical_crossentropy
参考:
目标函数
目标函数,或称损失函数,是网络中的性能函数,也是编译一个模型必须的两个参数之一。由于损失函数种类众多,下面以keras官网手册的为例。
在官方keras.io里面,有如下资料:
mean_squared_error或mse
mean_absolute_error或mae
mean_absolute_percentage_error或mape
mean_squared_logarithmic_error或msle
squared_hinge
hinge
binary_crossentropy(亦称作对数损失,logloss)
categorical_crossentropy:亦称作多类的对数损失,注意使用该目标函数时,需要将标签转化为形如(nb_samples, nb_classes)的二值序列
sparse_categorical_crossentrop:如上,但接受稀疏标签。注意,使用该函数时仍然需要你的标签与输出值的维度相同,你可能需要在标签数据上增加一个维度:np.expand_dims(y,-1)
kullback_leibler_divergence:从预测值概率分布Q到真值概率分布P的信息增益,用以度量两个分布的差异.
cosine_proximity:即预测值与真实标签的余弦距离平均值的相反数
1.mean_squared_error
顾名思义,意为均方误差,也称标准差,缩写为MSE,可以反映一个数据集的离散程度。
标准误差定义为各测量值误差的平方和的平均值的平方根,故又称为均方误差。
公式:
公式意义: 可以理解为一个从n维空间的一个点到一条直线的距离的函数。(此为在图形上的理解,关键看个人怎么理解了)
2. mean_absolute_error
译为平均绝对误差,缩写MAE。
平均绝对误差是所有单个观测值与算术平均值的偏差的绝对值的平均。
公式:
(是预测值,是实际值,绝对误差)
3.mean_absolute_percentage_error
译为平均绝对百分比误差 ,缩写MAPE。
公式:
(表示实际值,表示预测值)
4. mean_squared_logarithmic_error
译为均方对数误差,缩写MSLE。
公式:
(n是整个数据集的观测值,为预测值,为真实值)
5.squared_hinge
公式为max(0,1-y_true*y_pred)^2.mean(axis=-1),取1减去预测值与实际值的乘积的结果与0比相对大的值的平方的累加均值。
6.hinge
公式为为max(0,1-y_true*y_pred).mean(axis=-1),取1减去预测值与实际值的乘积的结果与0比相对大的值的累加均值。
Hinge Loss 最常用在 SVM 中的最大化间隔分类中,
对可能的输出 t = ±1 和分类器分数 y,预测值 y 的 hinge loss 定义如下:
L(y) = max(0,1-t*y)
y = w*x+b
可以看出当 t 和 y 有相同的符号时(意味着 y 预测出正确的分类)
|y|>=1
此时的 hinge loss
L(y) = 0
但是如果它们的符号相反
L(y)则会根据 y 线性增加 one-sided error。(译自wiki)
7.binary_crossentropy
即对数损失函数,log loss,与sigmoid相对应的损失函数。
公式:L(Y,P(Y|X)) = -logP(Y|X)
该函数主要用来做极大似然估计的,这样做会方便计算。因为极大似然估计用来求导会非常的麻烦,一般是求对数然后求导再求极值点。
损失函数一般是每条数据的损失之和,恰好取了对数,就可以把每个损失相加起来。负号的意思是极大似然估计对应最小损失。
8.categorical_crossentropy
多分类的对数损失函数,与softmax分类器相对应的损失函数,理同上。
tip:此损失函数与上一类同属对数损失函数,sigmoid和softmax的区别主要是,sigmoid用于二分类,softmax用于多分类。
一种解释:
softmax公式:
logistic regression的目标函数是根据最大似然来做的.也就是假设x属于类y,预测出概率为oy,那么需要最大化oy.
softmax_loss的计算包含2步:
(1)计算softmax归一化概率
论文涉及机器学习建模解决方案