導航:首頁 > 編程語言 > python卷積函數

python卷積函數

發布時間:2023-06-29 05:56:57

❶ 怎樣用python構建一個卷積神經網路模型

上周末利用python簡單實現了一個卷積神經網路,只包含一個卷積層和一個maxpooling層,pooling層後面的多層神經網路採用了softmax形式的輸出。實驗輸入仍然採用MNIST圖像使用10個feature map時,卷積和pooling的結果分別如下所示。


部分源碼如下:

[python]view plain

❷ 怎樣用python構建一個卷積神經網路

用keras框架較為方便

首先安裝anaconda,然後通過pip安裝keras

❸ 如何用python實現圖像的一維高斯濾波器

如何用python實現圖像的一維高斯濾波器
現在把卷積模板中的值換一下,不是全1了,換成一組符合高斯分布的數值放在模板裡面,比如這時中間的數值最大,往兩邊走越來越小,構造一個小的高斯包。實現的函數為cv2.GaussianBlur()。對於高斯模板,我們需要制定的是高斯核的高和寬(奇數),沿x與y方向的標准差(如果只給x,y=x,如果都給0,那麼函數會自己計算)。高斯核可以有效的出去圖像的高斯雜訊。當然也可以自己構造高斯核,相關函數:cv2.GaussianKernel().
import cv2
import numpy as np
import matplotlib.pyplot as plt

img = cv2.imread(『flower.jpg『,0) #直接讀為灰度圖像
for i in range(2000): #添加點雜訊
temp_x = np.random.randint(0,img.shape[0])
temp_y = np.random.randint(0,img.shape[1])
img[temp_x][temp_y] = 255
blur = cv2.GaussianBlur(img,(5,5),0)
plt.subplot(1,2,1),plt.imshow(img,『gray『)#默認彩色,另一種彩色bgr
plt.subplot(1,2,2),plt.imshow(blur,『gray『)

❹ 利用Python實現卷積神經網路的可視化

在本文中,將探討如何可視化卷積神經網路(CNN),該網路在計算機視覺中使用最為廣泛。首先了解CNN模型可視化的重要性,其次介紹可視化的幾種方法,同時以一個用例幫助讀者更好地理解模型可視化這一概念。

正如上文中介紹的癌症腫瘤診斷案例所看到的,研究人員需要對所設計模型的工作原理及其功能掌握清楚,這點至關重要。一般而言,一名深度學習研究者應該記住以下幾點:

1.1 理解模型是如何工作的

1.2 調整模型的參數

1.3 找出模型失敗的原因

1.4 向消費者/終端用戶或業務主管解釋模型做出的決定

2.可視化CNN模型的方法

根據其內部的工作原理,大體上可以將CNN可視化方法分為以下三類:

初步方法:一種顯示訓練模型整體結構的簡單方法

基於激活的方法:對單個或一組神經元的激活狀態進行破譯以了解其工作過程

基於梯度的方法:在訓練過程中操作前向傳播和後向傳播形成的梯度

下面將具體介紹以上三種方法,所舉例子是使用Keras深度學習庫實現,另外本文使用的數據集是由「識別數字」競賽提供。因此,讀者想復現文中案例時,請確保安裝好Kears以及執行了這些步驟。

研究者能做的最簡單的事情就是繪制出模型結構圖,此外還可以標注神經網路中每層的形狀及參數。在keras中,可以使用如下命令完成模型結構圖的繪制:

model.summary()_________________________________________________________________Layer (type)                 Output Shape              Param #  

=================================================================conv2d_1 (Conv2D)            (None, 26, 26, 32)        320_________________________________________________________________conv2d_2 (Conv2D)            (None, 24, 24, 64)        18496_________________________________________________________________max_pooling2d_1 (MaxPooling2 (None, 12, 12, 64)        0_________________________________________________________________dropout_1 (Dropout)          (None, 12, 12, 64)        0_________________________________________________________________flatten_1 (Flatten)          (None, 9216)              0_________________________________________________________________dense_1 (Dense)              (None, 128)               1179776_________________________________________________________________dropout_2 (Dropout)          (None, 128)               0_________________________________________________________________preds (Dense)                (None, 10)                1290      

=================================================================Total params: 1,199,882Trainable params: 1,199,882Non-trainable params: 0

還可以用一個更富有創造力和表現力的方式呈現模型結構框圖,可以使用keras.utils.vis_utils函數完成模型體系結構圖的繪制。

另一種方法是繪制訓練模型的過濾器,這樣就可以了解這些過濾器的表現形式。例如,第一層的第一個過濾器看起來像:

top_layer = model.layers[0]plt.imshow(top_layer.get_weights()[0][:, :, :, 0].squeeze(), cmap='gray')

一般來說,神經網路的底層主要是作為邊緣檢測器,當層數變深時,過濾器能夠捕捉更加抽象的概念,比如人臉等。

為了理解神經網路的工作過程,可以在輸入圖像上應用過濾器,然後繪制其卷積後的輸出,這使得我們能夠理解一個過濾器其特定的激活模式是什麼。比如,下圖是一個人臉過濾器,當輸入圖像是人臉圖像時候,它就會被激活。

from vis.visualization import visualize_activation

from vis.utils import utils

from keras import activations

from matplotlib import pyplot as plt

%matplotlib inline

plt.rcParams['figure.figsize'] = (18, 6)

# Utility to search for layer index by name.

# Alternatively we can specify this as -1 since it corresponds to the last layer.

layer_idx = utils.find_layer_idx(model, 'preds')

# Swap softmax with linear

model.layers[layer_idx].activation = activations.linear

model = utils.apply_modifications(model)

# This is the output node we want to maximize.filter_idx = 0

img = visualize_activation(model, layer_idx, filter_indices=filter_idx)

plt.imshow(img[..., 0])

同理,可以將這個想法應用於所有的類別,並檢查它們的模式會是什麼樣子。

for output_idx in np.arange(10):

  # Lets turn off verbose output this time to avoid clutter and just see the output.

  img = visualize_activation(model, layer_idx, filter_indices=output_idx, input_range=(0., 1.))

  plt.figure()

  plt.title('Networks perception of {}'.format(output_idx))

  plt.imshow(img[..., 0])

在圖像分類問題中,可能會遇到目標物體被遮擋,有時候只有物體的一小部分可見的情況。基於圖像遮擋的方法是通過一個灰色正方形系統地輸入圖像的不同部分並監視分類器的輸出。這些例子清楚地表明模型在場景中定位對象時,若對象被遮擋,其分類正確的概率顯著降低。

為了理解這一概念,可以從數據集中隨機抽取圖像,並嘗試繪制該圖的熱圖(heatmap)。這使得我們直觀地了解圖像的哪些部分對於該模型而言的重要性,以便對實際類別進行明確的區分。

def iter_occlusion(image, size=8):

    # taken from https://www.kaggle.com/blargl/simple-occlusion-and-saliency-maps

  occlusion = np.full((size * 5, size * 5, 1), [0.5], np.float32)

  occlusion_center = np.full((size, size, 1), [0.5], np.float32)

  occlusion_padding = size * 2

  # print('padding...')

  image_padded = np.pad(image, ( \  (occlusion_padding, occlusion_padding), (occlusion_padding, occlusion_padding), (0, 0) \  ), 'constant', constant_values = 0.0)

  for y in range(occlusion_padding, image.shape[0] + occlusion_padding, size):

      for x in range(occlusion_padding, image.shape[1] + occlusion_padding, size):

          tmp = image_padded.()

          tmp[y - occlusion_padding:y + occlusion_center.shape[0] + occlusion_padding, \

            x - occlusion_padding:x + occlusion_center.shape[1] + occlusion_padding] \            = occlusion

          tmp[y:y + occlusion_center.shape[0], x:x + occlusion_center.shape[1]] = occlusion_center          yield x - occlusion_padding, y - occlusion_padding, \

            tmp[occlusion_padding:tmp.shape[0] - occlusion_padding, occlusion_padding:tmp.shape[1] - occlusion_padding]i = 23 # for exampledata = val_x[i]correct_class = np.argmax(val_y[i])

# input tensor for model.predictinp = data.reshape(1, 28, 28, 1)# image data for matplotlib's imshowimg = data.reshape(28, 28)

# occlusionimg_size = img.shape[0]

occlusion_size = 4print('occluding...')heatmap = np.zeros((img_size, img_size), np.float32)class_pixels = np.zeros((img_size, img_size), np.int16)

from collections import defaultdict

counters = defaultdict(int)for n, (x, y, img_float) in enumerate(iter_occlusion(data, size=occlusion_size)):

    X = img_float.reshape(1, 28, 28, 1)

    out = model.predict(X)

    #print('#{}: {} @ {} (correct class: {})'.format(n, np.argmax(out), np.amax(out), out[0][correct_class]))

    #print('x {} - {} | y {} - {}'.format(x, x + occlusion_size, y, y + occlusion_size))

    heatmap[y:y + occlusion_size, x:x + occlusion_size] = out[0][correct_class]

    class_pixels[y:y + occlusion_size, x:x + occlusion_size] = np.argmax(out)

    counters[np.argmax(out)] += 1

正如之前的坦克案例中看到的那樣,怎麼才能知道模型側重於哪部分的預測呢?為此,可以使用顯著圖解決這個問題。顯著圖首先在這篇文章中被介紹。

使用顯著圖的概念相當直接——計算輸出類別相對於輸入圖像的梯度。這應該告訴我們輸出類別值對於輸入圖像像素中的微小變化是怎樣變化的。梯度中的所有正值告訴我們,像素的一個小變化會增加輸出值。因此,將這些梯度可視化可以提供一些直觀的信息,這種方法突出了對輸出貢獻最大的顯著圖像區域。

class_idx = 0indices = np.where(val_y[:, class_idx] == 1.)[0]

# pick some random input from here.idx = indices[0]

# Lets sanity check the picked image.from matplotlib import pyplot as plt%matplotlib inline

plt.rcParams['figure.figsize'] = (18, 6)plt.imshow(val_x[idx][..., 0])

from vis.visualization import visualize_saliency

from vis.utils import utilsfrom keras import activations# Utility to search for layer index by name.

# Alternatively we can specify this as -1 since it corresponds to the last layer.

layer_idx = utils.find_layer_idx(model, 'preds')

# Swap softmax with linearmodel.layers[layer_idx].activation = activations.linear

model = utils.apply_modifications(model)grads = visualize_saliency(model, layer_idx, filter_indices=class_idx, seed_input=val_x[idx])

# Plot with 'jet' colormap to visualize as a heatmap.plt.imshow(grads, cmap='jet')

# This corresponds to the Dense linear layer.for class_idx in np.arange(10):

    indices = np.where(val_y[:, class_idx] == 1.)[0]

    idx = indices[0]

    f, ax = plt.subplots(1, 4)

    ax[0].imshow(val_x[idx][..., 0])

    for i, modifier in enumerate([None, 'guided', 'relu']):

        grads = visualize_saliency(model, layer_idx, filter_indices=class_idx,

        seed_input=val_x[idx], backprop_modifier=modifier)

        if modifier is None:

            modifier = 'vanilla'

        ax[i+1].set_title(modifier)

        ax[i+1].imshow(grads, cmap='jet')

類別激活映射(CAM)或grad-CAM是另外一種可視化模型的方法,這種方法使用的不是梯度的輸出值,而是使用倒數第二個卷積層的輸出,這樣做是為了利用存儲在倒數第二層的空間信息。

from vis.visualization import visualize_cam

# This corresponds to the Dense linear layer.for class_idx in np.arange(10):

indices = np.where(val_y[:, class_idx] == 1.)[0]

idx = indices[0]f, ax = plt.subplots(1, 4)

ax[0].imshow(val_x[idx][..., 0])

for i, modifier in enumerate([None, 'guided', 'relu']):

    grads = visualize_cam(model, layer_idx, filter_indices=class_idx,

    seed_input=val_x[idx], backprop_modifier=modifier)

    if modifier is None:

        modifier = 'vanilla'

    ax[i+1].set_title(modifier)

    ax[i+1].imshow(grads, cmap='jet')

本文簡單說明了CNN模型可視化的重要性,以及介紹了一些可視化CNN網路模型的方法,希望對讀者有所幫助,使其能夠在後續深度學習應用中構建更好的模型。 免費視頻教程:www.mlxs.top

❺ 使用python在GPU上構建和訓練卷積神經網路

我將對代碼進行補充演練,以構建在數據集上訓練的任何類型的圖像分類器。在這個例子中,我將使用花卉數據集,其中包括102種不同類型的花。需要數據集和代碼都可以私信我。

Pytorch是機器學習和Python上的免費軟體包,非常易於使用。語法模擬numpy,因此,如果你在python中有一些科學計算經驗,那麼會相當有用的。賀寬只需幾行代碼,就可以下載預先訓練的數據集,使用定義的變換對圖像進叢襲行標准化,然後運行訓練。

創建和擴充數據集

為了增加數據集,我使用' google_images_download'API 從互聯網上下載了相關圖像。顯然,您可以使用此API不僅可以擴充現有數據集,還可以從頭開始創建自己的數據集。

確保從圖像中挑選出異常值(損壞的文件或偶然出現的無關圖像)。

圖像標准化

為了使圖像具有相同的大小和像素變化,可以使用pytorch的transfors模塊:

轉移學習

從頭開始訓練的模型可能不是最明智的選擇,因為有許多網路可用於各種數據集。簡單地說,像edge-和其他簡單形狀檢測器等低級特徵對於不同的模型是相似的,即使clasificators是針對不同目的進行訓練的。在本項目中,我使用了一個預訓練網路Resnet152,只有最後一個完全連接的層重新用於新任務,即使這樣也會產生相當好的效果。

在這里,我將除最後一層之外的所有層都設置為具有固定權重(requires_grad = False),因此只有最後層中的參數將通過梯度下降進行更新。

訓練模型

下面介紹一下進行訓練的函數:

如何獲得GPU?

當然,對CPU的訓練太慢了。根據我自己的經驗,在GPU僅需要一個小時就可以完成12次訓練周期,但是在CPU上相同數量的訓練周期可能需要花費大約15個小時。

如果您沒有本地可用的GPU,則可以考慮使用雲GPU。為了加速禪鄭亮CNN的訓練,我使用了floydhub(www.floydhub.com)上提供的雲GPU 。

這項服務非常指的使用:總有很好的文檔和大量的提示,所以你會很清楚的知道下一步需要如何去做。在floydhub上對於使用GPU的收費也是可以接受的。

首先,需要將數據集上傳到伺服器

然後,需要創建項目。需要在計算機上安裝floydhub客戶端,將數據集上載到其網站並在終端中運行以下命令:

其中'username'是您的登錄名,'i'是數據集所在的文件夾

這樣子在訓練網路時就會很輕鬆了

結果和改進想法

得到的模型在數據集上訓練了1.5小時,並在驗證數據集上達到了95%的准確度。

❻ python 矩陣 匹配 求助

在 Python 中,可以使用 NumPy 庫來解決這個問題。
首先,需要將矩陣 A、n1、n2 作為 NumPy 數組讀入內存。例如:
import numpy as np

A = np.array([
[1, 2, 3, 4],
[5, 6, 7, 8],
[9, 10, 11, 12]
])

n1 = np.array([
[1, 2],
[5, 6]
])

n2 = np.array([
[3, 4],
[7, 8]
])

接下來,可以使用 NumPy 的 correlate2d() 函數,將矩陣 A 與 n1 或 n2 進行二維卷積,並查看結果是否為非零值。例如:鏈臘春
result1 = np.correlate2d(A, n1)
result2 = np.correlate2d(A, n2)if np.any(result1): print('n1 在 A 中有對應的位置')else: print('n1 在 A 中沒有對應的位置')if np.any(result2): print('n2 在 A 中有對應的位置')else: print('n2 在 A 中沒有對應的位置')

如果矩陣 A 中包含 n1 或 n2,棚耐則上面的程序會輸出 "n1 在 A 中有對應的位置" 或 "n2 在 A 中有對應的位置"。
下面的程序中,我們使用了 NumPy 的 nonzero() 函數來找到結果矩陣中的非零值的位置,並將這些位置列印出來。
result1 = np.correlate2d(A, n1)
result2 = np.correlate2d(A, n2)

if np.any(result1): print('n1 在 A 中有對應的位置:') print(np.nonzero(result1))
else: print('n1 在 A 中沒有對應的位置')

if np.any(result2): print('n2 在 A 中有對應的位局凳置:') print(np.nonzero(result2))
else: print('n2 在 A 中沒有對應的位置')

運行上面的程序,如果 A、n1、n2 的值為上面的值,則會輸出如下內容:
n1 在 A 中有對應的位置:
(array([0]), array([0]))
n2 在 A 中沒有對應的位置

這表示,n1 在矩陣 A 的第 (0, 0) 位置有對應的位置,而 n2 在矩陣 A 中沒有對應的位置。
希望這些信息能幫助你理解並實現演算法

❼ Python 用Keras訓練卷積網路,提取的特徵,如何保存,代碼如下

可以用

np.savez('xxx.npz',train_labels=train_labels)

載入時用

np.load('xxx.npz')
閱讀全文

與python卷積函數相關的資料

熱點內容
安卓手機電話簿怎麼導出到蘋果手機 瀏覽:757
php實現投票 瀏覽:331
手機爆力解壓加密視頻文件 瀏覽:930
東方財富app怎麼看北上資金圖解 瀏覽:416
邢昭林程序員那麼可愛拍現場 瀏覽:169
安卓什麼應用可以免費看電視劇 瀏覽:504
合適pdf 瀏覽:293
app監測睡眠怎麼選擇 瀏覽:642
老人家用什麼安卓手機好 瀏覽:955
解壓包能不能送女朋友 瀏覽:701
好看發卡網源碼 瀏覽:51
水平集演算法matlab 瀏覽:768
區域網如何用ftp伺服器配置 瀏覽:72
程序員慣性思考模式 瀏覽:441
如何在個稅app上查身份證號 瀏覽:6
電視家app安裝在電視上怎麼安 瀏覽:889
怎麼將pdf格式轉化為圖片格式 瀏覽:638
伺服器拔掉raid卡怎麼裝系統 瀏覽:233
區域對稱加密演算法 瀏覽:247
數字轉漢字php 瀏覽:735