1. 程式人生 > >【深度學習影象識別課程】tensorflow實現CNN系列:(1)概念介紹

【深度學習影象識別課程】tensorflow實現CNN系列:(1)概念介紹

1、tensorflow卷積層

tensorflow提供了2個函式建立卷積層:tf.nn.conv2d()和tf.nn.bias_add()

k_output = 64

image_width = 10
image_height = 10
color_channels = 3

filter_size_width = 5
filter_size_height = 5

input = tf.placeholder(tf.float32, shape=[None, image_height, image_width, color_channels])
weight = tf.Variable(tf.truncated_normal([filter_size_height, filter_size_width, color_channels, k_output]))
bias = tf.Variable(tf.zeros(k_output))

conv_layer = tf.nn.conv2d(input, weight, strides=[1,2,2,1], padding='SAME')
conv_layer = tf.nn.bias_add(conv_layer, bias)
conv_layer = tf.nn.relu(conv_layer)

tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=None, data_format=None, name=None)

input是[batch, image_height, image_width, color_channels],None是samples個數。

weight是濾波器,[filter_size_height, filter_size_width, color_channels, k_output]

Tensorflow中的stride對input的每一維都有一個補償,所以是strides=[1,2,2,1]。通常batch和color_channels的stride都是設為1。

2、常用的CNN模型結構

3個概念:池化,1*1卷積,inception

最常用的模型:卷積+池化,再加幾個全連線層。

最開始使用這個模型的是:LeNet-5,1998年,字母識別

現在的CNN:AlexNet, 2012年贏得ImageNet物體識別大賽

3、tensorflow最大池化

Tensorflow中提供tf.nn.max_pool()函式用於對卷積層進行最大池化。

conv_layer = tf.nn.conv2d(input, weight, strides=[1,2,2,1], padding='SAME')

conv_layer = tf.nn.bias_add(conv_layer, bias)

conv_layer = tf.nn.relu(conv_layer)

conv_layer = tf.nn.max_pool(conv_layer, ksize=[1,2,2,1], strides=[1,2,2,1], padding='SAME')

池化層總的來說是用來:減少輸出大小,降低過擬合。

但池化也有自己的缺點:現在的資料量很大,更怕欠擬合問題。丟失了資訊,因此更青睞dropout。

分類:平均池化、最大池化

4、1*1卷積

加入一個1*1卷積,將神經網路轉換成非線性

5、Inception

將多個卷積、池化堆疊在一起。增加網路深度,但是又減少引數。