乾貨分享|使用JAX創建神經網絡的對抗性示例(附詳細代碼)

2020-12-22 人工智慧研究院

在本教程中,我們將看到如何創建使用JAX訓練神經網絡的對抗示例。

首先,讓我們看一些定義。有哪些例子?簡而言之,對抗性示例是神經網絡的輸入,這些輸入經過優化以欺騙算法,即導致目標變量分類錯誤。通過向目標變量添加「適當的」噪聲,我們可以對目標變量進行錯誤分類。下圖演示了該概念。

本教程的重點是演示如何創建對抗示例。我們將使用快速梯度符號法生成

在這種方法中,如果x是輸入圖像,我們將x修改為

其中對抗輸入是通過輸入輸入圖像x的交叉熵損失的梯度的符號並將其添加到原始圖像而獲得的。ε是此處的超參數。

在本教程中,我們將使用流行的MNIST數據集。如果您不知道什麼是MNIST數據集,建議轉到以下連結。

為了訓練我們的模型並生成對抗示例,我們將使用JAX模塊。JAX是自動差分(AD)工具箱,在訓練大規模數據集(如MNIST)時非常方便。有人恰當地將JAX描述為類固醇的Numpy!因為這不是「 JAX入門」教程,所以不會對其進行更深入的研究。

現在讓我們開始進行編碼。

我提供的代碼是基於以下GitHub存儲庫構建的。進行了必要的更改,並添加了一些新功能以使其適合手邊的應用程式。

首先,我們將導入所有重要的庫。

import array

import gzip

import itertools

import numpy

import numpy.random as npr

import os

import struct

import time

from os import path

import urllib.request

import jax.numpy as np

from jax.api import jit, grad

from jax.config import config

from jax.scipy.special import logsumexp

from jax import random

import matplotlib.pyplot as plt

接下來,我們將下載並加載MNIST數據。

_DATA = "/tmp/"

def _download(url, filename):

"""Download a url to a file in the JAX data temp directory."""

if not path.exists(_DATA):

os.makedirs(_DATA)

out_file = path.join(_DATA, filename)

if not path.isfile(out_file):

urllib.request.urlretrieve(url, out_file)

print("downloaded {} to {}".format(url, _DATA))

def _partial_flatten(x):

"""Flatten all but the first dimension of an ndarray."""

return numpy.reshape(x, (x.shape[0], -1))

def _one_hot(x, k, dtype=numpy.float32):

"""Create a one-hot encoding of x of size k."""

return numpy.array(x[:, None] == numpy.arange(k), dtype)

def mnist_raw():

"""Download and parse the raw MNIST dataset."""

# CVDF mirror of http://yann.lecun.com/exdb/mnist/

base_url = "https://storage.googleapis.com/cvdf-datasets/mnist/"

def parse_labels(filename):

with gzip.open(filename, "rb") as fh:

_ = struct.unpack(">II", fh.read(8))

return numpy.array(array.array("B", fh.read()), dtype=numpy.uint8)

def parse_images(filename):

_, num_data, rows, cols = struct.unpack(">IIII", fh.read(16))

return numpy.array(array.array("B", fh.read()),

dtype=numpy.uint8).reshape(num_data, rows, cols)

for filename in ["train-images-idx3-ubyte.gz", "train-labels-idx1-ubyte.gz",

"t10k-images-idx3-ubyte.gz", "t10k-labels-idx1-ubyte.gz"]:

_download(base_url + filename, filename)

train_images = parse_images(path.join(_DATA, "train-images-idx3-ubyte.gz"))

train_labels = parse_labels(path.join(_DATA, "train-labels-idx1-ubyte.gz"))

test_images = parse_images(path.join(_DATA, "t10k-images-idx3-ubyte.gz"))

test_labels = parse_labels(path.join(_DATA, "t10k-labels-idx1-ubyte.gz"))

return train_images, train_labels, test_images, test_labels

def mnist(create_outliers=False):

"""Download, parse and process MNIST data to unit scale and one-hot labels."""

train_images, train_labels, test_images, test_labels = mnist_raw()

train_images = _partial_flatten(train_images) / numpy.float32(255.)

test_images = _partial_flatten(test_images) / numpy.float32(255.)

train_labels = _one_hot(train_labels, 10)

test_labels = _one_hot(test_labels, 10)

if create_outliers:

mum_outliers = 30000

perm = numpy.random.RandomState(0).permutation(mum_outliers)

train_images[:mum_outliers] = train_images[:mum_outliers][perm]

def shape_as_image(images, labels, dummy_dim=False):

target_shape = (-1, 1, 28, 28, 1) if dummy_dim else (-1, 28, 28, 1)

return np.reshape(images, target_shape), labels

train_images, train_labels, test_images, test_labels = mnist(create_outliers=False)

num_train = train_images.shape[0]

現在,我們將定義一個函數,該函數將通過遍歷其所有層,獲取輸入/上一層的激活並應用tanh激活來計算其全連接神經網絡的輸出。

請記住,對於我們使用的輸出,z =wx+ b

def predict(params, inputs):

activations = inputs

for w, b in params[:-1]:

outputs = np.dot(activations, w) + b

activations = np.tanh(outputs)

final_w, final_b = params[-1]

logits = np.dot(activations, final_w) + final_b

return logits - logsumexp(logits, axis=1, keepdims=True)

在本教程中,我們將使用交叉熵損失。以下函數將使我們損失模型。

# loss function for calculating predictions and accuracy before pertubation

def loss(params, batch, test=0):

inputs, targets = batch

logits = predict(params, inputs)

preds = stax.logsoftmax(logits)

if(test==1):

print('Prediction Vector before softmax')

print(logits)

print("____________________________________________________________________________________")

print('Prediction Vector after softmax')

print(preds)

return -(1/(preds.shape[0]))*np.sum(targets*preds)

# loss function for calculating gradients of loss w.r.t. input image

def lo(batch,params):

以下單元格定義了模型的準確性以及如何初始化其參數。

def accuracy(params, batch):

target_class = np.argmax(targets, axis=1)

predicted_class = np.argmax(predict(params, inputs), axis=1)

return np.mean(predicted_class == target_class), target_class, predicted_class

現在,我們必須生成一批訓練數據。為此,我們將為數據集創建一個Python生成器。它一次輸出一批n個訓練示例。

batch_size = 128

num_complete_batches, leftover = divmod(num_train, batch_size)

num_batches = num_complete_batches + bool(leftover)

def data_stream():

rng = npr.RandomState(0)

whileTrue:

perm = rng.permutation(num_train)

for i in range(num_batches):

batch_idx = perm[i * batch_size:(i + 1) * batch_size]

yield train_images[batch_idx], train_labels[batch_idx]

batches = data_stream()

接下來,我們的工作是使用'stax'創建一個完全連接的神經網絡體系結構。Stax是一個神經網絡規範庫。在這裡,我們將詳細介紹卷積神經網絡中各層的規範。

init_random_params, predict = stax.serial(

stax.Conv(64, (7,7), padding='SAME'),

stax.Relu,

stax.Conv(32, (4, 4), padding='SAME'),

stax.MaxPool((3, 3)),

stax.Flatten,

stax.Dense(128),

stax.Dense(10),

)

現在,我們必須定義迷你批處理SGD優化器。優化器為我們提供了3件事。

1]方法opt_init,它接受init_fun返回的一組初始參數值,並返回初始優化器狀態opt_state,

2]一種方法opt_update,它採用梯度和參數並通過應用一個優化步驟來更新優化器狀態,並且

3]方法get_params進入優化器狀態並返回當前參數值。

learning_rate = 0.14

opt_init, opt_update, get_params = optimizers.sgd(learning_rate)

@jit

def update(_, i, opt_state, batch):

params = get_params(opt_state)

return opt_update(i, grad(loss)(params, batch), opt_state)

接下來,我們將在訓練示例中訓練我們的模型。在訓練結束時,我們將獲得「參數」,我們將使用這些「參數」來計算測試圖像的損失函數的梯度。

num_epochs = 1

key = random.PRNGKey(123)

_, init_params = init_random_params(key, (-1, 28, 28, 1))

opt_state = opt_init(init_params)

itercount = itertools.count()

for _ in range(num_batches):

opt_state= update(key, next(itercount), opt_state, shape_as_image(*next(batches)))

params = get_params(opt_state)

最後,我們定義函數,該函數將通過測試輸入返回損耗函數的梯度。另外,此函數將計算測試損失並預測目標變量的類別。

# This function calculates, loss, predictions and gradients

def covnet(t,params):

test_acc,target_class, predicted_class = accuracy(params, shape_as_image(test_images, test_labels))

test_loss = loss(params, shape_as_image(test_images, test_labels),test=t)

grads = grad(lo)(shape_as_image(test_images, test_labels),params)

if(t==1):

print('Test set loss, accuracy (%): ({:.2f}, {:.2f})'.format(test_loss, 100 * test_acc))

print('predicted_class,target_class', predicted_class,target_class)

return grads, test_acc

現在是時候測試我們的模型了。

首先,讓我們接受一個測試輸入。在這裡,我們選擇屬於「 7」類的圖像

讓我們可視化原始圖像。

def display(image):

img = image[0].reshape((28,28))

plt.imshow(img, cmap="Greys")

plt.show()

return

display(a)

上面的代碼為我們提供了以下輸出。

讓我們看看我們訓練有素的模型是否可以預測此圖像的準確分類。

# load desired image and its label in test set

def load_img(image,img_label):

img = np.array(image)

img = img.reshape(1,784)

label = np.array(img_label)

label = label.reshape(1,10)

return img, label

img, label = load_img(test_images[0],test_labels[0])

test_images = img

test_labels = label

#Predictions Before Pertubation

grads,acc = covnet(1,params)

運行上面的代碼後,我們得到以下輸出。

我們看到我們的模型已經正確預測了輸入圖像的類別。

相關焦點

  • 新星JAX:有望擔綱Google主要科學計算庫和神經網絡庫
    除了允許JAX將python + numpy代碼轉換為可以在加速器上運行的操作(如我們在第一個示例中看到的那樣)之外,XLA還允許JAX將幾個操作融合到一起。它在計算圖中尋找節點的簇,以減少計算或變量的中間存儲。Tensorflow關於XLA的文檔中,使用下面的例子來解釋會從XLA編譯中受益的實例。
  • 【乾貨】圖神經網絡的十大學習資源分享
    字幕組雙語原文:【乾貨】圖神經網絡的十大學習資源分享英語原文:Top 10 Learning Resources for Graph Neural Networks>翻譯:雷鋒字幕組(聽風1996)圖神經網絡(GNNs)是深度學習的一個相對較新的領域,從最近開始越來越流行。
  • 深度神經網絡,通過使用數學模型來處理圖像
    打開APP 深度神經網絡,通過使用數學模型來處理圖像 新經網 發表於 2020-12-16 10:22:58   休斯頓大學的一位哲學家在發表於《自然機器智能》上的一篇論文中暗示,關於這些假定故障背後原因的普遍假設可能是錯誤的,這些信息對於評估這些網絡的可靠性至關重要。   隨著機器學習和其他形式的人工智慧越來越深入地融入社會,從自動櫃員機到網絡安全系統,其用途廣泛,UH哲學副教授卡梅倫·巴克納(Cameron Buckner)表示,了解由什麼導致的明顯故障的來源至關重要。
  • 模仿人腦視覺處理,助力神經網絡應對對抗性樣本
    今天,深度神經網絡已經成為許多計算機視覺應用的關鍵組成部分,從照片和視頻編輯器到醫療軟體和自動駕駛汽車。神經網絡大致模仿了大腦的結構,已經更接近於像人類一樣看待世界。但是它們還有很長的路要走,而且它們在人類永遠不會犯錯的情況下也會犯錯。這些情況,通常被稱為對抗性樣本,以令人困惑的方式改變了人工智慧模型的行為。對抗性的機器學習是當前人工智慧系統的最大挑戰之一。
  • 什麼是人工神經網絡(ANN)?
    同樣,對於圖像分類器網絡,當您使用質量示例訓練AI模型時,每一層都會檢測到特定的特徵類別。例如,第一層可能檢測到水平和垂直邊緣,第二層可能檢測到拐角和圓形。在網絡的更深處,更深的層次將開始挑選出更高級的功能,例如面部和物體。神經網絡的每一層都將從輸入圖像中提取特定特徵。
  • 如何教神經網絡玩 21 點遊戲(附代碼)?
    其代碼與上一次類似,因此我不會在這裡給出詳細的概述(你也可以在我的 github 上找到它)。其主要特點是:莊家的正面卡(另一張隱藏起來)。玩家手上牌的總值。玩家是否有王牌。玩家的動作(拿牌或不動)。目標變量是由上述邏輯定義的正確決策。
  • 圖神經網絡的十大學習資源分享
    字幕組雙語原文:【乾貨】圖神經網絡的十大學習資源分享英語原文:Top 10 Learning Resources for Graph Neural Networks翻譯:雷鋒字幕組(聽風1996)圖神經網絡(GNNs)是深度學習的一個相對較新的領域,從最近開始越來越流行。
  • Jax 生態再添新庫:DeepMind 開源 Haiku、RLax
    hk.transform 則負責將面向對象的模塊轉換為純粹的函數式代碼,然後讓 jax 中的 jax.jit, jax.grad, jax.pmap 等進行處理,從而實現和 Jax 組件的兼容。
  • 【乾貨】用神經網絡識別歌曲流派(附代碼)、國外首提「千腦智力理論」或顛覆AI:理解人類新大腦皮層
    MFCC值將被直接輸入神經網絡。讓我們用兩個例子來說明MFCC。請通過Stereo Surgeon下載Kick Loop 5[2]和Whistling[3]。其中一個是低音鼓聲,另一個是高音口哨聲。它們明顯不同,你可以看到它們的MFCC數值是不同的。讓我們轉到代碼(本文的所有代碼文件都可以在Github連結中找到)。
  • Python, C++和Java代碼互翻,Facebook開發首個自監督神經編譯器
    COBOL如今仍在全球大型的系統中廣泛使用,因此公司,政府和其他組織通常必須選擇是手動翻譯其代碼庫還是盡力維護使用這個可追溯到1950年代的程序代碼。FaceBook公司開發了一個工具TransCoder,這是一個完全自我監督的神經編譯器系統,它可以使代碼遷移變得更加輕鬆和高效。
  • 乾貨|如何創建Facebook Pixel像素代碼
    什麼是FacebookPixel像素代碼FacebookPixel像素代碼是一種分析工具,設置FacebookPixel像素代碼後,當用戶在您的網站上執行操作時將觸發該Pixel像素代碼。執行的操作示例包括向購物車中添加商品或完成購買。
  • 圖神經網絡最新發展
    卷積神經網絡(Convolutional Neural Network,CNN)和圖神經網絡(Graph Neural Network,GNN)的主要區別是什麼?簡單來說,就是輸入數據。你可能還記得,CNN 所需的輸入是一個固定大小的向量或矩陣。然而,某些類型的數據自然是用圖表示的,如分子、引用網絡或社交媒體連接網絡都可以用圖數據來表示。
  • 神經網絡篇——從代碼出發理解BP神經網絡
    一提到反向傳播算法,我們就不自覺的想到隨機梯度下降、sigmoid激活函數和最讓人頭大的反向傳播法則的推導,即便是把反向傳播神經網絡的原理學了一遍,也還是一頭霧水,在這裡推薦一本小編認為把BP神經網絡講的最通透的教材《Python神經網絡編程》。
  • 使用深度神經網絡LSTM做股票指數及趨勢預測
    深度神經網絡能夠自動挖掘有助於正確預測目標的影響因子,其在金融領域的應用有著讓人憧憬的前景。 本文使用深度神經網絡LSTM分別對滬深300指數的指數值及其漲跌趨勢進行預測,預測指數值時使用開盤價、收盤價、最高價、最低價、成交量、成交金額信息,預測漲跌時使用了宏觀經濟景氣指數、全國工業企業主要經濟指標等宏觀經濟信息,從結果來看,預測效果還是比較不錯的。
  • 英偉達的研究人員創造了一種增強方法來訓練生成對抗性網絡
    打開APP 英偉達的研究人員創造了一種增強方法來訓練生成對抗性網絡 大數據文摘 發表於 2020-12-23 10:17:25
  • 用TensorFlow基於神經網絡實現井字棋(含代碼)
    為了展示如何應用神經網絡算法模型,我們將使用神經網絡來學習優化井字棋(Tic Tac Toe)。
  • 人工智慧學習之什麼是人工神經網絡?
    單個「隱藏」層神經網絡的基本結構就像漁網的結構一樣,神經網絡的一個單層使用鏈將處理節點連接在一起。大量的連接使這些節點之間的通信得到增強,從而提高了準確性和數據處理吞吐量。然後,人工神經網絡將許多這樣的層相互疊放以分析數據,從而創建從第一層到最後一層的輸入和輸出數據流。
  • 使用IntelliJ IDEA創建Spring Boot項目
    在上一篇使用Spring Initializer創建Spring Boot項目 文章中,介紹了使用Spring Initializr創建Spring Boot項目,在本篇文章中,將一步一步介紹使用IntelliJ IDEA創建Spring Boot項目。
  • 看魔術方法如何提升Python 代碼性能?
    在該部分幾乎找不到示例。有哪些魔術方法?為了解決魔術方法文檔缺失的問題,我整理了一些有關如何使用Python魔術方法的簡單示例。1. 創建一個只接受整數和浮點數作為其值的dict對象首先創建一個虛擬的用例。
  • 使用代碼相似性提前預判重大網絡安全風險
    近期,卡巴斯基實驗室正式宣布發布卡巴斯基威脅歸因引擎(KTAE),這種代碼歸因技術,最初是由卡巴斯基全球研究和分析團隊為內部使用而開發的,你可以直接進入卡巴斯基企業網站的信息頁面了解詳細信息。原則上,代碼相似性原理是很容易理解的。過去已經測試和討論了幾種方法,包括:1. 計算子程序的校驗和,並與資料庫進行比較;2. 重構代碼流並從中創建一個圖,比較相似結構的圖;3. 提取n-gram並將其與資料庫進行比較;4. 在整個文件或部分文件上使用模糊哈希;5.