CNN神经网络

1 CNN主要用于计算机视觉方面,也就是图像处理。之前的神经网络在这些方面也表现不错,为啥还要出现CNN?传统的神经网络采用的的输入层、隐藏层、输出层也基本是是用的全连接,这样就造成参数太多,训练时间长,结果就就造成经济上的不划算,为了追求更高的利益,就有人想用更短的时间得到相同的效果。

2 可是为啥CNN就能解决上面的参数过多的问题呢?我想举个成语来说明这个问题,有个成语叫做“一叶知秋”,也就通过一片树叶就能知道是秋天。或许这个也不太形象。在我们生活中,我们想要辨别一个人是是谁,我们不需要看到这个人的整体,我们就看到这个人的脸,我们就能判断这个人是谁。这个在CNN中就叫做局部感知。可是我们人能判断一个人是谁,那是因为我们记住了这个人的脸部特征,那么机器怎么判断呢?机器就要学习到这个脸部特征,这个特征如何学到呢?就是通过卷积核学到的。但是同一个人在照片的不同位置还是这个人,那么我们想想,如果我们要表示这个人,那么这个人的卷积核的参数应该是一样的吧。猜测是这样,事实就是这样的。利用这个特性,CNN采用了权重共享的方式,也得以往的神网络的参数大幅度减少,在时间上有有了较大的飞跃,

从第2条的举例中,我们可以得出CNN的几大特征: 1 具有通过图形的局部就能判断该图形是啥 2 对于同一东西,可以用同一个卷积核表示,也就不在乎该东西在图形的哪个位置 3 权重共享使得参数大幅度的降低

3 CNN的组成 1 卷积层(主要是卷积核)抽取特征 2 池化层(取个名字叫池化核,但是操作可跟卷积核不一样)保留住主要的特征,丢弃次要的特征,也就利用局部感知的特点 3 激活层 就是为了保证数据不给程序造成溢出(只是一个优点),还有为了方便程序的出处理,

4 会遇到的问题

1 卷积核是怎么得到的呢? 其实问题也很简单,也困惑了我很久。卷积核是通过学习得到的。如何初始化看下面这篇博客 https://blog.csdn.net/m0_37780420/article/details/80365993

2 每层卷积核的数目不同,卷积后的层是不是卷积核数量的乘积呢? 不是的,假设第一层的卷积核为6个,图像为2828,第一层卷积后为62828(注意这里使用的padding="same",如果不是,则不一样的),第三层的卷积核为8个,那么卷积后的依然是862828,只是深度不一样。

5 用一句来来说:CNN就是神经网络的全连接里面有很多权重为0,很多神经元共用相同的的权重。

6 下面是使用keras对CNN进行举例

注意:我是把数据集下载到本地了

import numpy as np

from keras import Sequential

from keras.datasets import mnist

from keras.utils import np_utils

from keras.layers import Dense,Activation,Convolution2D,MaxPool2D,Flatten

def load_data(path):

path =path

f = np.load(path)

x_train, y_train = f['x_train'], f['y_train']

x_test, y_test = f['x_test'], f['y_test']

f.close()

return (x_train, y_train), (x_test, y_test)

(x_train,y_train),(x_test,y_test)=load_data(path="d:/test/mnist.npz")

#-1指的是不知道有多少个图片,1,指的是通道,28,28,长宽 #对数据进行预处理

x_train=x_train.reshape(-1,1,28,28)

x_test=x_test.reshape(-1,1,28,28)

y_train=np_utils.to_categorical(y_train,num_classes=10)

y_test=np_utils.to_categorical(y_test,num_classes=10)

#建立model

model = Sequential()

#创建一个卷积层输出32,28,28

model.add(Convolution2D(

#有多少个卷积核

filters=32,

kernel_size=(5,5),

input_shape=(1,28,28),padding="same")

) model.add(Activation("relu"))

#池化层,输出32,14,14

model.add(MaxPool2D(

pool_size=(2,2),

strides=(2,2),

padding="same"

) ) #继续卷积,输出64,14,14(稍微有一点小疑惑,是32层的每一层出64层还是)

model.add(Convolution2D(filters=64,kernel_size=(5,5),padding="same"))

model.add(Activation("relu"))

#继续池化

model.add(MaxPool2D(pool_size=(2,2),padding="same"))

#把数据抹平

model.add(Flatten())

model.add(Dense(1024))

model.add(Activation("relu"))

#输出10个神经元

model.add(Dense(10)) model.add(Activation("softmax")) from keras.optimizers import Adam

#指定优化器

adam= Adam(lr=0.001)

model.compile(optimizer=adam,loss="categorical_crossentropy", metrics=["accuracy"])

print("train")

model.fit(x_train,y_train,epochs=1,batch_size=32)

print(model.summary())

#评价

loss ,accuary=model.evaluate(x_test,y_test)

print(loss,accuary)

转载于:https://my.oschina.net/u/2511906/blog/3102674

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值