11/22 坐标:南京 天气:晴
玄学调参,一脸懵逼。
今天的炼的丹---十分类小还丹。它大概长这样。
![cdbf86c44eb84d7bcc48faef60a04e10.png](https://i-blog.csdnimg.cn/blog_migrate/ac45987b15edd47f696942d029367314.jpeg)
总共是个类,训练集6W,测试集1w
(我举得这个数据集是真的好用,多且整齐)
磨拳擦掌,卷袖开干。
首先,搭建一个三层的DNN,像这样。
def dnn_model():
num_input=784
num_outout=10
batch_size=32
learning_rate=0.1
max_epoch=50
params = HyperParameters_4_2(
learning_rate, max_epoch, batch_size,
net_type=NetType.MultipleClassifier,
init_method=InitialMethod.Xavier,
optimizer_name=OptimizerName.SGD,
)
net=NeuralNet_4_2(params,'dnn_model')
f1=FcLayer_2_0(num_input,128,params)
net.add_layer(f1,'f1')
s1=ActivationLayer(Sigmoid())
net.add_layer(s1,'s1')
f2=FcLayer_2_0(f1.output_size,64,params)
net.add_layer(f2,'f2')
s2=ActivationLayer(Sigmoid())
net.add_layer(s2,'s2')
f3=FcLayer_2_0(f2.output_size,num_outout,params)
net.add_layer(f3,'f3')
c1=ClassificationLayer(Softmax())
net.add_layer(c1,'c1')
return net
得到的结果像这样:
![f315dbc9d5145d7f4878892ca8bad101.png](https://i-blog.csdnimg.cn/blog_migrate/cb6db5c2627e44ba44a48fca9a3d42d4.png)
训练集大概88%,模型好像过拟合了。
但是不因该啊????
模型过拟合,不因该是模型过于复杂才导致过拟合吗??
就我这个模型,参数加起来还没有2M就过拟合了?????
但是,这个图像,emmmmmmm
![61643382bf47f43fae0d1b234ea0c527.png](https://i-blog.csdnimg.cn/blog_migrate/0253672050443f2262b2f596389d62ac.jpeg)
没办法,尝试一下,解决过拟合的办法。
第一,扩充数据集,不用了,这么优秀的数据集,不需要我扩充
第二,加正则化项,DropOut层
那就加正则项吧
填加一个L2正则项,β=0.1,得到的结果是这样的
![013cd312e4abdb3a55dc1e66b9d29112.png](https://i-blog.csdnimg.cn/blog_migrate/fe4c4b9f565ab7189a67dd085c860fc2.jpeg)
β=0.2,得到的结果是这样的
![23bea84cd25e09a6080f1e88bf2f5880.png](https://i-blog.csdnimg.cn/blog_migrate/79015e378d8777da0c5ade1d438ac5ea.png)
凸(艹皿艹 )
![c93462e098b3f1d548b89c8302170e5a.png](https://i-blog.csdnimg.cn/blog_migrate/12ba65ca94b8c0fcdebf717e4f350a11.jpeg)
训练集的准确率是下来了,但是测试集的准确率也没上去啊。而且β越大效果越差。
原理大概是这样
![ff39666fe10433ed1f163e87d8c56f3b.png](https://i-blog.csdnimg.cn/blog_migrate/077543ab85ad3b9f915a5526820d104d.jpeg)
β越大,偏离最优解越远。
正则化,pass
试一下DropOut,ratio=0.2,得到的结果是这样的
![8f985800c8f4f52416c18fc6380cb098.png](https://i-blog.csdnimg.cn/blog_migrate/f196f41072defce325dda1c02c670c24.png)
感觉和没用之前差不多,我试一下把ratio再调大一点
ratio=0.4,epoch加到200
![a2ee190ecbe0c477a6847b9ccec4f939.png](https://i-blog.csdnimg.cn/blog_migrate/7dc5d676eabf8c661f5ad1ffa924f9f9.jpeg)
把不加dropout模型跑200epoch
![1fd52dcce8d03ba9034cefff6b2a2880.png](https://i-blog.csdnimg.cn/blog_migrate/615ff51d827d773ccbfe2e7b01fd2a60.jpeg)
(吓死我了,不是欠拟合。)
有一点点用
![1460f7320844534f58c4bb2387801768.png](https://i-blog.csdnimg.cn/blog_migrate/0e006773985c92e0bc7a5e140b002049.png)
L2,β=0.2 加dropout,ratio=0.2
![cc260fa601e28435d5cdbd4786b58aa9.png](https://i-blog.csdnimg.cn/blog_migrate/53e389f8ed32b15696e5b222c037d5e8.jpeg)
![1082eb427059809fcbeff35e6b68bdc3.png](https://i-blog.csdnimg.cn/blog_migrate/2c0bc900cf7356e0983215a224c81787.jpeg)
我怀疑可能是模型有问题,换一个CNN试试???
def cnn_model():
batch_size = 32
learning_rate = 0.01
max_epoch = 10
params = HyperParameters_4_2(
learning_rate, max_epoch, batch_size,
net_type=NetType.MultipleClassifier,
init_method=InitialMethod.MSRA,
optimizer_name=OptimizerName.SGD
)
net=NeuralNet_4_2(params,'conv_test')
c1=ConLayer((1,28,28),(32,3,3),(1,0),params)
net.add_layer(c1,'c1')
r1=ActivationLayer(Relu())
net.add_layer(r1,'r1')
p1=PoolingLayer(c1.output_shape,(2,2),2,PoolingTypes.Max)
net.add_layer(p1,'p1')
f2=FcLayer_2_0(p1.output_size,128,params)
net.add_layer(f2,'f2')
bn2=BnLayer(f2.output_size)
net.add_layer(bn2,'bn2')
r2=ActivationLayer(Relu())
net.add_layer(r2,'r2')
f3=FcLayer_2_0(f2.output_size,10,params)
net.add_layer(f3,'f3')
s4=ClassificationLayer(Softmax())
net.add_layer(s4,'s4')
return net
注:ConLayer((InputChannelCount, H, W),(OutputChannelCount, FH, FW),(stride, padding),hp) 参数意思是图片输入通道,长,宽;输出通道,卷积核长与宽;步长和padding
PoolingLayer((input_c,input_h,input_w),(pool_h,pool_w),stride,pooling_type) 参数意思是上层输入通道,输入长,宽;池化长,宽;步长,池化类型。
但是感觉跑了一万年,epoch=10
![5af6f4881b0aa1c6987ba7144678c44d.png](https://i-blog.csdnimg.cn/blog_migrate/b047b0702bd337ff873a1eeb1a98bafe.png)
虽然,CNN比较专业,但是我想知道DNN那个是怎么回事。
CNN牛逼