神经网络的keras实现

上一篇文章讲了神经网络的基本原理和其tensorflow的实现,这次说一下其keras的实现方法,keras是构建在tensorflow基础上的python第三方库,专门用于神经网络的构建与计算,同时还集成了scikit-learn库,使得可以在神经网络的构建中运用机器学习的方法。现在就用keras来构建之前构建过的神经网络。

实现代码

首先导入所需要的包:

from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop
from tensorflow.examples.tutorials.mnist import input_data
mnist=input_data.read_data_sets('MNIST_data/',one_hot=True)


其实keras中也包含了mnist数据集,但是使用keras导入需要从网上下载,但是那个网址被墙了,虽然网上也给出了解决方法,但是我一直没搞出来,于是就直接使用tensorflow中的数据集了

导入数据并进行预处理:

train_labels=mnist.train.labels
test_labels=mnist.test.labels
train_images = mnist.train.images.reshape(55000, 784)
test_images = mnist.test.images.reshape(10000, 784)
train_images = train_images.astype('float32')
test_images = test_images.astype('float32')
train_images /= 255
test_images /= 255


最后除以灰度的最大值是为了将数据归一化到0-1的范围,基本上使用梯度下降法学习的数据都要进行归一化。

然后开始构建神经网络:

model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(784,)))
model.add(Dropout(0.2))
model.add(Dense(10, activation='softmax'))
model.summary()


1.首先使用Sequential()定义模型,然后使用add()函数添加层,首先添加输入层,input_shape用于指定输入数据的维度,激活函数使用relu
2.接着使用Dropout()随机舍去20%的节点,舍去节点的目的是为了防止overfitting,原因可以查询这篇论文:《A simple way to prevent neural networks from overfitting》。
3.最后添加输出层,节点为10个,使用softmax函数处理输出。
4.最后,可以看看构建好的网络:
神经网络的keras实现_第1张图片


然后,设置损失函数与优化方法:

model.compile(loss='categorical_crossentropy',optimizer=RMSprop(),metrics=['accuracy'])

因为是multi-label classification,所以使用categorical_crossentropy,如果是binary classification,则使用binary_corssentropy,优化方法可以在之前keras.optimizer中导入,也可以直接输入optimizer='rmsorop',两者个人感觉应该没有区别。

接着就可以开始训练模型了:


history = model.fit(train_images,train_labels,batch_size=100,epochs=20,verbose=2,validation_data=(test_images, test_labels))
score = model.evaluate(test_images, test_labels, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])


1.我们设置batch数据量为100,epoch次数为20次。对于模型的训练,使用不同的batch与epoch,都会得到不同的模型,epoch大了可能会产生过拟合,而小了则会产生欠拟合。
2.validation_data是指用于测试的数据集,使用我们的测试集进行模型的评价,可以看到结果如下:
循环过程:
神经网络的keras实现_第2张图片

最终评价结果:
这里写图片描述

另外,由于keras集成了scikit-learn,我们可以很方便的使用keras进行k-fold cross validataion:

def creatModel():
    model = Sequential()
    model.add(Dense(512, activation='relu', input_shape=(784,)))
    model.add(Dropout(0.2))
    model.add(Dense(10, activation='softmax'))
    model.compile(loss='categorical_crossentropy',optimizer=RMSprop(),metrics=['accuracy'])
    return model

from keras.wrappers.scikit_learn import KerasClassifier
estimator=KerasClassifier(build_fn=creatModel,nb_epoch=20,verbose=2)
from sklearn.model_selection import cross_val_score
cv_scores=cross_val_score(estimator,train_images,train_labels,cv=10)
print (cv_scores.mean())


得到结果如下:
神经网络的keras实现_第3张图片

你可能感兴趣的:(人工智能)