卷積神經網絡的進一步理解

最近又再次學習了一些卷積神經網絡,有了一些深層的理解

1、工具安裝

安裝tensorflow和keras又花了一番功夫,找到了一篇還不錯的安裝博客,鏈接如下:
Anaconda下安裝Tensorflow和Keras的安裝教程
現在使用比較多
值得注意的是
我們使用anaconda進行安裝,因爲keras還需要這幾個庫的支持,然後再安裝上面鏈接的那一篇博客安裝。
pip install numpy
pip install matplotlib
pip install scipy
pip install tensorflow
pip install keras

2、理解和感悟

(1) 優化器Optimizer

其中,優化器有以下這些
深度學習——優化器算法Optimizer詳解(BGDSGDMBGDMomentumNAGAdagradAdadeltaRMSpropAdam
當然比較常用的是SGD,即隨機梯度下降算法。
隨機梯度下降b站教程

(2)Alex經典cnn網絡

AlexNet的整個網絡結構就是由5個卷積層和3個全連接層組成的,深度總共8層
在這裏插入圖片描述

# 導包
import keras
from keras.models import Sequential
from keras.layers import Dense,Activation,Dropout,Flatten,Conv2D,MaxPool2D
from keras.layers.normalization import BatchNormalization
import numpy as np
np.random.seed(1000)
# 獲取數據
import tflearn.datasets.oxflower17 as oxflower17
x,y = oxflower17.load_data(one_hot=True)
# 定義AlexNet模型
model = Sequential()
# 1block
model.add(Conv2D(filters = 97,
                 kernel_size = (11,11),
                 strides = (4,4),
                 padding = "valid",
                 input_shape = (224,224,3)))
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size = (2,2),
                    strides = (2,2),
                    padding = "valid"))
model.add(BatchNormalization())
# 2block
model.add(Conv2D(filters = 256,
                 kernel_size = (11,11),
                 strides = (1,1),
                 padding = "valid"))
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size = (2,2),
                    strides = (2,2),
                    padding = "valid"))
model.add(BatchNormalization())
# 3 block
model.add(Conv2D(filters = 384,
                 kernel_size = (3,3),
                 strides = (1,1),
                 padding = "valid"))
model.add(Activation("relu"))
model.add(BatchNormalization())
# 4 block
model.add(Conv2D(filters = 384,
                 kernel_size = (3,3),
                 strides = (1,1),
                 padding = "valid"))
model.add(Activation("relu"))
model.add(BatchNormalization())
# 5 block
model.add(Conv2D(filters = 256,
                 kernel_size = (3,3),
                 strides = (1,1),
                 padding = "valid"))
model.add(Activation("relu"))
model.add(MaxPool2D(pool_size = (2,2),
                    strides = (2,2),
                    padding = "valid"))
model.add(BatchNormalization())
# 6 dense
model.add(Flatten())
model.add(Dense(4096, input_shape=(224*224*3,)))
model.add(Activation("relu"))
model.add(Dropout(0.4))
model.add(BatchNormalization())
# 7 dense
model.add(Dense(4096))
model.add(Activation("relu"))
model.add(Dropout(0.4))
model.add(BatchNormalization())
# 8 dense
model.add(Dense(17))
model.add(Activation("softmax"))


model.summary()
# compile
model.compile(loss = "categorical_crossentropy",
              optimizer = "adam",
              metrics = ["accuracy"])
# train
model.fit(x,
          y,
          batch_size = 32,
          epochs = 8,
          verbose = 1,
          validation_split = 0.3,
          shuffle = True)

(3)殘差網絡

ResNet中解決深層網絡梯度消失的問題的核心結構是殘差網絡
在這裏插入圖片描述
殘差網絡增加了一個identity mapping(恆等映射),把當前輸出直接傳輸給下一層網絡(全部是1:1傳輸,不增加額外的參數),相當於走了一個捷徑,跳過了本層運算,這個直接連接命名爲"skip connection"。同時在反向傳播過程中,也是將下一層網絡的梯度直接傳遞給上一層網絡,這樣就解決了深層網絡的梯度消失問題。

import keras
from keras.layers import Conv2D,Input

x = Input(shape=(224,224,3))
y = Conv2D(3,(3,3),padding="same")(x)

z = keras.layers.add([x,y])

from keras.applications.resnet50 import ResNet50
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input, decode_predictions
import numpy as np

model = ResNet50(weights="imagenet")

img_path = "elephant.jpg"
img = image.load_img(img_path, target_size=(224, 224))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

preds = model.predict(x)
# decode the results into a list of tuples (class, description, probability)
# (one such list for each sample in the batch)
print("Predicted:", decode_predictions(preds, top=3)[0])


b站學習視頻點這裏
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章