首页 > 编程知识 正文

卷积神经网络是什么,深度神经网络有哪些

时间:2023-05-04 00:20:41 阅读:13587 作者:2925

利用VGG16构建全卷积神经网络(FCN )的语义分割文章目录利用VGG16构建全卷积神经网络)利用FCN构建语义分割1 .概要1.1 FCN的介绍1.2什么是语义分割任务2 .数据准备以及预处理3 .模型的构建

1 .概要1.1 FCN介绍

用于实现语义分割的FCN、全卷积神经网络是通过深度学习成功解决语义分割的开端之作。 我们认为,采用卷积层提取特征后,连接到全连接层后,全连接层层数是我们人为设置的,其中如果舍弃图像的空间信息,会影响语义分割,提出舍弃全连接层,在网络中只使用卷积层

该网络中有先前卷积提取的部分,最后卷积提取的部分可以上采样放大后与先前卷积提取的部分相加。 (作者认为我们到最后得到的是全局特征,我们前面得到的是局部特征,所以我们的融合可以将全局特征和局部特征融合起来,提高结果预测的精度。)。

重复几次最终返回到原始图像大小,并且通道数为21 (其中21是物体的类别,并且因为对于每个像素必须推测他是什么类型,所以通道数为类型数),这是FCN的网络架构

1.2语义分割任务是什么样的语义分割比图像识别更复杂的任务? 他的分类是像素级的,必须按像素区分他们的种类。 就像这个例子一样,我们必须区分的是一张动物照片的背景、边缘、身体,三种。 (每行依次为实际图像、预测结果、真值) )。

2 .数据准备和预处理本例采用牛津大学提供的开源数据集Oxford-IIIT-PetDataset。 这提供了许多不同类型动物的照片结构。

然后为所有图像提供他的掩码,文件夹trimap下的png文件是他提供的掩码

读一下照片给你看吧

importrandomrandom.shuffle (all _ img _ label ) defload_label ) path ) :label=TF.io.read_file ) path _label(all_img_label[0] ) PLT.im show (img _ label )0) ) img ) label

这里,对于给定的图像,发现的标签如下。 那么,让我们看看他有多少种类

NP.unique(img_label.numpy ) )那么,在此图像中可以看到多少种背景边缘的array (1,2,3 )、dtype=uint8)呢? 我们在这里确定了我们的问题。 我们的

all _ img _ path=glob.glob (imagelocationall _ img _ label=glob.glob ) imagelocationdataset (annotations * . jpg'(all_img_path.sort ) all_img_label.sort ) dataset=TF.data.dataset.from _ tensor _ sli ide all channels=3) returnimgdefread_png(path ) : label=TF.io.read _ file (path ) label=TF.image.decode _ PNN (其中,将图像的值指定为[-1,1 ]。 标签位于[ 0,2 ]之间,并且所有大小都将更改为[ 224,224 ] label ) :img=TF.cast(img,tf.float32 ) img=img/255.0 img=labeldefpath_tath ) TF label_path(:img=read_jpg ) img _ path (label=read _ png ) label _ path (img=TF

t shapes: ((224, 224, 3), (224, 224, 1)), types: (tf.float32, tf.float32)>

这样我们就完成了对于数据的读取,然后划分验证集与测试集

dataset=dataset.shuffle(len(dataset))#提前打乱数据集test_count=int(len(dataset)*0.2)train_count=len(dataset)-test_counttrain_data=dataset.skip(test_count)test_data=dataset.take(test_count)

接下来开始我们模型的搭建。

3.模型的搭建

模型的结构,我们这里用一张图来说明(该图是由keras提供的plot_model绘画的很简单使用,搜索一下就好了):

接下来我们开始对上面这张图的解说,首先我们使用的是VGG16预训练神经网络,架构如下:

这里我们可以看到这是一个非常经典的卷积神经网络,步骤无非卷积-池化-卷积-池化,那么我们之前有提到我们要将局部信息与最后的输出结合,也就是我们的结构是图片(7,7,512)反卷积(这个是上采样的一种方法,是最广泛采用的一种方法,因为他是通过学习权重来恢复原图)放大到(14,14,512)然后与,block5_conv3的输出相加,再上采样放大到(28,28,512)然后与block4_conv3相加,再上采样放大到(56,56,256),再与block3_conv3相加最后不断上采样恢复到(224,224,3)之所以是三是因为我们要对每个类别预测一个三维向量(以上上采样皆运用反卷积,最终我们获得的图片为原来的大小),说明了原理,接下来我们贴代码:

#获取预训练神经网络 conv_base=keras.applications.VGG16(weights='imagenet',input_shape=(224,224,3),include_top=False) #获得我们接下来要对层操作的输出的 layers_names=['block5_conv3','block4_conv3','block3_conv3','block5_pool'] layers_output=[conv_base.get_layer(layer_name).output for layer_name in layers_names] #然后利用函数式API搭建我们的多输出模型 multi_out_model=keras.models.Model(inputs=conv_base.input,outputs=layers_output) multi_out_model.trainable=False inputs=layers.Input(shape=(224,224,3))#获取我们的输出 out_block5_conv3,out_block4_conv3,out_block3_conv3,out_block5_pool=multi_out_model(inputs)#接下来开始按照我们的之前的设计进行创建网络 x1=layers.Conv2DTranspose(512,3,strides=(2,2),padding='same',activation='relu')(out_block5_pool) x1=layers.Conv2D(512,3,padding='same',activation='relu')(x1) x2=tf.add(x1,out_block5_conv3) x2=layers.Conv2DTranspose(512,3,strides=(2,2),padding='same',activation='relu')(x2) x2=layers.Conv2D(512,3,padding='same',activation='relu')(x2) x3=tf.add(x2,out_block4_conv3) x3=layers.Conv2DTranspose(256,3,strides=(2,2),padding='same',activation='relu')(x3) x3=layers.Conv2D(256,3,padding='same',activation='relu')(x3) x4=tf.add(x3,out_block3_conv3) x4=layers.Conv2DTranspose(128,3,strides=(2,2),padding='same',activation='relu')(x4)#对每个像素都输出一个三维的向量 x4=layers.Conv2D(128,3,padding='same',activation='relu')(x4) prediction=layers.Conv2DTranspose(3,3,strides=(2,2),padding='same',activation='relu')(x4) prediction=layers.Conv2D(3,3,padding='same',activation='softmax')(prediction) #仍然利用我们的函数式API创建我们的模型 model=keras.models.Model(inputs=inputs,outputs=prediction) model.compile(optimizer=keras.optimizers.Adam(0.001),loss='sparse_categorical_crossentropy',metrics=['acc'])

然后我们就可以开始训练了,这里之所以设置为1是因为设备扛不住了。。。导致我是多次断点训练,每间隔两次保存权重再重新训练

model.fit(train_data,epochs=1,steps_per_epoch=train_count//BATCH_SIZE)

4.预测结果的分析与可视化

Epoch 1/2369/369 [==============================] - ETA: 0s - loss: 0.1918 - acc: 0.9195

可以看到仅仅用了几次就达到了接近92的准确率(并不是一次,我这里其实经过了多次重新训练,大概四次,

model.evaluate(test_data,steps=test_count//BATCH_SIZE)92/92 [==============================] - 55s 70ms/step - loss: 0.1796 - acc: 0.9236

而且在测试集上就达到了92.36%,其实还有上升的趋势,但是设备问题我没有在训练了)那么说明我们的准确性还是很高的,接下来我们对结果进行可视化

num=3for image,mask in test_data.take(1): pred=model.predict(image) pred=tf.argmax(pred,axis=-1) pred=pred[...,tf.newaxis] plt.figure(figsize=(10,10)) for i in range(3): plt.subplot(num,3,i*num+1) plt.imshow(keras.preprocessing.image.array_to_img(image[i])) plt.subplot(num,3,i*num+2) plt.imshow(keras.preprocessing.image.array_to_img(pred[i])) plt.subplot(num,3,i*num+3) plt.imshow(keras.preprocessing.image.array_to_img(mask[i]))

可以看到效果虽然有瑕疵其实是还可以的,也有设备问题(每训练一次内存就满了)。。。

结语

在本例中我们实现了全卷积神经网络FCN,并且完成了对该模型的训练,评估,结果的可视化与真值的对比,有什么更好的建议,或者问题可以在评论区交流,谢谢。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。