model.evaluate():返回一个二维向量,一个是训练集的total loss,一个是测试集的accurary
# case1: 测试集正确率 score = model.evaluate(x_test,y_test) print("Total loss on Testing Set:",Score[0]) ## 总损失值 print("Accuracy of Testing Set:",score[1]) ## 正确率 # case2: 模型预测 result = model.predict(x_test) 第十一章 Keras - 手写数字识别(1) import numpy as np from keras.models import Sequential from keras.layers.core import Dense,Dropout,Activation from keras.optimizers import SGD,Adam from keras.utils import np_utils from keras.datasets import mnist def load_data(): (x_train,y_train),(x_test,y_test)=mnist.load_data() ##导入数据 number=10000 x_train=x_train[0:number] # 只训练10000数据 y_train=y_train[0:number] x_train=x_train.reshape(number,28*28) # 重塑 x_test=x_test.reshape(x_test.shape[0],28*28) x_train=x_train.astype(\'float32\') x_test=x_test.astype(\'float32\') y_train=np_utils.to_categorical(y_train,10) ## 标签one-hot编码 y_test=np_utils.to_categorical(y_test,10) x_train=x_train x_test=x_test x_train=x_train/255 ## 归一化 x_test=x_test/255 return (x_train,y_train),(x_test,y_test) (x_train,y_train),(x_test,y_test)=load_data() model=Sequential() model.add(Dense(input_dim=28*28,units=633,activation=\'sigmoid\')) model.add(Dense(units=633,activation=\'sigmoid\')) model.add(Dense(units=633,activation=\'sigmoid\')) model.add(Dense(units=10,activation=\'softmax\')) model.compile(loss=\'mse\',optimizer=SGD(lr=0.1),metrics=[\'accuracy\']) model.fit(x_train,y_train,batch_size=100,epochs=20) result= model.evaluate(x_test,y_test) print(\'TEST ACC:\',result[1])调参:中间层神经元个数,深度 - 就算如此,深度学习的实践还是需要基于理论基础而非调参。
深度学习并非越深越好,隐层Neture调整对整体效果也不一定有益
第十二章 深度学习技巧
Tips1 针对神经网络的表现:
如果在训练集上表现不好,那么就需要去调整网络;如果在测试集上性能不好,才是过度拟合;如果在测试集上表现很好,就说明成功了。
在机器学习中往往训练集集合是很好的,但是在深度学习中并非这样,我们首先就需要查看训练集上的结果 - 因为深度学习的模型是不可解释性的,最初模型往往没有机器学习模型好。
eg. dropout方式是用来防止过拟合的,即训练集数据表现好,测试及数据表现不好的时候使用,而非任何时候都可以添加。
Tips2 针对新的激活函数:
如果训练集上效果不好,有可能是因为你的激活函数或者自适应学习率算法设计的不够好(New activation function & Adaptive Learning Rate)。如果在测试集上效果不好,此时再去设计一些如减少迭代次数,正则化,Dropout等方法(Early Stopping, Regularization, Dropout)
不同激活函数的设计带来的其中一个问题就是当网络比较深的时候会出现梯度消失:Vanishing Gradient Problem
比较靠近输入的几层梯度非常小,靠近输出的梯度非常大,当前几层参数都还没更新多少的时候,后几层参数就已经收敛了 - 使用sigmoid激活函数时会产生
原因是我们对一个参数w做total loss偏微分,实际上就是在该方向上做个小小的变化,对loss的影响就是梯度大小。