主頁 >  其他 > TensorFlow:使用TensorFlow實作反向傳播演算法

TensorFlow:使用TensorFlow實作反向傳播演算法

2020-10-28 14:10:08 其他

文章目錄

  • 反向傳播演算法
    • 1.激活函式導數
      • 1.1 Sigmoid函式導數
      • 1.2 ReLU 函式導數
      • 1.3 LeakyReLU函式導數
      • 1.4 Tanh 函式梯度
    • 2.鏈式法則
    • 3.反向傳播演算法實戰

反向傳播演算法

1.激活函式導數

1.1 Sigmoid函式導數

Sigmoid函式運算式: σ ( x ) = 1 1 + e ? x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e?x1?
Sigmoid函式的導數運算式: d d x σ ( x ) = σ ( 1 ? σ ) \frac{d}{dx} \sigma(x) = \sigma(1-\sigma) dxd?σ(x)=σ(1?σ)

下面我們用代碼來實作Sigmoid函式及其導數,并進行可視化

# 匯入 numpy 庫
import numpy as np 
from matplotlib import pyplot as plt
plt.rcParams['font.size'] = 16
plt.rcParams['font.family'] = ['STKaiti']
plt.rcParams['axes.unicode_minus'] = False

def set_plt_ax():
    # get current axis 獲得坐標軸物件
    ax = plt.gca()                                           

    ax.spines['right'].set_color('none') 
    # 將右邊 上邊的兩條邊顏色設定為空 其實就相當于抹掉這兩條邊
    ax.spines['top'].set_color('none')         

    ax.xaxis.set_ticks_position('bottom')   
    # 指定下邊的邊作為 x 軸,指定左邊的邊為 y 軸
    ax.yaxis.set_ticks_position('left') 

    # 指定 data  設定的bottom(也就是指定的x軸)系結到y軸的0這個點上
    ax.spines['bottom'].set_position(('data', 0)) 
    ax.spines['left'].set_position(('data', 0))

def sigmoid(x): 
    # 實作 sigmoid 函式
    return 1 / (1 + np.exp(-x))

def sigmoid_derivative(x): 
    # sigmoid 導數的計算
    # sigmoid 函式的運算式由手動推導而得
    return sigmoid(x)*(1-sigmoid(x))

畫圖

x = np.arange(-6.0, 6.0, 0.1)
sigmoid_y = sigmoid(x)
sigmoid_derivative_y = sigmoid_derivative(x)

set_plt_ax()
plt.plot(x, sigmoid_y, color='C9', label='Sigmoid')
plt.plot(x, sigmoid_derivative_y, color='C4', label='導數')
plt.xlim(-6, 6)
plt.ylim(0, 1)
plt.legend(loc=2)
plt.show()

在這里插入圖片描述

1.2 ReLU 函式導數

ReLU 函式的運算式: ReLU ( x ) = max ? ( 0 , x ) \text{ReLU}(x)=\max(0,x) ReLU(x)=max(0,x)
ReLU 函式的導數運算式: d d x ReLU = { 1 x ? 0 0 x < 0 \frac{d}{dx} \text{ReLU} = \left \{ \begin{array}{cc} 1 \quad x \geqslant 0 \\ 0 \quad x < 0 \end{array} \right. dxd?ReLU={1x?00x<0?

下面我們用代碼來實作relu函式及其導數,并進行可視化

def relu(x):
    return np.maximum(0, x)

def relu_derivative(x): # ReLU 函式的導數
    d = np.array(x, copy=True) # 用于保存梯度的張量
    d[x < 0] = 0 # 元素為負的導數為 0
    d[x >= 0] = 1 # 元素為正的導數為 1
    return d
x = np.arange(-6.0, 6.0, 0.1)
relu_y = relu(x)
relu_derivative_y = relu_derivative(x)

set_plt_ax()
plt.plot(x, relu_y, color='C9', label='ReLU')
plt.plot(x, relu_derivative_y, color='C4', label='導數')
plt.xlim(-6, 6)
plt.ylim(0, 6)
plt.legend(loc=2)
plt.show()

在這里插入圖片描述

1.3 LeakyReLU函式導數

LeakyReLU 函式的運算式: LeakyReLU = { x x ? 0 p x x < 0 \text{LeakyReLU} = \left\{ \begin{array}{cc} x \quad x \geqslant 0 \\ px \quad x < 0 \end{array} \right. LeakyReLU={xx?0pxx<0?

LeakyReLU的函式導數運算式: d d x LeakyReLU = { 1 x ? 0 p x < 0 \frac{d}{dx} \text{LeakyReLU} = \left\{ \begin{array}{cc} 1 \quad x \geqslant 0 \\ p \quad x < 0 \end{array} \right. dxd?LeakyReLU={1x?0px<0?

def leakyrelu(x, p):
    y = np.copy(x)
    y[y < 0] = p * y[y < 0]
    return y

# 其中 p 為 LeakyReLU 的負半段斜率,為超引數
def leakyrelu_derivative(x, p):
    dx = np.ones_like(x) # 創建梯度張量,全部初始化為 1
    dx[x < 0] = p # 元素為負的導數為 p
    return dx
x = np.arange(-6.0, 6.0, 0.1)
p = 0.1
leakyrelu_y = leakyrelu(x, p)
leakyrelu_derivative_y = leakyrelu_derivative(x, p)

set_plt_ax()
plt.plot(x, leakyrelu_y, color='C9', label='LeakyReLU')
plt.plot(x, leakyrelu_derivative_y, color='C4', label='導數')
plt.xlim(-6, 6)
plt.yticks(np.arange(-1, 7))
plt.legend(loc=2)
plt.show()

在這里插入圖片描述

1.4 Tanh 函式梯度

tanh函式的運算式: tanh ? ( x ) = e x ? e ? x e x + e ? x = 2 ? sigmoid ( 2 x ) ? 1 \tanh(x)=\frac{e^x-e^{-x}}{e^x + e^{-x}}= 2 \cdot \text{sigmoid}(2x) - 1 tanh(x)=ex+e?xex?e?x?=2?sigmoid(2x)?1
tanh函式的導數運算式: d d x tanh ? ( x ) = ( e x + e ? x ) ( e x + e ? x ) ? ( e x ? e ? x ) ( e x ? e ? x ) ( e x + e ? x ) 2 = 1 ? ( e x ? e ? x ) 2 ( e x + e ? x ) 2 = 1 ? tanh ? 2 ( x ) \begin{aligned} \frac{\mathrm{d}}{\mathrm{d} x} \tanh (x) &=\frac{\left(e^{x}+e^{-x}\right)\left(e^{x}+e^{-x}\right)-\left(e^{x}-e^{-x}\right)\left(e^{x}-e^{-x}\right)}{\left(e^{x}+e^{-x}\right)^{2}} \\ &=1-\frac{\left(e^{x}-e^{-x}\right)^{2}}{\left(e^{x}+e^{-x}\right)^{2}}=1-\tanh ^{2}(x) \end{aligned} dxd?tanh(x)?=(ex+e?x)2(ex+e?x)(ex+e?x)?(ex?e?x)(ex?e?x)?=1?(ex+e?x)2(ex?e?x)2?=1?tanh2(x)?

def sigmoid(x): # sigmoid 函式實作
    return 1 / (1 + np.exp(-x))
def tanh(x): # tanh 函式實作
    return 2*sigmoid(2*x) - 1
def tanh_derivative(x): # tanh 導數實作
    return 1-tanh(x)**2
x = np.arange(-6.0, 6.0, 0.1)
tanh_y = tanh(x)
tanh_derivative_y = tanh_derivative(x)

set_plt_ax()
plt.plot(x, tanh_y, color='C9', label='Tanh')
plt.plot(x, tanh_derivative_y, color='C4', label='導數')
plt.xlim(-6, 6)
plt.ylim(-1.5, 1.5)
plt.legend(loc=2)
plt.show()

在這里插入圖片描述

2.鏈式法則

import tensorflow as tf
# 構建待優化變數
x = tf.constant(1.)
w1 = tf.constant(2.)
b1 = tf.constant(1.)
w2 = tf.constant(2.)
b2 = tf.constant(1.)

# 構建梯度記錄器
with tf.GradientTape(persistent=True) as tape:
    # 非 tf.Variable 型別的張量需要人為設定記錄梯度資訊
    tape.watch([w1, b1, w2, b2])
    # 構建 2 層線性網路
    y1 = x * w1 + b1
    y2 = y1 * w2 + b2
    
# 獨立求解出各個偏導數
dy2_dy1 = tape.gradient(y2, [y1])[0]
dy1_dw1 = tape.gradient(y1, [w1])[0]
dy2_dw1 = tape.gradient(y2, [w1])[0]
# 驗證鏈式法則, 2 個輸出應相等
print(dy2_dy1 * dy1_dw1)
print(dy2_dw1)
tf.Tensor(2.0, shape=(), dtype=float32)
tf.Tensor(2.0, shape=(), dtype=float32)

Himmelblau 函式是用來測驗優化演算法的常用樣例函式之一,它包含了兩個自變數 x x x y y y,數學運算式是: f ( x , y ) = ( x 2 + y ? 11 ) 2 + ( x + y 2 ? 7 ) 2 f(x, y)=\left(x^{2}+y-11\right)^{2}+\left(x+y^{2}-7\right)^{2} f(x,y)=(x2+y?11)2+(x+y2?7)2

from mpl_toolkits.mplot3d import Axes3D

def himmelblau(x):
    # himmelblau 函式實作,傳入引數 x 為 2 個元素的 List
    return (x[0] ** 2 + x[1] - 11) ** 2 + (x[0] + x[1] ** 2 - 7) ** 2
x = np.arange(-6, 6, 0.1) # 可視化的 x 坐標范圍為-6~6
y = np.arange(-6, 6, 0.1) # 可視化的 y 坐標范圍為-6~6
print('x,y range:', x.shape, y.shape)
# 生成 x-y 平面采樣網格點,方便可視化
X, Y = np.meshgrid(x, y)
print('X,Y maps:', X.shape, Y.shape)
Z = himmelblau([X, Y]) # 計算網格點上的函式值
x,y range: (120,) (120,)
X,Y maps: (120, 120) (120, 120)
# 繪制 himmelblau 函式曲面
fig = plt.figure('himmelblau')
ax = fig.gca(projection='3d') # 設定 3D 坐標軸
ax.plot_surface(X, Y, Z, cmap = plt.cm.rainbow ) # 3D 曲面圖
ax.view_init(60, -30)
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()

在這里插入圖片描述

# 引數的初始化值對優化的影響不容忽視,可以通過嘗試不同的初始化值,
# 檢驗函式優化的極小值情況
# [1., 0.], [-4, 0.], [4, 0.]
# 初始化引數
x = tf.constant([4., 0.]) 

for step in range(200):# 回圈優化 200 次
    with tf.GradientTape() as tape: #梯度跟蹤
        tape.watch([x]) # 加入梯度跟蹤串列
        y = himmelblau(x) # 前向傳播
    
    # 反向傳播
    grads = tape.gradient(y, [x])[0]
    # 更新引數,0.01 為學習率
    x -= 0.01*grads
    # 列印優化的極小值
    if step % 20 == 19:
        print ('step {}: x = {}, f(x) = {}'.format(step, x.numpy(), y.numpy()))

step 19: x = [ 3.5381215 -1.3465767], f(x) = 3.7151756286621094
step 39: x = [ 3.5843277 -1.8470242], f(x) = 3.451140582910739e-05
step 59: x = [ 3.584428  -1.8481253], f(x) = 4.547473508864641e-11
step 79: x = [ 3.584428  -1.8481264], f(x) = 1.1368684856363775e-12
step 99: x = [ 3.584428  -1.8481264], f(x) = 1.1368684856363775e-12
step 119: x = [ 3.584428  -1.8481264], f(x) = 1.1368684856363775e-12
step 139: x = [ 3.584428  -1.8481264], f(x) = 1.1368684856363775e-12
step 159: x = [ 3.584428  -1.8481264], f(x) = 1.1368684856363775e-12
step 179: x = [ 3.584428  -1.8481264], f(x) = 1.1368684856363775e-12
step 199: x = [ 3.584428  -1.8481264], f(x) = 1.1368684856363775e-12

3.反向傳播演算法實戰

匯入庫

import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from sklearn.datasets import make_moons
from sklearn.model_selection import train_test_split

plt.rcParams['font.size'] = 16
plt.rcParams['font.family'] = ['STKaiti']
plt.rcParams['axes.unicode_minus'] = False

創建資料

def load_dataset():
    # 采樣點數
    N_SAMPLES = 2000
    # 測驗數量比率
    TEST_SIZE = 0.3
    # 利用工具函式直接生成資料集
    X, y = make_moons(n_samples=N_SAMPLES, noise=0.2, random_state=100)
    # 將 2000 個點按著 7:3 分割為訓練集和測驗集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=TEST_SIZE, random_state=42)
    return X, y, X_train, X_test, y_train, y_test

畫圖

def make_plot(X, y, plot_name, XX=None, YY=None, preds=None, dark=False):
    # 繪制資料集的分布, X 為 2D 坐標, y 為資料點的標簽
    if (dark):
        plt.style.use('dark_background')
    else:
        sns.set_style("whitegrid")
    plt.figure(figsize=(16, 12))
    axes = plt.gca()
    axes.set(xlabel="$x_1$", ylabel="$x_2$")
    plt.title(plot_name, fontsize=30)
    plt.subplots_adjust(left=0.20)
    plt.subplots_adjust(right=0.80)
    if XX is not None and YY is not None and preds is not None:
        plt.contourf(XX, YY, preds.reshape(XX.shape), 25, alpha=1, cmap=plt.cm.Spectral)
        plt.contour(XX, YY, preds.reshape(XX.shape), levels=[.5], cmap="Greys", vmin=0, vmax=.6)
    # 繪制散點圖,根據標簽區分顏色
    plt.scatter(X[:, 0], X[:, 1], c=y.ravel(), s=40, cmap=plt.cm.Spectral, edgecolors='none')
    plt.show()

X, y, X_train, X_test, y_train, y_test = load_dataset()
# 呼叫 make_plot 函式繪制資料的分布,其中 X 為 2D 坐標, y 為標簽
make_plot(X, y, "Classification Dataset Visualization ")

在這里插入圖片描述

網路層

通過新建類 Layer 實作一個網路層,需要傳入網路層的資料節點數,輸出節點數,激
活函式型別等引數,權值 weights 和偏置張量 bias 在初始化時根據輸入、輸出節點數自動
生成并初始化:

class Layer:
    # 全連接網路層
    def __init__(self, n_input, n_neurons, activation=None, weights=None,
                 bias=None):
        """
        :param int n_input: 輸入節點數
        :param int n_neurons: 輸出節點數
        :param str activation: 激活函式型別
        :param weights: 權值張量,默認類內部生成
        :param bias: 偏置,默認類內部生成
        """
        # 通過正態分布初始化網路權值,初始化非常重要,不合適的初始化將導致網路不收斂
        self.weights = weights if weights is not None else np.random.randn(n_input, n_neurons) * np.sqrt(1 / n_neurons)
        self.bias = bias if bias is not None else np.random.rand(n_neurons) * 0.1
        self.activation = activation  # 激活函式型別,如’sigmoid’
        self.last_activation = None  # 激活函式的輸出值o
        self.error = None  # 用于計算當前層的delta 變數的中間變數
        self.delta = None  # 記錄當前層的delta 變數,用于計算梯度

    # 網路層的前向傳播函式實作如下,其中last_activation 變數用于保存當前層的輸出值:
    def activate(self, x):
        # 前向傳播函式
        r = np.dot(x, self.weights) + self.bias  # X@W+b
        # 通過激活函式,得到全連接層的輸出o
        self.last_activation = self._apply_activation(r)
        return self.last_activation

    # 上述代碼中的self._apply_activation 函式實作了不同型別的激活函式的前向計算程序,
    # 盡管此處我們只使用Sigmoid 激活函式一種,代碼如下:
    def _apply_activation(self, r):
        # 計算激活函式的輸出
        if self.activation is None:
            return r  # 無激活函式,直接回傳
        # ReLU 激活函式
        elif self.activation == 'relu':
            return np.maximum(r, 0)
        # tanh 激活函式
        elif self.activation == 'tanh':
            return np.tanh(r)
        # sigmoid 激活函式
        elif self.activation == 'sigmoid':
            return 1 / (1 + np.exp(-r))
        return r

    # 針對于不同型別的激活函式,它們的導數計算實作如下:
    def apply_activation_derivative(self, r):
        # 計算激活函式的導數
        # 無激活函式,導數為1
        if self.activation is None:
            return np.ones_like(r)
        # ReLU 函式的導數實作
        elif self.activation == 'relu':
            grad = np.array(r, copy=True)
            grad[r > 0] = 1.
            grad[r <= 0] = 0.
            return grad
        # tanh 函式的導數實作
        elif self.activation == 'tanh':
            return 1 - r ** 2
        # Sigmoid 函式的導數實作
        elif self.activation == 'sigmoid':
            return r * (1 - r)
        return r

網路模型

實作單層網路類后,我們實作網路模型的類 NeuralNetwork,它內部維護各層的網路層
Layer 類物件,可以通過 add_layer 函式追加網路層,實作如下:

# 神經網路模型
class NeuralNetwork:
    def __init__(self):
        self._layers = []  # 網路層物件串列

    def add_layer(self, layer):
        # 追加網路層
        self._layers.append(layer)

    # 網路的前向傳播只需要回圈調各個網路層物件的前向計算函式即可,代碼如下:
    # 前向傳播
    def feed_forward(self, X):
        for layer in self._layers:
            # 依次通過各個網路層
            X = layer.activate(X)
        return X

    def backpropagation(self, X, y, learning_rate):
        # 反向傳播演算法實作
        # 前向計算,得到輸出值
        output = self.feed_forward(X)
        for i in reversed(range(len(self._layers))):  # 反向回圈
            layer = self._layers[i]  # 得到當前層物件
            # 如果是輸出層
            if layer == self._layers[-1]:  # 對于輸出層
                layer.error = y - output  # 計算2 分類任務的均方差的導數
                # 關鍵步驟:計算最后一層的delta,參考輸出層的梯度公式
                layer.delta = layer.error * layer.apply_activation_derivative(output)
            else:  # 如果是隱藏層
                next_layer = self._layers[i + 1]  # 得到下一層物件
                layer.error = np.dot(next_layer.weights, next_layer.delta)
                # 關鍵步驟:計算隱藏層的delta,參考隱藏層的梯度公式
                layer.delta = layer.error * layer.apply_activation_derivative(layer.last_activation)

        # 回圈更新權值
        for i in range(len(self._layers)):
            layer = self._layers[i]
            # o_i 為上一網路層的輸出
            o_i = np.atleast_2d(X if i == 0 else self._layers[i - 1].last_activation)
            # 梯度下降演算法,delta 是公式中的負數,故這里用加號
            layer.weights += layer.delta * o_i.T * learning_rate

    def train(self, X_train, X_test, y_train, y_test, learning_rate, max_epochs):
        # 網路訓練函式
        # one-hot 編碼
        y_onehot = np.zeros((y_train.shape[0], 2))
        y_onehot[np.arange(y_train.shape[0]), y_train] = 1

        # 將One-hot 編碼后的真實標簽與網路的輸出計算均方誤差,并呼叫反向傳播函式更新網路引數,回圈迭代訓練集1000 遍即可
        mses = []
        accuracys = []
        for i in range(max_epochs + 1):  # 訓練1000 個epoch
            for j in range(len(X_train)):  # 一次訓練一個樣本
                self.backpropagation(X_train[j], y_onehot[j], learning_rate)
            if i % 10 == 0:
                # 列印出MSE Loss
                mse = np.mean(np.square(y_onehot - self.feed_forward(X_train)))
                mses.append(mse)
                accuracy = self.accuracy(self.predict(X_test), y_test.flatten())
                accuracys.append(accuracy)
                print('Epoch: #%s, MSE: %f' % (i, float(mse)))
                # 統計并列印準確率
                print('Accuracy: %.2f%%' % (accuracy * 100))
        return mses, accuracys

    def predict(self, X):
        return self.feed_forward(X)

    def accuracy(self, X, y):
        return np.sum(np.equal(np.argmax(X, axis=1), y)) / y.shape[0]

實體化網路類

nn = NeuralNetwork()  # 實體化網路類
nn.add_layer(Layer(2, 25, 'sigmoid'))  # 隱藏層 1, 2=>25
nn.add_layer(Layer(25, 50, 'sigmoid'))  # 隱藏層 2, 25=>50
nn.add_layer(Layer(50, 25, 'sigmoid'))  # 隱藏層 3, 50=>25
nn.add_layer(Layer(25, 2, 'sigmoid'))  # 輸出層, 25=>2
mses, accuracys = nn.train(X_train, X_test, y_train, y_test, 0.01, 1000)

我們將每個 epoch 的損失?記錄下,并繪制為曲線:

x = [i for i in range(0, 101, 10)]
# 繪制MES曲線
plt.title("MES Loss")
plt.plot(x, mses[:11], color='blue')
plt.xlabel('Epoch')
plt.ylabel('MSE')
plt.show()

在這里插入圖片描述

# 繪制Accuracy曲線
plt.title("Accuracy")
plt.plot(x, accuracys[:11], color='blue')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.show()

在這里插入圖片描述

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/195303.html

標籤:其他

上一篇:Python基礎語法(Python自動化測驗入門1)

下一篇:爬蟲入門經典(十) | 一文帶你快速爬取網易云音樂

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more