本文简述keras用于神经网络搭建分类模型的简单案例。
对于简单的分类模型的实现,大体的思想其实不难理解。分类任务属于有监督学习,通常会处理数据部分和标签部分,然后将数据和对应的标签装入模型进行训练即可,也就是:
(1)通过一些数据处理方法处理好模型所需要的数据
(2)划分数据集(训练集和测试集),可采用7:3的比例进行划分
(3)明确分类的类别,构建神经网络模型
(4)将数据集装入模型进行训练优化
(5)保存训练的模型
下面就做一个简单的二分类任务:(就按照上面的过程来)
(1,2)处理数据划分数据集
def Data():
x = [];y = []
x_ = [];y_ = []
for i in range(140):
digit = np.random.uniform()
x.append(digit)
if digit < 0.5:
y.append([0])
else:
y.append([1])
for i in range(60):
digit = np.random.uniform()
x_.append(digit)
if digit < 0.5:
y_.append([0])
else:
y_.append([1])
return np.array(x).reshape(140,1),np.eye(2)[np.array(y)].reshape(140,2),np.array(x_).reshape(60,1),np.eye(2)[np.array(y_)].reshape(60,2)
x,y,x_,y_ = Data()
用numpy生成(0,1)之间的小数,<0.5的部分设为类别“一”,其他的部分设为类别“二”。为了能将标签装入模型训练,需要将标签转为one_hot向量。one_hot向量只有一个“1”,即为所属标签的位置为“1”,其余的部分全为“0”。
对于这个二分类,假设第一个数据的标签为“0”,则标签的one_hot向量表示为[1,0]。若标签为“1”,则为[0,1],高维情况抑如此。
我习惯使用numpy的eye函数,np.eye(num)[label],num为分类的数量,这里是二分类所以为2,label为数据的标签。
Data()函数最后返回训练集和测试集,分别有140,60个数据(已经划分好数据集)。
注:
数据集的划分可使用sklearn的train_test_split函数划分,使用方法如下:
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.3)
x,y为数据和对应的标签,test_size为测试集的大小,可自定义
(3)明确类别,搭建神经网络
对于分类任务,一般性的使用“softmax”作为最后一层的激活函数,但是鉴于这次任务是一个二分类,我使用了“sigmoid”代替。
观察“sigmoid”的函数图像:
可以看到在x轴尺度扩大的情况下,该函数近似于一个将输入映射到 0 or 1的二分类映射,在二分类任务中可以直接的使用。
这个模型很简单,只有三层,两层包含64个神经元并采用“relu”作为激活函数的全连接层,以及第三层用于分类的全连接层。然后编译模型,使用“adam”优化器,损失函数使用均方差,评估标准为准确率。
def Model():
model = Sequential()
model.add(layers.Dense(64,"relu"))
model.add(layers.Dense(64,"relu"))
model.add(layers.Dense(2,"sigmoid"))
model.compile("adam","mse",metrics=["acc"])
return model
(4)装入数据进行训练
model.fit(x,y,epochs=50,validation_data=(x_,y_))
这里简单的使用了fit()函数,定义了五十轮训练,x,y为装入的数据,validation_data用于测试集的输入。
(5)保存训练的模型
model.save("M.h5")
这个简单的模型就到此为止了,附上代码部分:
import numpy as np
from tensorflow.keras import layers,Sequential
def Data():
x = [];y = []
x_ = [];y_ = []
for i in range(140):
digit = np.random.uniform()
x.append(digit)
if digit < 0.5:
y.append([0])
else:
y.append([1])
for i in range(60):
digit = np.random.uniform()
x_.append(digit)
if digit < 0.5:
y_.append([0])
else:
y_.append([1])
return np.array(x).reshape(140,1),np.eye(2)[np.array(y)].reshape(140,2),np.array(x_).reshape(60,1),np.eye(2)[np.array(y_)].reshape(60,2)
x,y,x_,y_ = Data()
def Model():
model = Sequential()
model.add(layers.Dense(64,"relu"))
model.add(layers.Dense(64,"relu"))
model.add(layers.Dense(2,"sigmoid"))
model.compile("adam","mse",metrics=["acc"])
return model
model = Model()
model.fit(x,y,epochs=50,validation_data=(x_,y_))
model.save("M.h5")
同样是Eason的歌,沙龙,每张都罕有的勒
留住温度,速度,温柔和愤怒 ——— 沙龙