Keras简介
Keras 使用实例
使用MNIST数据集,数据集较小,可以用来做实验的样本。
#定义NN结构
model = Sequential()
model.add(Dense(input_dim=28*28,output_dim=500))
model.add(Activation('sigmoid')
model.add(Dense(output_dim=500))
model.add(Activation('sigmoid')
model.add(Dense(output_dim=10))
model.add(Activation('softmax')
#定义Loss function,定义optimizer(SGD RMSprop Adagrad Adadelta Adam Adamax Nadam)
model.compile(loss='categorical crossentropy',optimizer='adam',metrics=['accuracy'])
#寻找最优的网络参数 (back propagation)
model.fit(x_train,y_train,batch_size=100,nb_epoch=20)
#输出正确率
score=model.evaluate(x_test,y_test)
print('Total loss on Testing Set:',score[0])
print('Accuracy of Testing Set:',score[1])
#或者直接输出预测的数据
result=model.predict(x_test)
操作过程是,首先取出batch_size个样本,实现该样本的最小loss function,这是一个batch。反复做batch优化,直到所有参数都进行了一次优化,称为一个epoch。注意,对于一个batch会更新一次参数。
如果batch_size=1,则变成了SGD。前面已经讲述了SGD由于更新次数多,所以其性能较好。而这里采用BGD,是由于实际操作的一些限制。对于batch size,越大的size代表每一个epoch需要的计算时间越短。而batch size较大时,更新参数较为稳定。这是一个trade-off。
由于GPU的并行能力,则batch-size较大时,与计算SGD的时间差不多。但是不能将batch-size设置过大,这样会导致GPU不能完成并行计算。同时,batch-size过大会导致更新会进入local-minima或者saddle point,而batch-size较小时会带来一些随机性,容易跳出一些不是很深的local-minima的情况。
实际的GPU矩阵运算如下图所示,对于batch中不同的数据,首先将数据进行组合生成一个新矩阵,然后对于矩阵进行操作,得到输出的矩阵,进行分解后就可以完成batch的计算。
更新后的keras部分代码
#定义NN结构
model = Sequential()
model.add(Dense(input_dim=28*28,units=500,activation='relu'))
model.add(Dense(units=500,activation='relu'))
model.add(Dense(units=10,activation='softmax'))
#定义Loss function,定义optimizer(SGD RMSprop Adagrad Adadelta Adam Adamax Nadam)
model.compile(loss='categorical crossentropy',optimizer='adam',metrics=['accuracy'])
#寻找最优的网络参数 输入均为 numpy.array
model.fit(x_train,y_train,batch_size=100,nb_epoch=20)
#输出正确率
score=model.evaluate(x_test,y_test)
print('Total loss on Testing Set:',score[0])
print('Accuracy of Testing Set:',score[1])
#或者直接输出预测的数据
result=model.predict(x_test)