日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

通过python实现卷积神经网络_Python 徒手实现 卷积神经网络 CNN

發布時間:2025/3/19 python 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过python实现卷积神经网络_Python 徒手实现 卷积神经网络 CNN 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. 動機(Motivation)

通過普通的神經網絡可以實現,但是現在圖片越來越大,如果通過 NN 來實現,訓練的參數太多。例如 224 x 224 x 3 = 150,528,隱藏層設置為 1024 就需要訓練參數 150,528 x 1024 = 1.5 億 個,這還是第一層,因此會導致我們的網絡很龐大。

另一個問題就是特征位置在不同的圖片中會發生變化。例如小貓的臉在不同圖片中可能位于左上角或者右下角,因此小貓的臉不會激活同一個神經元。

2. 數據集(Dataset)

我們使用手寫數字數據集 MNIST 。

每個數據集都以一個 28x28 像素的數字。

普通的神經網絡也可以處理這個數據集,因為圖片較小,另外數字都集中在中間位置,但是現實世界中的圖片分類問題可就沒有這么簡單了,這里只是拋磚引玉哈。

3. 卷積(Convolutions)

CNN 相較于 NN 來說主要是增加了基于 convolution 的卷積層。卷基層包含一組 filter,每一個 filter 都是一個 2 維的矩陣。以下為 3x3 filter:

我們可以通過輸入的圖片和上面的 filter 來做卷積運算,然后輸出一個新的圖片。包含以下步驟:將 filter 疊加在圖片的頂部,一般是左上角

然后執行對應元素的相乘

將相乘的結果進行求和,得到輸出圖片的目標像素值

重復以上操作在所有位置上

執行效果如下所示:

3.1 有用嗎?

通過卷積可以提取圖片中的特定線條,垂直線條或者水平線條,以下為 vertical Sobel filter and horizontal Sobel filter 的結果:

卷積可以幫助我們查找一些圖片特征(例如邊緣)。

3.2 Padding(填充)

可以通過在周圍補 0 實現輸出前后圖像大小一致,如下所示:

這叫做 "same padding",不過一般不用 padding,叫做 "valid" padding。

3.3 卷基層

CNN 包含卷基層,卷基層通過一組 filter 將輸入的圖片轉為輸出的圖片。卷基層的主要參數是 filter 的個數。

對于 MNIST CNN,我使用一個含有 8 個 filter 的卷基層,意味著它將 28x28 的輸入圖片轉為 26x26x8 的輸出集:

卷基層的 8 個 filter 分別產生 26x26 的輸出,只有 3 x 3 (filter size) x 8 (nb_filters) = 72 權重值。

3.4 卷積層代碼實現

簡單起見,我們使用 3x3 的filter,首先實現一個 卷基層的類:

import numpy as np

class Conv3x3:

# A Convolution layer using 3x3 filters.

def __init__(self, num_filters):

self.num_filters = num_filters

# filters is a 3d array with dimensions (num_filters, 3, 3)

# We divide by 9 to reduce the variance of our initial values

self.filters = np.random.randn(num_filters, 3, 3) / 9

Conv3x3 類只需要一個參數:filter 個數。通過 NumPy 的 randn() 方法實現。之所以在初始化的時候除以 9 是因為對于初始化的值不能太大也不能太小,參考:Xavier Initialization。

接下來,具體實現卷基層:

class Conv3x3:

# ...

def iterate_regions(self, image):

'''Generates all possible 3x3 image regions using valid padding.- image is a 2d numpy array'''

h, w = image.shape

for i in range(h - 2):

for j in range(w - 2):

im_region = image[i:(i + 3), j:(j + 3)]

yield im_region, i, j

# 將 im_region, i, j 以 tuple 形式存儲到迭代器中

# 以便后面遍歷使用

def forward(self, input):

'''Performs a forward pass of the conv layer using the given input.Returns a 3d numpy array with dimensions (h, w, num_filters).- input is a 2d numpy array'''

# input 為 image,即輸入數據

# output 為輸出框架,默認都為 0,都為 1 也可以,反正后面會覆蓋

# input: 28x28

# output: 26x26x8

h, w = input.shape

output = np.zeros((h - 2, w - 2, self.num_filters))

for im_region, i, j in self.iterate_regions(input):

# 卷積運算,點乘再相加,ouput[i, j] 為向量,8 層

output[i, j] = np.sum(im_region * self.filters, axis=(1, 2))

# 最后將輸出數據返回,便于下一層的輸入使用

return output

4. 池化(Pooling)

圖片的相鄰像素具有相似的值,因此卷基層中很多信息是冗余的。通過池化來減少這個影響,包含 max, min or average,下圖為基于 2x2 的 Max Pooling:

與卷積計算類似,只是這個更容易,只是計算最大值并賦值。池化層將會把 26x26x8 的輸入轉為 13x13x8 的輸出:

4.1 池化層代碼實現

import numpy as np

class MaxPool2:

# A Max Pooling layer using a pool size of 2.

def iterate_regions(self, image):

'''

Generates non-overlapping 2x2 image regions to pool over.

- image is a 2d numpy array

'''

# image: 26x26x8

h, w, _ = image.shape

new_h = h // 2

new_w = w // 2

for i in range(new_h):

for j in range(new_w):

im_region = image[(i * 2):(i * 2 + 2), (j * 2):(j * 2 + 2)]

yield im_region, i, j

def forward(self, input):

'''

Performs a forward pass of the maxpool layer using the given input.

Returns a 3d numpy array with dimensions (h / 2, w / 2, num_filters).

- input is a 3d numpy array with dimensions (h, w, num_filters)

'''

# input: 卷基層的輸出,池化層的輸入

h, w, num_filters = input.shape

output = np.zeros((h // 2, w // 2, num_filters))

for im_region, i, j in self.iterate_regions(input):

output[i, j] = np.amax(im_region, axis=(0, 1))

return output

5. Softmax

為了完成我們的 CNN,我們需要進行具體的預測。通過 softmax 來實現,將一組數字轉換為一組概率,總和為 1。參考:Softmax function。

5.1 用法

我們將要使用一個含有 10 個節點(分別代表相應數字)的 softmax 層,作為我們 CNN 的最后一層。最后一層為一個全連接層,只是激活函數為 softmax。經過 softmax 的變換,數字就是具有最高概率的節點。

softmax 為 13x13x8 轉換為一列節點后與 10 個節點組成一個全連接,然后 softmax 為激活函數。

5.2 交叉熵損失函數(Cross-Entropy Loss)

交叉熵用來計算概率間的距離,具體公式可參考:筆記 | 什么是Cross Entropy。

其中: 為真實概率

為預測概率

為預測結果與真實結果的差距

在我們的具體問題中,對于真實概率,只有分類正確數字對應的概率為 1,其他均為 0,因此 交叉熵損失函數 可以寫成如下形式:

其中,

是正確分類(本例中為正確的數字),

類的預測概率。

的值越小越好。

5.3 Softmax 層代碼實現

import numpy as np

class Softmax:

# A standard fully-connected layer with softmax activation.

def __init__(self, input_len, nodes):

# We divide by input_len to reduce the variance of our initial values

# input_len: 輸入層的節點個數,池化層輸出拉平之后的

# nodes: 輸出層的節點個數,本例中為 10

# 構建權重矩陣,初始化隨機數,不能太大

self.weights = np.random.randn(input_len, nodes) / input_len

self.biases = np.zeros(nodes)

def forward(self, input):

'''

Performs a forward pass of the softmax layer using the given input.

Returns a 1d numpy array containing the respective probability values.

- input can be any array with any dimensions.

'''

# 3d to 1d,用來構建全連接網絡

input = input.flatten()

input_len, nodes = self.weights.shape

# input: 13x13x8 = 1352

# self.weights: (1352, 10)

# 以上叉乘之后為 向量,1352個節點與對應的權重相乘再加上bias得到輸出的節點

# totals: 向量, 10

totals = np.dot(input, self.weights) + self.biases

# exp: 向量, 10

exp = np.exp(totals)

return exp / np.sum(exp, axis=0)

至此,我們完成了我們 CNN 模型的整個 forward pass!把它們放在一起調用:

import mnist

import numpy as np

# We only use the first 1k testing examples (out of 10k total)

# in the interest of time. Feel free to change this if you want.

test_images = mnist.test_images()[:1000]

test_labels = mnist.test_labels()[:1000]

conv = Conv3x3(8) # 28x28x1 -> 26x26x8

pool = MaxPool2() # 26x26x8 -> 13x13x8

softmax = Softmax(13 * 13 * 8, 10) # 13x13x8 -> 10

def forward(image, label):

'''

Completes a forward pass of the CNN and calculates the accuracy and

cross-entropy loss.

- image is a 2d numpy array

- label is a digit

'''

# We transform the image from [0, 255] to [-0.5, 0.5] to make it easier

# to work with. This is standard practice.

# out 為卷基層的輸出, 26x26x8

out = conv.forward((image / 255) - 0.5)

# out 為池化層的輸出, 13x13x8

out = pool.forward(out)

# out 為 softmax 的輸出, 10

out = softmax.forward(out)

# Calculate cross-entropy loss and accuracy. np.log() is the natural log.

# 損失函數的計算只與 label 的數有關,相當于索引

loss = -np.log(out[label])

# 如果 softmax 輸出的最大值就是 label 的值,表示正確,否則錯誤

acc = 1 if np.argmax(out) == label else 0

return out, loss, acc

print('MNIST CNN initialized!')

loss = 0

num_correct = 0

# enumerate 函數用來增加索引值

for i, (im, label) in enumerate(zip(test_images, test_labels)):

# Do a forward pass.

_, l, acc = forward(im, label)

loss += l

num_correct += acc

# Print stats every 100 steps.

if i % 100 == 99:

print(

'[Step %d] Past 100 steps: Average Loss %.3f | Accuracy: %d%%' %

(i + 1, loss / 100, num_correct)

)

loss = 0

num_correct = 0

輸出結果如下所示:

MNIST CNN initialized!

[Step 100] Past 100 steps: Average Loss 2.302 | Accuracy: 11%

[Step 200] Past 100 steps: Average Loss 2.302 | Accuracy: 8%

[Step 300] Past 100 steps: Average Loss 2.302 | Accuracy: 3%

[Step 400] Past 100 steps: Average Loss 2.302 | Accuracy: 12%

這也比較合理,由于是通過隨機的權重初始值,目前這個 CNN 模型跟我們隨機猜測的結果類似。隨機猜測的結果是 10%。

6. 訓練概述(Training Overview)

訓練神經網絡一般包含兩個階段:forward phase: 輸入參數傳遞通過整個網絡。

backward phase: 反向傳播更新 gradient 和 weight。

我們按照如上的模式來訓練 CNN。還有以下兩個方法需要使用:在 forward phase 中,每一層都需要存儲一些數據(例如輸入數據,中間值等)。這些數據將會在 backward phase 中得到使用。因此每一個 backward phase 都需要在相應的 forward phase 之后運行。

在 backward phase 中,每一層都要獲取 gradient 并且也返回 gradient。獲取的是 loss 對于該層輸出(

)的 gradient,返回的是 loss 對于該層輸入(

)的 gradient。

上面兩個方法可以幫助我們更有條理且簡潔的實現訓練。訓練 CNN 的代碼大約長下面的樣紙:

# Feed forward

# image 為輸入層,28x28

# out 為卷基層輸出,26x26x8

out = conv.forward((image / 255) - 0.5)

# out 為池化層輸出,13x13x8

out = pool.forward(out)

# out 為 softmax 層輸出,10

out = softmax.forward(out)

# Calculate initial gradient

# gradient: loss 對于 softmax 輸出層的 gradient

gradient = np.zeros(10)

# ...

# Backprop

# gradient:loss 對于 softmax 輸入層的 gradient

# 輸入為 loss 對于 softmax 輸出層的 gradient

gradient = softmax.backprop(gradient)

# gradient:loss 對于池化層輸入層的 gradient

# 輸入為 loss 對于池化層輸出層的 gradient

gradient = pool.backprop(gradient)

# gradient:loss 對于卷基層輸入層的 gradient

# 輸入為 loss 對于卷基層輸出層的 gradient

gradient = conv.backprop(gradient)

7. 反向傳播:Softmax(Backprop: Softmax)

我們需要從最后開始朝著最前面計算,這就是 backprop 的工作原理。首先回想下交叉熵損失函數(cross-entropy loss):

其中,

是正確類

(也就是圖片中的數字)的預測概率。

首先我們需要計算 softmax 層的 backward phase 的輸入數據,

,其中

(下標的

是說明 softmax 層)是指 softmax 層的輸出值:一個含有 10 個概率值的向量。由于

只出現在了 loss 方程中,因此很容易計算:

上面就是我們的初始化 gradient:

# Calculate initial gradient

# 默認都為 0

gradient = np.zeros(10)

# 只修改 label 值對應的

gradient[label] = -1 / out[label]

現在我們已經準備好了開始實現我們第一個 backward phase,但是我們需要首先在 forward phase 中存儲我們前面討論的相關數據。

class Softmax:

# ...

def forward(self, input):

'''Performs a forward pass of the softmax layer using the given input.Returns a 1d numpy array containing the respective probability values.- input can be any array with any dimensions.'''

# NEW ADD,13x13x8

self.last_input_shape = input.shape

input = input.flatten()

# NEW ADD, 向量,1352

self.last_input = input

input_len, nodes = self.weights.shape

totals = np.dot(input, self.weights) + self.biases

# NEW ADD,softmax 前的向量,10

self.last_totals = totals

exp = np.exp(totals)

return exp / np.sum(exp, axis=0)

接下來我們可以獲取 backprop phase 的 gradient。 我們已經獲取 softmax backward phase 的輸入 gradient:

。由于只有一個是有值的,其他都是 0,因此我們可以忽略除了

之外的其他值!

首先,讓我們計算

對于 totals (上面代碼中的,softmax 轉換前的值)的gradient。讓

來表示 total 的類

。然后我們可以把

寫作:

其中,

現在,開始考慮一些類

,其中

。我們可以把

寫作:(由于只有

有值,因此只需考慮它就行了,其中

相當于常數不用考慮)

使用 Chain Rule 得到:

上面是針對

。現在讓我們算下

的時候,如下所示:

合并如下:

如下實現:

class Softmax:

# ...

def backprop(self, d_L_d_out):

'''

Performs a backward pass of the softmax layer.

Returns the loss gradient for this layer's inputs.

- d_L_d_out is the loss gradient for this layer's outputs.

'''

# We know only 1 element of d_L_d_out will be nonzero

for i, gradient in enumerate(d_L_d_out):

# 找到 label 的值,就是 gradient 不為 0 的

if gradient == 0:

continue

# e^totals

t_exp = np.exp(self.last_totals)

# Sum of all e^totals

S = np.sum(t_exp)

# Gradients of out[i] against totals

# 初始化都設置為 非 c 的值,再單獨修改 c 的值

d_out_d_t = -t_exp[i] * t_exp / (S ** 2)

d_out_d_t[i] = t_exp[i] * (S - t_exp[i]) / (S ** 2)

# ... to be continued

我們繼續哈。我們最終是想要計算 loss 對于 weights,biases 和 input 的 gradient:我們要使用 weights gradient,

,來更新層的 weights。

我們要使用 biases gradient,

,來更新層的 biases。

我們要返回 input(每一層的正向輸入) 的 gradient,

,基于 backprop 的方法,所以下一層可以使用它。

為了計算上面 3 個 loss gradient,我們首先需要獲取另外 3 個結果:totals(做 softmax 之前的向量,10 個元素)對于 weights,biases 和 input 的 gradient。相關公式如下:(以下為對于單獨 weight 的計算,但是代碼實現的時候是通過 matrix,相對抽象)

這些 gradient 很容易計算:

根據 Chain Rule 把它們放在一起:

其中, :loss 函數

:做 softmax 的輸出結果,與 loss 公式直接相關的 概率

:做 softmax 的輸入參數,通過 weights,bias 以及 softmax 層的輸入來獲取

把它們一并放到代碼中實現如下:

class Softmax:

# ...

def backprop(self, d_L_d_out):

'''

Performs a backward pass of the softmax layer.

Returns the loss gradient for this layer's inputs.

- d_L_d_out is the loss gradient for this layer's outputs.

'''

# We know only 1 element of d_L_d_out will be nonzero

for i, gradient in enumerate(d_L_d_out):

if gradient == 0:

continue

# e^totals

t_exp = np.exp(self.last_totals)

# Sum of all e^totals

S = np.sum(t_exp)

# Gradients of out[i] against totals

d_out_d_t = -t_exp[i] * t_exp / (S ** 2)

d_out_d_t[i] = t_exp[i] * (S - t_exp[i]) / (S ** 2)

# NEW ADD

# Gradients of totals against weights/biases/input

# d_t_d_w 的結果是 softmax 層的輸入數據,1352 個元素的向量

# 不是最終的結果,最終結果是 2d 矩陣,1352x10

d_t_d_w = self.last_input

d_t_d_b = 1

# d_t_d_input 的結果是 weights 值,2d 矩陣,1352x10

d_t_d_inputs = self.weights

# Gradients of loss against totals

# 向量,10

d_L_d_t = gradient * d_out_d_t

# Gradients of loss against weights/biases/input

# np.newaxis 可以幫助一維向量變成二維矩陣

# (1352, 1) @ (1, 10) to (1352, 10)

d_L_d_w = d_t_d_w[np.newaxis].T @ d_L_d_t[np.newaxis]

d_L_d_b = d_L_d_t * d_t_d_b

# (1352, 10) @ (10, 1) to (1352, 1)

d_L_d_inputs = d_t_d_inputs @ d_L_d_t

# ... to be continued

計算出 gradient 之后,剩下的就是訓練 softmax 層。我們通過 SGD(Stochastic Gradient Decent)來更新 weights 和 bias,并返回 d_L_d_inputs:

class Softmax

# ...

# ADD A NEW PARAMETER - learn_rate

def backprop(self, d_L_d_out, learn_rate):

'''

Performs a backward pass of the softmax layer.

Returns the loss gradient for this layer's inputs.

- d_L_d_out is the loss gradient for this layer's outputs.

- learn_rate is a float

'''

# We know only 1 element of d_L_d_out will be nonzero

for i, gradient in enumerate(d_L_d_out):

if gradient == 0:

continue

# e^totals

t_exp = np.exp(self.last_totals)

# Sum of all e^totals

S = np.sum(t_exp)

# Gradients of out[i] against totals

d_out_d_t = -t_exp[i] * t_exp / (S ** 2)

d_out_d_t[i] = t_exp[i] * (S - t_exp[i]) / (S ** 2)

# Gradients of totals against weights/biases/input

d_t_d_w = self.last_input

d_t_d_b = 1

d_t_d_inputs = self.weights

# Gradients of loss against totals

d_L_d_t = gradient * d_out_d_t

# Gradients of loss against weights/biases/input

d_L_d_w = d_t_d_w[np.newaxis].T @ d_L_d_t[np.newaxis]

d_L_d_b = d_L_d_t * d_t_d_b

d_L_d_inputs = d_t_d_inputs @ d_L_d_t

# NEW ADD

# Update weights / biases

self.weights -= learn_rate * d_L_d_w

self.biases -= learn_rate * d_L_d_b

# 將矩陣從 1d 轉為 3d

# 1352 to 13x13x8

return d_L_d_inputs.reshape(self.last_input_shape)

注意我們添加了 learn_rate 參數用來控制更新 weights 與 biases 的快慢。此外,我們需要將 d_L_d_inputs 進行 reshape() 操作,因為我們在 forward pass 中將 input 進行了 flatten() 操作。reshape() 操作之后,保證與原始輸入具有相同的結構。

8. 反向傳播:池化層(Backprop: Max Pooling)

池化層不需要訓練,因為它里面不存在任何 weights,但是為了計算 gradient 我們仍然需要實現一個 backprop() 方法。首先我們還是需要存儲一些臨時數據在 forward phase 里面。我們這次需要存儲的是 input。

class MaxPool2:

# ...

def forward(self, input):

'''

Performs a forward pass of the maxpool layer using the given input.

Returns a 3d numpy array with dimensions (h / 2, w / 2, num_filters).

- input is a 3d numpy array with dimensions (h, w, num_filters)

'''

# 存儲 池化層 的輸入參數,26x26x8

self.last_input = input

# More implementation

# ...

在 forward pass 的過程中,Max Pooling 層選取 2x2 塊的最大值進行輸入,如下圖所示:

backward phase 中的相同層如下圖所示:

每一個 gradient 的值都被賦值到原始的最大值的位置,其他的值都是 0。

為什么 backward phase 的 Max Pooling 層顯示如上呢?讓我們直覺思考下

(Max Pooling 的輸入數據,26x26x8)的值是多少。對于 2x2 數據塊中不是最大值的輸入像素將不會對 loss 產生任何影響,因為稍微改變這個值并不會改變輸出!換句話說,對于非最大值的像素點:

。另一方面,最大值的像素點會將值傳遞給輸出,所以

,也就是說,

總結后就是:(output 與 input 都是相對于 Max Pooling 層來說的)

代碼實現如下:

class MaxPool2:

# ...

def iterate_regions(self, image):

'''

Generates non-overlapping 2x2 image regions to pool over.

- image is a 2d numpy array

'''

h, w, _ = image.shape

new_h = h // 2

new_w = w // 2

for i in range(new_h):

for j in range(new_w):

im_region = image[(i * 2):(i * 2 + 2), (j * 2):(j * 2 + 2)]

yield im_region, i, j

def backprop(self, d_L_d_out):

'''

Performs a backward pass of the maxpool layer.

Returns the loss gradient for this layer's inputs.

- d_L_d_out is the loss gradient for this layer's outputs.

'''

# 池化層輸入數據,26x26x8,默認初始化為 0

d_L_d_input = np.zeros(self.last_input.shape)

# 每一個 im_region 都是一個 3x3x8 的8層小矩陣

# 修改 max 的部分,首先查找 max

for im_region, i, j in self.iterate_regions(self.last_input):

h, w, f = im_region.shape

# 獲取 im_region 里面最大值的索引向量,一疊的感覺

amax = np.amax(im_region, axis=(0, 1))

# 遍歷整個 im_region,對于傳遞下去的像素點,修改 gradient 為 loss 對 output 的gradient

for i2 in range(h):

for j2 in range(w):

for f2 in range(f):

# If this pixel was the max value, copy the gradient to it.

if im_region[i2, j2, f2] == amax[f2]:

d_L_d_input[i * 2 + i2, j * 2 + j2, f2] = d_L_d_out[i, j, f2]

return d_L_d_input

對于每一個 2x2 的像素塊,我們找到 forward pass 中最大值的像素點,然后將 loss 對 output 的 gradient 復制過去 。

就是醬紫來弄,接下來是最后一層了。

9. 反向傳播:卷積層(Backprop: Conv)

終于到卷基層了:卷積層的反向傳播是 CNN 模型訓練的核心。forward phase 存儲很簡單:

class Conv3x3

# ...

def forward(self, input):

'''

Performs a forward pass of the conv layer using the given input.

Returns a 3d numpy array with dimensions (h, w, num_filters).

- input is a 2d numpy array

'''

# 輸入大數據,28x28

self.last_input = input

# More implementation

# ...

我們主要是對卷基層的 filter 感興趣,因為我們需要跟新 filter 的 weight。我們已經得到了卷積層的

,所以我們需要獲取

。為了計算這個值,我們需要問下自己:怎么樣改變 filter 的 weight 來影響 卷積層 的輸出的?

實際上,改變任何 filter 的 weight 都會影響到整個輸出圖片的信息,因為在卷積過程中,每一個輸出的像素都會使用每一個 filter 的 weight。為了簡單起見,我們試想下一次只有一個輸出:如何修改 filter 來改變那個具體輸出像素的值?

下面這個例子有助于我們思考這個問題:

我們有一個 3x3 的圖片與一個都是 0 的 3x3 的 filter 進行卷積運算,結果只有一個 1x1 的輸出。如果我們把 filter 中間的 weight 增加到 1 呢?輸出將會隨著中心值來增加到 80:

簡單起見,增加任何 filter 的其他權重到 1,都會最終增加相應的輸出圖片像素值!這說明一個具體的輸出像素對于具體的 filter 的 weight 的 gradient 就是對應的像素值。推導如下:

如下圖所示,對于任意一個

都是通過 image 中的 3x3 矩陣 與 filter 的 3x3 矩陣進行點乘求和獲取的,因此對于 任意一個

對于 任意一個

的 gradient 就是與其對應相乘的那個像素點

。

于是,我們可以實現卷積層的 backprop 如下:

class Conv3x3

# ...

def backprop(self, d_L_d_out, learn_rate):

'''

Performs a backward pass of the conv layer.

- d_L_d_out is the loss gradient for this layer's outputs.

- learn_rate is a float.

'''

# 初始化一組為 0 的 gradient,3x3x8

d_L_d_filters = np.zeros(self.filters.shape)

# im_region,一個個 3x3 小矩陣

for im_region, i, j in self.iterate_regions(self.last_input):

for f in range(self.num_filters):

# 按 f 分層計算,一次算一層,然后累加起來

# d_L_d_filters[f]: 3x3 matrix

# d_L_d_out[i, j, f]: num

# im_region: 3x3 matrix in image

d_L_d_filters[f] += d_L_d_out[i, j, f] * im_region

# Update filters

self.filters -= learn_rate * d_L_d_filters

# We aren't returning anything here since we use Conv3x3 as

# the first layer in our CNN. Otherwise, we'd need to return

# the loss gradient for this layer's inputs, just like every

# other layer in our CNN.

return None

至此,我們已經實現了 CNN 的整個 backward pass。接下來我們來測試下...

10. 訓練 CNN(Training a CNN)

我們將要訓練我們的 CNN 模型通過幾個 epoch,跟蹤訓練中的改進,并且在另外的測試集上進行測試。下面是完整的代碼:

import mnist

import numpy as np

# We only use the first 1k examples of each set in the interest of time.

# Feel free to change this if you want.

train_images = mnist.train_images()[:1000]

train_labels = mnist.train_labels()[:1000]

test_images = mnist.test_images()[:1000]

test_labels = mnist.test_labels()[:1000]

conv = Conv3x3(8) # 28x28x1 -> 26x26x8

pool = MaxPool2() # 26x26x8 -> 13x13x8

softmax = Softmax(13 * 13 * 8, 10) # 13x13x8 -> 10

def forward(image, label):

'''Completes a forward pass of the CNN and calculates the accuracy andcross-entropy loss.- image is a 2d numpy array- label is a digit'''

# We transform the image from [0, 255] to [-0.5, 0.5] to make it easier

# to work with. This is standard practice.

out = conv.forward((image / 255) - 0.5)

out = pool.forward(out)

out = softmax.forward(out)

# Calculate cross-entropy loss and accuracy. np.log() is the natural log.

loss = -np.log(out[label])

acc = 1 if np.argmax(out) == label else 0

return out, loss, acc

# out: vertor of probability

# loss: num

# acc: 1 or 0

def train(im, label, lr=.005):

'''Completes a full training step on the given image and label.Returns the cross-entropy loss and accuracy.- image is a 2d numpy array- label is a digit- lr is the learning rate'''

# Forward

out, loss, acc = forward(im, label)

# Calculate initial gradient

gradient = np.zeros(10)

gradient[label] = -1 / out[label]

# Backprop

gradient = softmax.backprop(gradient, lr)

gradient = pool.backprop(gradient)

gradient = conv.backprop(gradient, lr)

return loss, acc

print('MNIST CNN initialized!')

# Train the CNN for 3 epochs

for epoch in range(3):

print('--- Epoch%d---' % (epoch + 1))

# Shuffle the training data

permutation = np.random.permutation(len(train_images))

train_images = train_images[permutation]

train_labels = train_labels[permutation]

# Train!

loss = 0

num_correct = 0

# i: index

# im: image

# label: label

for i, (im, label) in enumerate(zip(train_images, train_labels)):

if i > 0 and i % 100 == 99:

print(

'[Step%d] Past 100 steps: Average Loss%.3f| Accuracy:%d%%' %

(i + 1, loss / 100, num_correct)

)

loss = 0

num_correct = 0

l, acc = train(im, label)

loss += l

num_correct += acc

# Test the CNN

print('\n--- Testing the CNN ---')

loss = 0

num_correct = 0

for im, label in zip(test_images, test_labels):

_, l, acc = forward(im, label)

loss += l

num_correct += acc

num_tests = len(test_images)

print('Test Loss:', loss / num_tests)

print('Test Accuracy:', num_correct / num_tests)

例子的輸出結果如下:

MNIST CNN initialized!

--- Epoch 1 ---

[Step 100] Past 100 steps: Average Loss 2.254 | Accuracy: 18%

[Step 200] Past 100 steps: Average Loss 2.167 | Accuracy: 30%

[Step 300] Past 100 steps: Average Loss 1.676 | Accuracy: 52%

[Step 400] Past 100 steps: Average Loss 1.212 | Accuracy: 63%

[Step 500] Past 100 steps: Average Loss 0.949 | Accuracy: 72%

[Step 600] Past 100 steps: Average Loss 0.848 | Accuracy: 74%

[Step 700] Past 100 steps: Average Loss 0.954 | Accuracy: 68%

[Step 800] Past 100 steps: Average Loss 0.671 | Accuracy: 81%

[Step 900] Past 100 steps: Average Loss 0.923 | Accuracy: 67%

[Step 1000] Past 100 steps: Average Loss 0.571 | Accuracy: 83%

--- Epoch 2 ---

[Step 100] Past 100 steps: Average Loss 0.447 | Accuracy: 89%

[Step 200] Past 100 steps: Average Loss 0.401 | Accuracy: 86%

[Step 300] Past 100 steps: Average Loss 0.608 | Accuracy: 81%

[Step 400] Past 100 steps: Average Loss 0.511 | Accuracy: 83%

[Step 500] Past 100 steps: Average Loss 0.584 | Accuracy: 89%

[Step 600] Past 100 steps: Average Loss 0.782 | Accuracy: 72%

[Step 700] Past 100 steps: Average Loss 0.397 | Accuracy: 84%

[Step 800] Past 100 steps: Average Loss 0.560 | Accuracy: 80%

[Step 900] Past 100 steps: Average Loss 0.356 | Accuracy: 92%

[Step 1000] Past 100 steps: Average Loss 0.576 | Accuracy: 85%

--- Epoch 3 ---

[Step 100] Past 100 steps: Average Loss 0.367 | Accuracy: 89%

[Step 200] Past 100 steps: Average Loss 0.370 | Accuracy: 89%

[Step 300] Past 100 steps: Average Loss 0.464 | Accuracy: 84%

[Step 400] Past 100 steps: Average Loss 0.254 | Accuracy: 95%

[Step 500] Past 100 steps: Average Loss 0.366 | Accuracy: 89%

[Step 600] Past 100 steps: Average Loss 0.493 | Accuracy: 89%

[Step 700] Past 100 steps: Average Loss 0.390 | Accuracy: 91%

[Step 800] Past 100 steps: Average Loss 0.459 | Accuracy: 87%

[Step 900] Past 100 steps: Average Loss 0.316 | Accuracy: 92%

[Step 1000] Past 100 steps: Average Loss 0.460 | Accuracy: 87%

--- Testing the CNN ---

Test Loss: 0.5979384893783474

Test Accuracy: 0.78

我們的代碼效果不錯,實現了 78% 的準確率。

11. Keras 實現

通過 Keras 實現上面的功能如下:

import numpy as np

import mnist

from keras.models import Sequential

from keras.layers import Conv2D, MaxPooling2D, Dense, Flatten

from keras.utils import to_categorical

from keras.optimizers import SGD

train_images = mnist.train_images()

train_labels = mnist.train_labels()

test_images = mnist.test_images()

test_labels = mnist.test_labels()

train_images = (train_images / 255) - 0.5

test_images = (test_images / 255) - 0.5

train_images = np.expand_dims(train_images, axis=3)

test_images = np.expand_dims(test_images, axis=3)

model = Sequential([

Conv2D(8, 3, input_shape=(28, 28, 1), use_bias=False),

MaxPooling2D(pool_size=2),

Flatten(),

Dense(10, activation='softmax'),

])

model.compile(SGD(lr=.005), loss='categorical_crossentropy', metrics=['accuracy'])

model.fit(

train_images,

to_categorical(train_labels),

batch_size=1,

epochs=3,

validation_data=(test_images, to_categorical(test_labels)),

)

以上代碼應用了 MNIST 的全部數據集,結果如下:

Epoch 1

loss: 0.2433 - acc: 0.9276 - val_loss: 0.1176 - val_acc: 0.9634

Epoch 2

loss: 0.1184 - acc: 0.9648 - val_loss: 0.0936 - val_acc: 0.9721

Epoch 3

loss: 0.0930 - acc: 0.9721 - val_loss: 0.0778 - val_acc: 0.9744

得到 97.4% 的準確率!

總結

以上是生活随笔為你收集整理的通过python实现卷积神经网络_Python 徒手实现 卷积神经网络 CNN的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

99在线精品观看 | 波多野结衣一区二区 | av不卡在线看 | 久久久国产精品视频 | 精品久久影院 | bbbbb女女女女女bbbbb国产 | 亚州精品成人 | 日韩免费高清在线 | 精品国产亚洲日本 | 成人一区二区三区在线 | 91av大全| 波多野结衣小视频 | 97人人看| 九九热精品视频在线播放 | 久草在线免费资源 | a视频免费在线观看 | 国产成人精品999 | 不卡的av在线播放 | 免费h精品视频在线播放 | 91麻豆精品国产91久久久久久久久 | 午夜在线观看 | 国产精品久久久久久久7电影 | 在线观看片 | 天天干天天操天天入 | 久九视频 | 麻豆精品传媒视频 | 日韩av成人在线观看 | 人人爽影院| 在线精品亚洲一区二区 | 韩国av永久免费 | 亚洲精品中文字幕在线 | 天天色棕合合合合合合 | 亚洲网站在线 | 97免费在线视频 | 999成人免费视频 | 国产精品视频在线看 | 天天干天天操 | 日韩三级.com| 日韩精品一区二区三区在线视频 | 婷婷亚洲激情 | 成人av电影免费在线观看 | 国产一区二区免费看 | a级一a一级在线观看 | 97超碰网 | 久久国产成人午夜av影院潦草 | 欧美高清成人 | 成人免费在线观看电影 | 久久综合狠狠综合久久激情 | 麻豆成人精品视频 | 免费看污的网站 | 亚洲成人免费在线观看 | 一二三区av | 亚洲综合少妇 | 免费三级黄 | av在线免费观看网站 | 91传媒激情理伦片 | 在线观看日韩中文字幕 | 91精品视频导航 | 日韩精品第1页 | 国产一区二区三精品久久久无广告 | 伊人网综合在线观看 | 亚洲成人午夜在线 | 精品在线观看一区二区三区 | 国产视频二区三区 | 亚洲专区欧美专区 | 国产精品乱码高清在线看 | 欧美一区日韩精品 | 国产精品久久久亚洲 | 国产精品国产三级国产aⅴ9色 | 波多野结衣最新 | 五月情婷婷 | 精品国产乱码一区二区三区在线 | 日韩免费视频在线观看 | 91精品在线免费 | 一区二区网| 婷婷五综合 | 免费电影一区二区三区 | 亚洲精品麻豆 | 亚洲黄色一级电影 | h网站免费在线观看 | 91精品在线观看视频 | 亚洲激情在线播放 | 精品国产一区二区三区久久 | 中文字幕av免费观看 | 国产精品视频99 | 精品天堂av| 在线免费视频 你懂得 | 久久久久久久久久福利 | 日韩av看片 | 欧美午夜理伦三级在线观看 | 午夜三级在线 | 国产精品视频你懂的 | 亚洲最新合集 | 国产成人精品一区二 | 成人 亚洲 欧美 | 在线视频a | 狠狠的干狠狠的操 | 久久精品视频在线免费观看 | 狠狠躁18三区二区一区ai明星 | 伊人狠狠色丁香婷婷综合 | 国产高清免费在线观看 | 久久人人爽人人爽人人片av软件 | 99免费在线视频观看 | 欧美一区二视频在线免费观看 | 色婷婷激情 | 国产精品一区二区三区观看 | 久久久免费 | 国产视频首页 | 视频三区 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 亚洲国产精品传媒在线观看 | 亚洲在线视频播放 | 超碰公开在线观看 | 成人黄色电影视频 | 国产麻豆成人传媒免费观看 | 午夜美女av | 又黄又爽又湿又无遮挡的在线视频 | 精品一二三区视频 | 色婷婷综合久久久 | 国产精品永久免费 | 天天操天天色天天射 | 国产黄视频在线观看 | 国产福利小视频在线 | 91视频亚洲| 亚一亚二国产专区 | 中文字幕丝袜一区二区 | 999久久久久久久久 69av视频在线观看 | 亚洲成人黄色在线 | 在线观看视频一区二区三区 | 五月亚洲 | 麻豆91精品 | 麻豆国产精品永久免费视频 | 国产精品久久久久久久久岛 | 国产精品久久久网站 | 91亚洲精品久久久蜜桃 | 天天操天天艹 | www久久久| 免费av网址大全 | 91最新网址在线观看 | 成人黄色电影在线播放 | 超碰在线个人 | 亚洲综合在 | 亚洲男人天堂2018 | 亚洲性xxxx | 伊人午夜 | 国产中文字幕一区二区 | 欧美日韩一区二区三区视频 | 国内精品久久久久影院一蜜桃 | 国产精品欧美久久久久天天影视 | 亚洲精品资源在线观看 | 久久精品8 | 天堂av免费| 亚洲精品综合在线观看 | 91精品国自产拍天天拍 | 天天爽天天碰狠狠添 | 亚洲国产中文在线观看 | 精品久久网 | 日韩电影在线观看一区二区 | a级国产乱理伦片在线观看 亚洲3级 | 国内精品久久影院 | www.日本色 | 国产一级黄色免费看 | 色久天 | 久草在线资源观看 | 色在线国产 | 国产成人精品一区在线 | 亚洲成人精品久久久 | 国产一级二级三级在线观看 | 国语自产偷拍精品视频偷 | 欧洲激情综合 | 亚洲精品中文字幕视频 | 国产亚洲精品久 | 91亚州 | 一区二区在线影院 | 天天操狠狠干 | 亚洲成人999| 人人看黄色 | av资源免费观看 | 九色视频网站 | 亚洲三级毛片 | 国产a高清| 美女网站在线 | 国产日产精品一区二区三区四区的观看方式 | 久久免费电影网 | 精品日韩中文字幕 | 四季av综合网站 | 97福利 | 69夜色精品国产69乱 | 久久久国产精品网站 | 亚洲国产精品一区二区尤物区 | 91久久丝袜国产露脸动漫 | 69av在线播放| 久久影院中文字幕 | 中文字幕日韩伦理 | 成年人视频在线 | 国产一区视频免费在线观看 | 日韩精品一区二区在线视频 | 黄色三级免费网址 | 色国产视频 | 国内外成人免费在线视频 | a在线观看国产 | 少妇bbw搡bbbb搡bbb | 日韩欧美在线免费 | 久久任你操| 一区二区视频在线看 | 国产一区二区中文字幕 | 最新av在线播放 | 久久精品久久综合 | 91桃花视频 | 色99之美女主播在线视频 | 天天干天天操天天干 | 天天射天天爱天天干 | 日日精品 | 国产xxxx做受性欧美88 | av观看免费在线 | 一区二区三区四区在线 | 色橹橹欧美在线观看视频高清 | 国产亚洲精品久久网站 | 播五月综合 | 久久成年人 | 97超碰超碰久久福利超碰 | 一区二区三区在线视频观看58 | 九九视频在线观看视频6 | 日韩精品久久久免费观看夜色 | 毛片网站免费在线观看 | 激情视频91 | 国产高清中文字幕 | 九九热视频在线播放 | 在线视频观看你懂的 | 黄网在线免费观看 | 日本久久精品视频 | 国产字幕av | 国产免费不卡av | 黄色小说网站在线 | 久久久国产一区 | 日韩r级电影在线观看 | 婷婷丁香在线视频 | 亚洲午夜精品一区二区三区电影院 | 国产手机视频精品 | 欧美精品二 | 最新av在线网站 | 黄色福利网站 | 日韩一区在线播放 | 亚洲精品av中文字幕在线在线 | 婷婷免费在线视频 | 日韩 精品 一区 国产 麻豆 | 免费久久久久久久 | 久久91久久久久麻豆精品 | 国产青春久久久国产毛片 | 超碰人人在线观看 | 人人要人人澡人人爽人人dvd | 国产精彩视频一区 | 国产99久久九九精品免费 | 97福利在线观看 | 亚洲国产福利视频 | 人人爱人人舔 | 五月激情在线 | 亚洲黄色在线免费观看 | 婷婷电影在线观看 | 国产精品入口麻豆www | 69av网| 欧美夫妻性生活电影 | 久久久免费 | 日日综合 | 欧美精品一区二区三区四区在线 | 久久国产精品免费 | 日本午夜免费福利视频 | 激情婷婷综合网 | av一区二区三区在线观看 | 九九久久婷婷 | 亚洲黄网站 | 色综合亚洲精品激情狠狠 | 日精品在线观看 | 久久99国产综合精品 | 99久久99久久精品 | 国产精品原创视频 | 欧美va在线观看 | 久草视频免费 | av三级av| 久草在线视频网 | 视频一区二区三区视频 | 成人黄色小说网 | 在线观看911视频 | 成人午夜在线电影 | 欧美与欧洲交xxxx免费观看 | 在线观看中文 | 日韩色av色资源 | 成人黄色在线视频 | 国产精品手机播放 | 伊人春色电影网 | 免费男女网站 | 日韩高清一二区 | 国产亚洲成人网 | 婷婷六月中文字幕 | 国产精品视屏 | 亚洲精品国产品国语在线 | 国产精品高潮呻吟久久av无 | 精品久久美女 | 四虎影视欧美 | av成人免费观看 | 国产精品久久艹 | 狠狠色综合网站久久久久久久 | 久精品视频 | 中文字幕888 | 涩涩网站在线 | 日韩电影一区二区三区在线观看 | 久草免费看 | 99精品视频网 | 99久久9| 国产手机在线观看视频 | 天天干天天做天天操 | 国产精品免费一区二区三区 | 欧美精品一区二区在线播放 | 日日操日日 | 人人狠狠综合久久亚洲 | 久香蕉| a黄色影院 | www操操 | 中文字幕丝袜美腿 | 国产精品一区在线观看你懂的 | 日韩欧美69| 亚洲精品一区二区精华 | 成人午夜精品久久久久久久3d | 久久久影视 | 中文资源在线观看 | 91精品免费在线 | 日韩一三区 | 国产成人一区二区精品非洲 | 大胆欧美gogo免费视频一二区 | 波多野结衣一区二区 | 视频一区二区免费 | 最近av在线 | 欧美日韩视频在线 | 五月天九九 | 国产婷婷在线观看 | 91九色porny蝌蚪视频 | 午夜三级大片 | 一本色道久久综合亚洲二区三区 | 麻豆久久| 久久成人在线 | 欧美日韩1区 | 婷婷丁香花五月天 | 91免费观看视频在线 | av导航福利 | 欧美性网站 | 日日操日日 | 亚洲欧洲成人精品av97 | 五月婷婷综合在线观看 | 国产做aⅴ在线视频播放 | 免费高清在线一区 | 亚洲国产精品99久久久久久久久 | 国产精品女同一区二区三区久久夜 | 日韩区在线观看 | 一区二区三区播放 | 国产精品igao视频网入口 | 国产一区在线视频 | 91精品一区二区三区久久久久久 | 色综合天天色综合 | 日韩免费一级a毛片在线播放一级 | 深夜男人影院 | 日韩av免费在线电影 | 一级成人免费视频 | 国产精品一区二区三区免费视频 | 亚洲视频电影在线 | 操综合| 永久免费的av电影 | 一区二区三区在线观看免费视频 | 久久精品99视频 | 久久亚洲精品国产亚洲老地址 | 一区二区精 | 免费在线观看视频a | 三级黄色网址 | 啪啪免费视频网站 | 天天色天天骑天天射 | 国产一级在线观看 | www.激情五月.com| 91精品国产综合久久福利不卡 | 激情综合电影网 | 九九九热精品免费视频观看网站 | 国产又黄又猛又粗 | 亚洲女人天堂成人av在线 | 亚洲精品免费在线 | 国产蜜臀av | 国产涩涩在线观看 | 久久久久99999 | 三级小视频在线观看 | 亚洲国产影院 | 国产精品久久久久久久久久久不卡 | 国产青青青 | 91精品久| 一级免费看视频 | 在线观看免费91 | 天天色天天骑天天射 | 久久久久久久久久久网 | 国产高清日韩 | 在线观看网站你懂的 | 亚洲精品动漫久久久久 | 国产麻豆视频 | 日韩中文字幕免费在线观看 | 亚洲精品麻豆 | 中文在线最新版天堂 | 91九色蝌蚪视频 | 黄色在线免费观看网站 | 一级性生活片 | 精品国产乱码一区二 | 国产日产在线观看 | 免费在线观看黄 | 一区在线播放 | 亚洲黄色免费电影 | 不卡视频国产 | 亚洲欧洲国产视频 | 久久这里 | 香蕉影视app | 亚洲一级免费电影 | 日韩女同av | 亚洲黄色免费网站 | 国产日产精品一区二区三区四区 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 免费视频你懂得 | 国产精品色婷婷视频 | 日韩精品一区二区三区视频播放 | 婷婷丁香花五月天 | 操操操com| 免费麻豆视频 | 国产精品日韩高清 | 久久五月网 | 特黄免费av | 国产成人精品免费在线观看 | 亚洲国产色一区 | 国产亚洲精品久久久久久久久久久久 | 永久中文字幕 | 亚洲精品自拍 | 欧美日韩二区在线 | 亚洲视频h| 一区二区精品久久 | 天堂网av 在线 | 色婷婷激情电影 | 国产在线播放一区二区三区 | 久久久久久久久福利 | 久久精品欧美一 | 九九热免费在线观看 | 日韩高清在线看 | 欧美久久久久久久久中文字幕 | 欧美日韩免费在线视频 | 国产精品毛片一区二区三区 | 日本久久99| 4438全国亚洲精品观看视频 | 欧美日韩性视频在线 | www.av免费观看 | 伊人网av| 肉色欧美久久久久久久免费看 | 操操操日日日干干干 | 国产99久久久国产精品成人免费 | 2019中文字幕网站 | 亚洲经典精品 | 99精品久久99久久久久 | 欧美一级片在线观看视频 | 免费试看一区 | 国产精品男女啪啪 | 亚洲一区不卡视频 | 中文字幕在线久一本久 | 欧美一区二区三区免费观看 | 午夜视频在线观看一区二区三区 | 99久久婷婷国产 | 国产精品久久久久av | 中文字幕第一页在线 | 天堂久久电影网 | 亚洲精品国产自产拍在线观看 | 人人插人人搞 | 婷婷视频导航 | 91免费网站在线观看 | 国产精品国产三级国产不产一地 | 欧美黄色免费 | 成人免费毛片aaaaaa片 | 成人全视频免费观看在线看 | 欧美成人xxx | 久久久受www免费人成 | 国产永久网站 | 国产精品 久久 | 国产色中涩 | 国产精品久久久视频 | 欧美日韩一级视频 | 麻豆国产精品永久免费视频 | 欧美一级在线观看视频 | 久热久草在线 | 成人精品一区二区三区中文字幕 | 成人黄色毛片 | 99热播精品 | 青青看片 | 香蕉视频4aa | 国产精品一区二区三区四区在线观看 | 亚洲综合爱 | 久久五月婷婷丁香 | 国产精品久久9 | 狠狠躁日日躁狂躁夜夜躁av | 婷婷中文字幕在线观看 | 午夜精品久久久 | 日韩丝袜 | 精品视频区 | 激情欧美一区二区免费视频 | 超碰在线天天 | 99久久日韩精品免费热麻豆美女 | 午夜视频在线观看一区 | 成年人免费看片 | 91麻豆精品国产91久久久使用方法 | 欧美精品国产综合久久 | 欧美另类人妖 | 中文字幕欧美日韩va免费视频 | 精品国产一区二区三区在线观看 | 日日干激情五月 | 国产1区2区 | 国产精品久久av | 久国产在线播放 | 国产护士在线 | 久久8精品 | 成 人 黄 色视频免费播放 | 欧美一二三视频 | 久久97视频 | 精品国产乱码久久久久久三级人 | 四虎成人免费影院 | 久久黄色精品视频 | 夜色.com| 国产第一页在线播放 | 色大片免费看 | 日韩欧美一区二区不卡 | 久久综合之合合综合久久 | 丁香婷五月 | av福利第一导航 | a在线v| 成人黄在线观看 | 在线观看中文字幕视频 | 久久精品视频中文字幕 | 超碰在线最新网址 | 天天操天天干天天干 | 日日操操 | 奇米网网址 | 日韩av中文字幕在线免费观看 | 激情五月婷婷丁香 | 国产激情电影综合在线看 | av超碰免费在线 | 成人中文字幕在线观看 | 精品国产乱子伦一区二区 | 国产亚洲精品综合一区91 | 91成人精品一区在线播放69 | 狠狠色狠狠色综合日日小说 | 日韩电影在线观看一区二区三区 | 美国三级黄色大片 | av一级久久| 久久精品之 | 99r在线视频 | 久久天天躁夜夜躁狠狠85麻豆 | 欧美日韩视频在线观看一区二区 | 狠狠躁日日躁夜夜躁av | 国产黄色成人av | 中文字幕精品一区二区精品 | 亚洲无线视频 | 久久首页| 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 四虎影视8848dvd | 91超级碰| 欧美 日韩精品 | 国产精品2018| 亚洲国产精品va在线看黑人动漫 | 狠狠操综合网 | 樱空桃av| 国产成人精品一区二区三区福利 | 久草视频在线资源 | 美女精品在线 | 狠狠色丁香婷婷综合久小说久 | 国产精品免费久久久久影院仙踪林 | 国产精品一区二区久久精品 | 97视频在线观看播放 | 91视频久久久 | 91精品视频一区 | 五月婷婷久久综合 | 91精彩在线视频 | 五月导航 | 6080yy精品一区二区三区 | 久久超级碰视频 | 亚洲国产精品99久久久久久久久 | 国产手机视频在线播放 | 久久综合偷偷噜噜噜色 | 精品国产一区二区三区av性色 | 国产精品爽爽爽 | 亚洲成免费 | 成人黄色av免费在线观看 | 西西4444www大胆艺术 | 亚洲精品在线资源 | 久草在线最新 | 国产日韩精品一区二区三区在线 | 免费观看国产成人 | 亚洲高清视频在线观看免费 | 久久综合色综合88 | 日韩在线免费播放 | 国产在线观看国语版免费 | 亚洲精品乱码白浆高清久久久久久 | 国产成人精品三级 | 97超碰在线人人 | 久久不射电影院 | 国产精品免费看久久久8精臀av | 日本mv大片欧洲mv大片 | 中文字幕观看视频 | 2018亚洲男人天堂 | 久久九九网站 | 在线91视频| 国产精品免费观看在线 | 国产精品精品久久久久久 | 亚洲最新视频在线播放 | 欧美日韩在线观看视频 | 美女又爽又黄 | 91女人18片女毛片60分钟 | 麻豆极品| 国产视频网站在线观看 | 最近中文字幕 | 日日草天天干 | 探花视频在线观看 | 97精品国产97久久久久久春色 | 97人人澡人人爽人人模亚洲 | 性色av免费看 | 亚洲视频 在线观看 | 久久久国产精华液 | 91pony九色丨交换 | 五月婷婷一区二区三区 | 色狠狠综合天天综合综合 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 日本久久综合视频 | 国产一区播放 | 久久这里只有精品视频99 | 亚洲成人av在线 | 欧美精品中文 | 日日夜夜亚洲 | 国产 亚洲 欧美 在线 | 婷婷色综 | 国产一区二区免费在线观看 | 狠狠操操操 | 久久深夜福利免费观看 | 一区二区三区在线观看免费视频 | 国产91学生粉嫩喷水 | 国内精品久久久精品电影院 | 91在线播放综合 | 亚洲网站在线 | 久久人人爽人人爽 | 国产一区不卡在线 | 国产拍揄自揄精品视频麻豆 | 婷婷久久综合九色综合 | 99精品国产高清在线观看 | 久久精品一区八戒影视 | 精品国产乱码 | 国产在线观看一区 | 中文字幕一区二区三 | 91网页版免费观看 | 国产又粗又猛又黄又爽视频 | 精品一区二区视频 | 国产福利一区在线观看 | 91成熟丰满女人少妇 | 好看的国产精品视频 | 五月婷在线播放 | 三级视频片 | 国产一区在线不卡 | 狠狠操操操 | 天天色综合1 | 日韩精品国产一区 | 中文字幕色在线 | 欧美精品乱码久久久久久按摩 | 中文字幕av网站 | 黄色91在线| 一区二区三区四区精品 | 天天操天天操天天操天天 | 亚州欧美精品 | 成人a免费看 | 91一区啪爱嗯打偷拍欧美 | 91在线看视频 | 六月激情婷婷 | 日批在线观看 | 黄色看片 | 国产福利一区二区三区在线观看 | 四虎国产精品免费观看视频优播 | 69亚洲视频 | 91视频啊啊啊 | 日本爽妇网 | 亚洲电影图片小说 | 日韩h在线观看 | 国产精品99久久久久久久久久久久 | 97超碰在线久草超碰在线观看 | 国产精品毛片一区二区 | 国产精品无 | 亚洲精品国产精品国自产观看 | 午夜12点| 国产精品三级视频 | 能在线观看的日韩av | 日韩精品一区二区三区免费观看视频 | 免费观看v片在线观看 | 在线免费观看成人 | 日本在线视频一区二区三区 | 日韩理论在线观看 | 69av免费视频 | 91精品国产综合久久婷婷香蕉 | 国产精品久久精品国产 | 天天精品视频 | 国产在线播放观看 | 国产美女被啪进深处喷白浆视频 | 国产激情小视频在线观看 | 天天拍天天操 | 亚洲精品日韩av | 波多野结衣精品视频 | 国产黄色片在线免费观看 | 亚洲精品av中文字幕在线在线 | 黄色视屏免费在线观看 | 亚洲精品av中文字幕在线在线 | 97成人在线免费视频 | 精品在线免费视频 | 国产福利一区二区三区在线观看 | 99视频精品全部免费 在线 | 二区三区视频 | 日韩免费福利 | 久久成人18免费网站 | 精品视频| 久久久99精品免费观看乱色 | 天天操天天射天天爽 | 伊人在线视频 | 日韩最新理论电影 | 久久久精品 一区二区三区 国产99视频在线观看 | 免费观看一级 | 久久综合毛片 | 制服丝袜成人在线 | 欧美另类z0zx | 日韩av电影中文字幕在线观看 | 国内外成人在线 | 高清av网 | 99爱国产精品 | 欧美精品v国产精品v日韩精品 | 成年人免费观看在线视频 | 99久久久久久久久久 | 在线中文字幕网站 | 天天操天天色天天射 | 国产精品高清在线 | 精品亚洲免a | 69国产精品视频免费观看 | 精品国产区 | 国产福利av在线 | 国产剧情在线一区 | 开心激情综合网 | 91在线视频免费播放 | 91在线最新 | 久久久wwww| 久久精品看片 | 一级性生活片 | 91桃色视频 | 成人免费在线视频 | 国产性xxxx | 免费观看黄 | 在线观看成年人 | 在线免费观看黄 | 日韩有码第一页 | 国产精品成久久久久三级 | 亚洲黄色区| 欧美一区二区在线看 | 91在线看黄 | 成在线播放| 中文字幕精品一区 | 看黄色.com | 中文字幕日本在线观看 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 日韩av在线高清 | 人人草人 | 国产剧情一区二区 | 日韩在线观看视频一区二区三区 | 欧美色精品天天在线观看视频 | 亚洲欧美成aⅴ人在线观看 四虎在线观看 | 97超在线视频 | www.国产在线 | 国产亚洲精品久久久网站好莱 | 天天天综合 | 亚洲免费观看在线视频 | 精品在线一区二区 | 国产精品久久久久久久久久久久冷 | 97热视频| 中文字幕日韩国产 | 五月激情电影 | 免费看片成年人 | 麻花豆传媒一二三产区 | 91在线操 | 亚洲欧美在线综合 | www.亚洲黄 | 天天射天天爽 | 91精品国产麻豆国产自产影视 | 91夫妻视频 | 香蕉视频导航 | 日本99精品| 久久久久久久久久久精 | 久草网站在线观看 | 最近中文字幕完整视频高清1 | 西西www4444大胆在线 | 日韩中文字幕免费在线播放 | 四虎成人精品在永久免费 | 91av视频| 97精品在线视频 | 中文字幕久久网 | av在线播放网址 | 亚洲精品国产视频 | 五月婷婷综合久久 | 日本在线视频一区二区三区 | 不卡的一区二区三区 | 色噜噜日韩精品欧美一区二区 | 国内精品视频免费 | 久久国产精品一国产精品 | 2019天天干天天色 | 手机看国产毛片 | 久久爱导航 | 日韩网| av电影免费 | 久久久黄色 | av超碰免费在线 | 手机在线欧美 | 日日夜夜干 | 国产高清在线免费观看 | 国产69精品久久app免费版 | 色九九影院 | 久久精品一区二区三区四区 | 91看片在线播放 | 国产精品免费看久久久8精臀av | 中文字幕在线观看一区二区三区 | 色综合综合 | 亚洲视频 中文字幕 | 香蕉网在线播放 | 三级av中文字幕 | 一区二区精品视频 | 九九九九免费视频 | 天天射,天天干 | 国产精品亚洲精品 | 亚洲精品毛片一级91精品 | 夜夜摸夜夜爽 | 免费进去里的视频 | 国产a级片免费观看 | 波多野结衣电影一区二区三区 | 日本精品久久久久中文字幕5 | 一区二区观看 | 久久婷婷久久 | 超碰资源在线 | 久久免费视频这里只有精品 | 日韩小视频网站 | 久草视频免费在线观看 | 免费色网| 99在线国产 | 成年人免费在线播放 | 玖玖在线免费视频 | 婷婷日韩 | 精品国产区在线 | 日韩在线中文字幕视频 | 精品人妖videos欧美人妖 | 久草精品视频在线播放 | 国产第页 | 九九久久影院 | 久久伦理网| 91 在线视频| 国产高清在线观看 | 激情综合网五月婷婷 | 国产精品久久久久久69 | 青青草国产精品视频 | 99精品久久久久 | 中文字幕在线免费观看 | 欧美日韩在线观看一区二区三区 | 日韩二区精品 | 久久久免费 | 亚洲成a人片在线www | 人人添人人| 中文字幕在线网址 | 国产精品精品久久久久久 | 91欧美在线 | 久久视频网址 | 久久成人午夜 | 国产高清视频在线 | 中文字幕资源在线观看 | 中文字幕视频三区 | 一区二区不卡 | 久久96国产精品久久99软件 | 欧美一级片免费播放 | 国产不卡毛片 | 丁香花在线视频观看免费 | 久久99久久99精品免观看粉嫩 | 国产99一区视频免费 | 久久黄色免费 | 国产va在线 | 欧美另类xxx| 青青草国产精品 | 亚洲v精品 | 日本高清中文字幕有码在线 | 欧美日韩另类在线 | 免费一级黄色 | 国产精品男女视频 | 精品理论片 | 国产一区二区三区在线免费观看 | 五月亚洲综合 | 99久久99久久精品免费 | 免费日韩高清 | 人人爽爽人人 | av中文字幕第一页 | 麻豆国产精品视频 | 国产永久免费观看 | 日韩最新av | 人人舔人人舔 | 欧美a免费| 男女精品久久 | 四虎影视精品 | av在线网站免费观看 | 天天色天天爱天天射综合 | 91黄色免费看 | 美女视频a美女大全免费下载蜜臀 | 99视频久久 | 日韩在线免费视频观看 | 天天要夜夜操 | 99热精品久久 | 亚洲视频在线免费看 | av 一区二区三区四区 | www99精品 | 亚洲免费在线 | 久久久www | 亚洲精品伦理在线 | 国产黄免费看 | 亚洲精品免费看 | 99久久99久久| 日av免费 | 在线视频专区 | 中文字幕字幕中文 | www.五月天 | 日韩av女优视频 | 中文字幕在线影视资源 | 国产福利精品在线观看 | 国产专区视频在线观看 | 国产黄色美女 | 免费看黄在线网站 | 亚洲精品国产精品国自产 | 日韩一级成人av | 亚洲精品在线观看中文字幕 | 中文字幕精品www乱入免费视频 | 中文字幕在线日 | 91中文字幕一区 | 日韩在线观看精品 | 91香蕉视频污在线 | 日本少妇久久久 | 国产精品24小时在线观看 | 99久久婷婷国产精品综合 | 一本—道久久a久久精品蜜桃 | 97人人添人澡人人爽超碰动图 | 午夜成人免费电影 | 美女网站黄免费 | 欧美日产在线观看 | 国产精品免费一区二区 | 国产精品99久久久久久宅男 | 中文字幕人成人 | av中文天堂| 天天干夜夜爱 | 久草99| 91探花国产综合在线精品 | 黄色美女免费网站 | 一区二区不卡高清 | 91在线视频播放 | 激情网色| 亚洲国产精品久久久久 | 中文字幕一区二区在线播放 | 国产精品 日韩精品 | bbb搡bbb爽爽爽 | 天天干人人插 | 免费影视大全推荐 | 久久精品99国产精品酒店日本 | 国产一二三四在线观看视频 | 中文字幕一区二区三区四区久久 | 欧美日韩视频在线观看一区二区 | 91系列在线 | 99国产情侣在线播放 | 国产高清视频色在线www | 日韩一级片观看 | 亚洲激情综合网 | 日本丰满少妇免费一区 | 免费欧美高清视频 | 九九热99视频 | 国产高清精 | 亚洲激情六月 | 免费视频久久久久 | www.夜夜夜 | 日本黄色免费播放 | 日韩一区二区免费视频 | 国产永久免费高清在线观看视频 | 欧美精品一区二区蜜臀亚洲 | 91麻豆看国产在线紧急地址 | 亚洲国产视频在线 | 色婷婷骚婷婷 | 日本中文在线播放 | 天天色宗合 | 8090yy亚洲精品久久 | 高清有码中文字幕 | 在线观看一区视频 | 午夜视频在线观看一区二区 | 国产成人久久av977小说 | 99久久久久久 | 99综合久久 | 色偷偷男人的天堂av | 久久在线观看视频 |