python深度學習 卷積神經網路(mnist)

2021-09-11 23:35:48 字數 3873 閱讀 2666

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

import pylab

from pandas import dataframe, series

from keras import models, layers, optimizers, losses, metrics

from keras.utils.np_utils import to_categorical

model = models.sequential()

model.add(layers.conv2d(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))

model.add(layers.maxpooling2d((2, 2)))

model.add(layers.conv2d(64, (3, 3), activation='relu'))

model.add(layers.maxpooling2d((2, 2)))

model.add(layers.conv2d(64, (3, 3), activation='relu'))

#卷積神經網路接收形狀為(image_height, image_width, image_channels)的輸入張量(不包括批量維度)

#下一步是將最後的輸出張量[大小為(3, 3, 64)]輸入到乙個密集連線分類器網路中,即 dense 層的堆疊,你已經很熟悉了。這些分類器可以處理 1d 向量,而當前的輸出是 3d 張量。 首先,我們需要將 3d 輸出展平為 1d,然後在上面新增幾個 dense 層。

model.add(layers.flatten())#,在進入兩個 dense 層之前,形狀(3, 3, 64)的輸出被展平為形狀 (576,) 的 向量

model.add(layers.dense(64, activation='relu'))

model.add(layers.dense(10, activation='softmax'))

print(model.summary())

from keras.datasets import mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

train_images = train_images.reshape((60000, 28, 28, 1))

train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28, 28, 1))

test_images = test_images.astype('float32') / 255

train_labels = to_categorical(train_labels)

test_labels = to_categorical(test_labels)

model.compile(optimizer='rmsprop',

loss='categorical_crossentropy', metrics=['accuracy'])

model.fit(train_images, train_labels, epochs=5, batch_size=64)

test_loss, test_acc = model.evaluate(test_images, test_labels)

print(test_acc)

卷積運算

全連線層和卷積層的根本區別在於,dense 層從輸入特徵空間中學到的是全域性模式

(比如對於mnist數字,全域性模式就是涉及所有畫素的模式),而卷積層學到的是區域性模式(對於影象來說,就是在輸入影象的二維[3*3;5*5]小視窗中發現的模式)性質:1.平移不變性(translation invariant)。cnn在右下角學到某個模式後,它可以在任何地方識別這個模式,比如左上角。對於全連線網路,如果模式出現在新的位置,它只能重新學習這個模式。cnn在處理影象時,只需更少的訓練樣本就可以學到具有泛化能力的資料表示

2.模式的空間層次結構(spatial hierarchies of patterns)。第乙個卷積層將學習較小的區域性模式(比如邊緣),第二個卷積層將學習由第一層特徵組成的更大的模式,以此類推。cnn可以有效的學習越來越複雜、越來越抽象的視覺概念

影象:包含兩個空間軸(高度和寬度)和乙個深度軸(也叫通道軸)的3d張量,其卷積也叫特徵圖。rgb(height,width,3[3個顏色通道])

卷積運算從輸入特徵圖中提取圖塊,並對所有這些圖塊應用相同的變換,生成輸出特徵圖。也是乙個3d張量,但深度可以任意取值,因為輸出深度是層的引數,深度軸的不同通道代表過濾器[對輸入資料的某一方面進行編碼]卷積的工作原理:在 3d 輸入特徵圖上滑動(slide)這些 3×3 或 5×5 的視窗,在每個可能

的位置停止並提取周圍特徵的 3d 圖塊[形狀為 (window_height, window_width,

input_ depth)]。然後每個 3d 圖塊與學到的同乙個權重矩陣[叫作卷積核(

convolution kernel)]做 張量積,轉換成形狀為 (output_depth,) 的 1d

向量。然後對所有這些向量進行空間重組, 使其轉換為形狀為 (height, width,

output_depth) 的 3d 輸出特徵圖。輸出特徵圖中的 每個空間位置都對應於輸入特徵

圖中的相同位置(比如輸出的右下角包含了輸入右下角的資訊)

輸出特徵圖的寬度和高度可能與輸入的寬度和高度不同,原因:

1.邊界效應,可通過對輸入特徵圖進行填充來抵消

假設有乙個 5×5 的特徵圖(共 25 個方塊)。其中只有 9

個方塊可以作為中心放入乙個3×3 的視窗,這 9 個方塊形成乙個 3×3

的網格(見圖 5-5)。因此,輸出特徵圖的尺寸是 3×3。

如果你希望輸出特徵圖的空間維度與輸入相同,那麼可以使用填充(padding)。填充是在 輸入特徵圖的每一邊新增適當數目的行和列,使得每個輸入方塊都能作為卷積視窗的中心。對 於 3×3 的視窗,在左右各新增一列,在上下各新增一行。對於 5×5 的視窗,各新增兩行和兩 列(見圖 5-6)

對於 conv2d 層,可以通過 padding 引數來設定填充,這個引數有兩個取值:

"valid" 表 示不使用填充(只使用有效的視窗位置);"same"

表示「填充後輸出的寬度和高度與輸入相同」。 padding 引數的預設值為"valid"。

2.使用了步幅

兩個連續視窗的距離是卷積的乙個引數,叫作步幅,預設值為 1。也可

以使用步進卷積(strided convolution),即步幅大於 1 的卷積

步幅為 2 意味著特徵圖的寬度和高度都被做了 2 倍下取樣(除了邊界效應引

起的變化)但在實踐中很少使用

為了對特徵圖進行下取樣,我們不用步幅,而是通常使用最大池化(max-pooling)運算最大池化使用硬編碼的 max 張量運算對區域性圖塊進行變換,而不是使用學到的線性變換(卷 積核)。最大池化與卷積的最大不同之處在於,最大池化通常使用 2×2 的視窗和步幅 2,其目 的是將特徵圖下取樣 2 倍。與此相對的是,卷積通常使用 3×3 視窗和步幅 1。為什麼要用這種方式對特徵圖下取樣?為什麼不刪除最大池化層,一直保留較大的特徵圖?一是減少需要處理的特徵圖的元素個數,

二是通過讓連續 卷積層的觀察視窗越來越大(即視窗覆蓋原始輸入的比例越來越大),從而引入空間過濾器的層級結構。

我們需要讓最後乙個卷積層的特徵包含輸入的整體資訊

深度學習 卷積神經網路

一 卷積神經網路基礎 二 lenet 三 常見的一些卷積神經網路 卷積層的超引數 填充和步幅。步幅 stride 每次卷積核在輸入陣列上滑動的行數與列數。多輸入與輸出通道 將3維陣列除寬高外的一維稱為通道維。1 1卷積層 包含1 1的卷積核的卷積層。1 1卷積核在不改變輸入高寬的情況下調整通道數。如...

深度學習 卷積神經網路

卷積神經網路 convolutional neural networks,cnn 是一類包含卷積計算且具有深度結構的前饋神經網路 feedforward neural networks 是深度學習 deep learning 的代表演算法之一。卷積神經網路具有表徵學習 representation ...

深度學習之卷積神經網路

卷積神經網路是一種多層神經網路,擅長處理影象特別是大影象的相關機器學習問題。卷積網路通過一系列方法,成功將資料量龐大的影象識別問題不斷降維,最終使其能夠被訓練。cnn最早由yann lecun提出並應用在手寫字型識別上 minst lecun提出的網路稱為lenet,其網路結構如下 這是乙個最典型的...