CNN神经网络

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

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

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

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

4 会遇到的问题lua

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

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

5 用一句来来讲:CNN就是神经网络的全链接里面有不少权重为0,不少神经元共用相同的的权重。blog

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

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

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)

相关文章
相关标签/搜索