神经网络的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.最后,可以看看构建好的网络: 

è¿éåå¾çæè¿°

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

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集成了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())

得到结果如下: 

è¿éåå¾çæè¿°

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值