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,其網路結構如下 這是乙個最典型的...