最近又再次學習了一些卷積神經網絡,有了一些深層的理解
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詳解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)
當然比較常用的是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])