主頁 >  其他 > 圖神經網路基礎知識——初識圖學習

圖神經網路基礎知識——初識圖學習

2020-11-27 12:12:50 其他

初識圖學習

  • 一、簡單的圖基礎
    • 什么是圖?
      • 生活中的圖
    • 圖的分類
      • 同構圖、異構圖舉例
    • 圖的度和鄰居
    • 圖的表示
      • 鄰接矩陣
      • 鄰接表
      • 邊集
    • 圖的特征
  • 二、圖學習初印象
    • 圖學習的應用
      • 節點級別任務
        • 金融詐騙檢測
        • 自動駕駛
      • 邊級別任務
        • 推薦系統
      • 圖級別任務
        • 氣味識別
    • 圖學習演算法分類
      • 圖游走類演算法
      • 圖神經網路演算法
  • 三、PGL 圖學習庫初體驗
    • 1. 環境安裝
    • 2. 使用 PGL 來創建一張圖
    • 3. 定義圖模型
    • 4. 模型定義
    • 5. 訓練前準備
    • 6. 開始訓練
    • 7. 模型測驗

一、簡單的圖基礎

在上一篇文章中,我整理了資料結構與演算法中的圖,講解了與圖有關的基本概念,

這里再做一個小小的回顧,

什么是圖?

在這里插入圖片描述
七橋問題的定義是:一個步行者怎樣才能不重復、不遺漏地一次走完七座橋,最后回到出發點,

當年,大數學家歐拉在解答七橋問題的同時,也開創了數學的一個新分支——圖論,

可以毫不夸張地說,七橋圖是我們真正意義上的第一張圖,對七橋圖上的各個地點和橋做一個抽象,我們可以將七橋圖抽象為一個由點和邊構成的圖,

生活中的圖

事實上,圖是一種統一描述復雜事物的語言,在我們的實際生活中,存在著許許多多的復雜事物,而這些事物都可以抽象成圖,

在這里插入圖片描述

我們生活在一個巨大的社交網路里面,這個社交網路里有著許許多多的人,從而抽象為了圖中的點;而人與人之間的各種聯系,包括父母關系、朋友關系、以及其他各種復雜的聯系,則構成了圖中的邊,

又比如,我們每天都在網上沖浪,而網頁與網頁之間存在著超鏈接關系,這也構成了一張圖,

在這里插入圖片描述
我們經常會在淘寶等購物APP上買東西,在界面上經常會有各種好物推薦,而其實,這個推薦系統本身也是一張圖,在這張圖里面,用戶和商品都是圖中的節點,而用戶與商品的點擊、瀏覽、購買等行為則構成了圖中的邊,

在化學這門學科上,絕大多數化學分子就是由單個或多個原子組成的,原子就是節點,而原子之間的相互作用力,也就是化學鍵,它構成了圖中的邊,

圖的分類

在這里插入圖片描述

  • 根據圖的節點間是否有方向,可將圖分為無向圖與有向圖
  • 根據圖的邊是否有權重,可以將圖分為無權圖和有權圖
  • 根據圖的邊和點是否具有多種型別,可以將圖分為同構圖和異構圖

同構圖、異構圖舉例

在這里插入圖片描述

圖的度和鄰居

在這里插入圖片描述

  • 是圖上一節點,其邊的條數
  • 鄰居指的是圖上一節點的相鄰節點

對于上面這兩張圖來說:

  1. 這張無向圖有4個節點,每條邊都是雙向的,所以有8條邊;
  • 拿節點4舉例,其有3條邊,所以度為3;
  • 3個節點與節點4相連,因此它有3個鄰居節點,
  1. 這張有向圖有4個節點,4條邊
  • 拿節點4舉例,它有3條邊,所以度為3,根據箭頭的指向,可以分為出度和入度,其中入度為1,出度為2
  • 有3個節點與節點4相連,其中,指向節點4的節點稱為前繼節點,反之則稱為后繼節點

圖的表示

鄰接矩陣

鄰接矩陣是用0和1表示節點間關系的矩陣
在這里插入圖片描述
可以看出,無向圖的臨界矩陣就是對稱矩陣

鄰接表

鄰接表其實就是直接記錄著每個節點的鄰居資訊
在這里插入圖片描述

邊集

在這里插入圖片描述

圖的特征

對于一張圖來說,每個節點、每條邊可能都有各自的特征
在這里插入圖片描述

二、圖學習初印象

圖學習(Graph Learning)是深度學習中的一個子領域,強調處理的資料物件為圖,

與一般深度學習的區別是圖學習能夠方便地處理不規則資料(樹、圖),同時也可以處理規則資料(如影像),

在這里插入圖片描述

圖學習的應用

在這里插入圖片描述

在這里插入圖片描述
可以將基于圖能做的任務進行一個分類,對于一張圖:

  • 我們希望預測這個點的類別或者其他的特性,那么這就是一個節點級別的任務;
  • 又比如我們希望預測這條邊的權值,或者預測這條邊是否存在,等等,那么這就是一個邊級別的任務;
  • 再比如,我們想要預測整張圖的一個類別,或者想比較兩張圖之間的相似性等等,這就是一個圖級別的任務了,

節點級別任務

金融詐騙檢測

在這里插入圖片描述
在建圖的時候,它的節點是用戶和商家,同時還包含了各自共有的資訊作為節點,

其中,每個用戶或者商家都有著各自的特征,也具備著某些相同的特征,同時也有著與他人的互動,傳統方法通常是直接利用用戶和商家的特征來訓練一個分類網路,而沒有利用節點與節點之間的互動,因此使用圖學習,我們可以同時學習圖結構以及節點特征,更好的進行分類,從而更好地找到金融詐騙分子,

自動駕駛

在這里插入圖片描述
在這里插入圖片描述
點云是通過激光掃描等來獲得的點資料,而3D點云這個結構可以建模為圖結構,

在點云中構建好圖之后,將圖結構和圖特征經過這個叫 Point-GNN 的模型,從而預測出點云中每個點所對應的 object,也就是目標物件,同時要預測出對應目標的所在三維邊界,也就是 bounding box,

由于預測物件是每個點,因此這是一個節點級別的任務,

邊級別任務

推薦系統

在這里插入圖片描述
推薦系統可以表示成圖

比如,我們想要向用戶推薦新聞,以左邊這個圖為例,我們已經知道了用戶 ABC的歷史點擊行為,那么接下來,想要預測用戶B會不會點擊某條廣告,其實就相當于預測這條邊是否存在,因此這就是一個邊預測的任務,

具體實作的時候,會把用戶行為圖關系通過圖表示學習后,得到用戶、商品或內容的向量表示;得到對應這些節點的 Embeddings 之后, 就可以利用這些 embeddings 來做各種的推薦任務,

圖級別任務

氣味識別

在這里插入圖片描述
氣味識別其實是一個非常典型的圖識別任務了,而且對于實際生活也很有幫助,

假設這樣的一個場景,我們有兩種花,蒙住眼睛,只能用鼻子來分辨花,如果我們光靠鼻子搞不定,那么這時候就可以派圖學習上場了,

在這里插入圖片描述

圖學習演算法分類

在這里插入圖片描述
這里分為了三大類:游走類演算法圖神經網路演算法、以及知識圖譜嵌入演算法

因為知識圖譜也是一種典型的圖,因此把它也加入到了這個分類里面,

其中,圖神經網路演算法還可以進行更加具體的劃分,比如分為卷積網路和遞回網路,等等,

圖游走類演算法

在這里插入圖片描述

圖游走類演算法就有點像我們去旅游一樣,任意選擇一個出發點,然后隨機地選擇下一個目的地,不斷地走,直到我們累了,

通過不斷地旅游,我們得到了多個序列,而游走類演算法就是在得到這些序列之后,對它們應用圖表示學習,再進行接下來的其他操作,

圖神經網路演算法

在這里插入圖片描述
圖神經網路演算法相對來說則復雜一點,它的一種實作方式是訊息傳遞

訊息傳遞,其實質就是把當前節點的鄰居發送到自身,將這些資訊聚合后,再利用這些資訊更新自身的表示,

三、PGL 圖學習庫初體驗

  • Github 鏈接:https://github.com/PaddlePaddle/PGL

  • API檔案: https://pgl.readthedocs.io/en/latest/

1. 環境安裝

# 安裝 PaddlePaddle 框架
!pip install paddlepaddle==1.8.5

# 安裝 PGL 學習庫
!pip install pgl

2. 使用 PGL 來創建一張圖

假設我們有下面的這一張圖,其中包含了10個節點以及14條邊,

我們的目的是,訓練一個圖模型,使得該圖模型可以區分圖上的黃色節點和綠色節點,我們可以使用以下代碼來構圖,

import pgl
from pgl import graph  # 匯入 PGL 中的圖模塊
import paddle.fluid as fluid # 匯入飛槳框架
import numpy as np

def build_graph():
    # 定義圖中的節點數目,我們使用數字來表示圖中的每個節點
    num_nodes = 10

    # 定義圖中的邊集
    edge_list = [(2, 0), (2, 1), (3, 1),(4, 0), (5, 0),
             (6, 0), (6, 4), (6, 5), (7, 0), (7, 1),
             (7, 2), (7, 3), (8, 0), (9, 7)]

    # 隨機初始化節點特征,特征維度為 d
    d = 16
    feature = np.random.randn(num_nodes, d).astype("float32")

    # 隨機地為每條邊賦值一個權重
    edge_feature = np.random.randn(len(edge_list), 1).astype("float32")

    # 創建圖物件,最多四個輸入
    g = graph.Graph(num_nodes = num_nodes,
                    edges = edge_list,
                    node_feat = {'feature':feature},
                    edge_feat ={'edge_feature': edge_feature})

    return g

g = build_graph()

圖創建完畢后,我們可以列印出圖中的一些資訊,

print('圖中共計 %d 個節點' % g.num_nodes)
print('圖中共計 %d 條邊' % g.num_edges)
圖中共計 10 個節點
圖中共計 14 條邊

3. 定義圖模型

我們可以定義下面的一個簡單圖模型層,這里的結構是添加了邊權重資訊的類 GCN 層,

# 定義一個同時傳遞節點特征和邊權重的簡單模型層,
def model_layer(gw, nfeat, efeat, hidden_size, name, activation):
    '''
    gw: GraphWrapper 圖資料容器,用于在定義模型的時候使用,后續訓練時再feed入真實資料
    nfeat: 節點特征
    efeat: 邊權重
    hidden_size: 模型隱藏層維度
    activation: 使用的激活函式
    '''

    # 定義 send 函式
    def send_func(src_feat, dst_feat, edge_feat):
        # 將源節點的節點特征和邊權重共同作為訊息發送
        return src_feat['h'] * edge_feat['e']

    # 定義 recv 函式
    def recv_func(feat):
        # 目標節點接收源節點訊息,采用 sum 的聚合方式
        return fluid.layers.sequence_pool(feat, pool_type='sum')

    # 觸發訊息傳遞機制
    msg = gw.send(send_func, nfeat_list=[('h', nfeat)], efeat_list=[('e', efeat)])
    output = gw.recv(msg, recv_func)
    output = fluid.layers.fc(output,
                    size=hidden_size,
                    bias_attr=False,
                    act=activation,
                    name=name)
    return output

4. 模型定義

這里我們簡單的把上述定義好的模型層堆疊兩層,作為我們的最終模型,

class Model(object):
    def __init__(self, graph):
        """
        graph: 我們前面創建好的圖
        """
        # 創建 GraphWrapper 圖資料容器,用于在定義模型的時候使用,后續訓練時再feed入真實資料
        self.gw = pgl.graph_wrapper.GraphWrapper(name='graph',
                    node_feat=graph.node_feat_info(),
                    edge_feat=graph.edge_feat_info())
        # 作用同 GraphWrapper,此處用作節點標簽的容器
        self.node_label = fluid.layers.data("node_label", shape=[None, 1],
                    dtype="float32", append_batch_size=False)

    def build_model(self):
        # 定義兩層model_layer
        output = model_layer(self.gw, 
                             self.gw.node_feat['feature'], 
                             self.gw.edge_feat['edge_feature'],
                             hidden_size=8, 
                             name='layer_1', 
                             activation='relu')
        output = model_layer(self.gw, 
                             output, 
                             self.gw.edge_feat['edge_feature'],
                             hidden_size=1, 
                             name='layer_2', 
                             activation=None)
                             
        # 對于二分類任務,可以使用以下 API 計算損失
        loss = fluid.layers.sigmoid_cross_entropy_with_logits(x=output, 
                                                              label=self.node_label)
        # 計算平均損失
        loss = fluid.layers.mean(loss)
        
        # 計算準確率
        prob = fluid.layers.sigmoid(output)
        pred = prob > 0.5
        pred = fluid.layers.cast(prob > 0.5, dtype="float32")
        correct = fluid.layers.equal(pred, self.node_label)
        correct = fluid.layers.cast(correct, dtype="float32")
        acc = fluid.layers.reduce_mean(correct)

        return loss, acc

5. 訓練前準備

# 是否在 GPU 或 CPU 環境運行
use_cuda = True
place = fluid.CUDAPlace(0) if use_cuda else fluid.CPUPlace()

# 定義程式,也就是我們的 Program
startup_program = fluid.Program() # 用于初始化模型引數
train_program = fluid.Program()   # 訓練時使用的主程式,包含前向計算和反向梯度計算
test_program = fluid.Program()    # 測驗時使用的程式,只包含前向計算

with fluid.program_guard(train_program, startup_program):
    model = Model(g)
    # 創建模型和計算 Loss
    loss, acc = model.build_model()
    # 選擇Adam優化器,學習率設定為0.01
    adam = fluid.optimizer.Adam(learning_rate=0.01)
    adam.minimize(loss) # 計算梯度和執行梯度反向傳播程序

# 復制構造 test_program,與 train_program的區別在于不需要梯度計算和反向程序,
test_program = train_program.clone(for_test=True)

# 定義一個在 place(CPU)上的Executor來執行program
exe = fluid.Executor(place)
# 引數初始化
exe.run(startup_program) 

# 獲取真實圖資料
feed_dict = model.gw.to_feed(g) 
# 獲取真實標簽資料
# 由于我們是位元組點分類任務,因此可以簡單的用0、1表示節點類別,其中,黃色點標簽為0,綠色點標簽為1,
y = [0,1,1,1,0,0,0,1,0,1]
label = np.array(y, dtype="float32")
label = np.expand_dims(label, -1)
feed_dict['node_label'] = label

列印輸入的資料:

print(feed_dict)
{'graph/num_edges': array([14]), 'graph/edges_src': array([2, 4, 5, 6, 7, 8, 2, 3, 7, 7, 7, 6, 6, 9]), 'graph/edges_dst': array([0, 0, 0, 0, 0, 0, 1, 1, 1, 2, 3, 4, 5, 7]), 'graph/num_nodes': array([10]), 'graph/uniq_dst': array([0, 1, 2, 3, 4, 5, 7]), 'graph/uniq_dst_count': array([ 0,  6,  9, 10, 11, 12, 13, 14], dtype=int32), 'graph/indegree': array([6, 3, 1, 1, 1, 1, 0, 1, 0, 0]), 'graph/graph_lod': array([ 0, 10], dtype=int32), 'graph/num_graph': array([1]), 'graph/node_feat/feature': array([[ 0.58795387,  1.2630547 ,  0.15662637,  1.3688753 ,  1.1675597 ,
         0.04462763,  0.18476363, -0.25253114, -0.21759783,  0.8734884 ,
         0.13879131,  1.0323961 ,  0.03691616,  0.10940287, -1.792123  ,
         0.04989915],
       [-0.1444743 , -1.2530277 ,  0.15299311, -1.6170429 ,  0.64711034,
        -2.7449965 , -1.3882436 ,  0.51445365, -1.2793802 , -0.25707176,
        -1.0026166 ,  0.5339329 , -0.2335032 , -1.8645428 ,  1.8710616 ,
         1.0047083 ],
       [-2.0020528 ,  0.21761087,  1.333866  , -1.306326  , -0.01795861,
         1.0073777 , -0.253056  , -0.2271674 ,  2.1695845 , -0.96707493,
        -0.76226276,  0.16730066,  0.54326695,  1.3340389 ,  0.28255144,
         0.10114926],
       [-1.9666518 , -1.9607522 , -0.43653187,  1.4989506 , -0.3806762 ,
         0.9109142 ,  0.6621056 ,  0.27713525,  0.3436323 ,  0.6689543 ,
        -0.4054542 ,  0.7418638 ,  0.09361912, -0.51458985,  0.56043166,
         0.6162147 ],
       [-1.1269506 , -1.1637336 , -1.3745695 , -0.17090996, -0.52521807,
         1.1339206 ,  0.36089063,  1.1876916 , -0.4320988 ,  0.18111283,
        -0.9603039 , -1.542511  , -0.5449157 ,  0.0152637 ,  1.2007928 ,
        -0.74825037],
       [-1.3099471 ,  1.2409917 ,  0.51250875, -1.0624666 , -0.02053989,
         2.0178044 , -0.59536004,  0.3934452 ,  0.98477745, -0.1810182 ,
         0.65636057,  2.3335536 , -0.42765683,  0.09425509, -0.4363421 ,
        -1.1370741 ],
       [-0.48036537, -0.44820678, -1.1542974 , -0.6099145 , -1.2221897 ,
         1.9440795 , -1.2649409 , -0.301374  , -0.42991576, -0.6353119 ,
        -0.32859164,  1.0071183 ,  0.5237574 , -1.0096937 , -0.544537  ,
        -0.99841434],
       [-1.8510556 ,  0.8686978 ,  1.4590447 , -1.9817588 , -1.2099521 ,
         0.40852544,  0.52567303,  0.89494723,  0.03127011, -0.4033486 ,
         0.60143316,  0.19032563,  0.6081489 , -0.297795  ,  0.9398178 ,
        -0.32976308],
       [-0.7306164 , -0.1550996 ,  1.2815462 , -0.20480168,  0.21323843,
        -0.80160755, -1.155071  ,  1.8388264 ,  0.5788635 ,  0.01409068,
         0.57363164, -1.3481847 ,  0.33940238,  0.9301134 ,  0.9973273 ,
         0.3144489 ],
       [ 0.03115364,  0.4957952 , -1.2972994 , -0.42183682,  1.939209  ,
        -0.6846291 ,  0.4093842 ,  0.7665659 ,  1.5198345 , -0.94440025,
         0.57780015,  1.2090318 ,  0.33736354,  0.34547713, -1.1328425 ,
        -0.96179086]], dtype=float32), 'graph/edge_feat/edge_feature': array([[ 0.49790657],
       [-0.44967642],
       [ 0.92381525],
       [-0.0052013 ],
       [-0.22613016],
       [-0.927129  ],
       [ 0.8273991 ],
       [-0.5968252 ],
       [-0.37763336],
       [-0.39886096],
       [ 0.55989164],
       [ 0.12900583],
       [-1.9236063 ],
       [ 0.15244085]], dtype=float32), 'node_label': array([[0.],
       [1.],
       [1.],
       [1.],
       [0.],
       [0.],
       [0.],
       [1.],
       [0.],
       [1.]], dtype=float32)}

6. 開始訓練

for epoch in range(30):
    train_loss = exe.run(train_program,
        feed=feed_dict,      # feed入真實訓練資料
        fetch_list=[loss],   # fetch出需要的計算結果
        return_numpy=True)[0]
    print('Epoch %d | Loss: %f' % (epoch, train_loss))
Epoch 0 | Loss: 0.706203
Epoch 1 | Loss: 0.689478
Epoch 2 | Loss: 0.677695
Epoch 3 | Loss: 0.667933
Epoch 4 | Loss: 0.659103
Epoch 5 | Loss: 0.650838
Epoch 6 | Loss: 0.642839
Epoch 7 | Loss: 0.635119
Epoch 8 | Loss: 0.627715
Epoch 9 | Loss: 0.620718
Epoch 10 | Loss: 0.614087
Epoch 11 | Loss: 0.607863
Epoch 12 | Loss: 0.602069
Epoch 13 | Loss: 0.596725
Epoch 14 | Loss: 0.591840
Epoch 15 | Loss: 0.587411
Epoch 16 | Loss: 0.583429
Epoch 17 | Loss: 0.579876
Epoch 18 | Loss: 0.576725
Epoch 19 | Loss: 0.573948
Epoch 20 | Loss: 0.571514
Epoch 21 | Loss: 0.569391
Epoch 22 | Loss: 0.567547
Epoch 23 | Loss: 0.565950
Epoch 24 | Loss: 0.564570
Epoch 25 | Loss: 0.563379
Epoch 26 | Loss: 0.562358
Epoch 27 | Loss: 0.561476
Epoch 28 | Loss: 0.560711
Epoch 29 | Loss: 0.560047

7. 模型測驗

test_acc = exe.run(test_program, feed=feed_dict, fetch_list=[acc], return_numpy=True)[0]
print("Test Acc: %f" % test_acc)
Test Acc: 0.700000
result = exe.run(test_program, feed=feed_dict, fetch_list=[acc], return_numpy=True)
print(result)
[array([0.70000005], dtype=float32)]

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

標籤:AI

上一篇:【個人學年總結】大一——“蟄伏”的一年

下一篇:IEEE 2021年新增Fellow出爐,70余位華人入選

標籤雲
其他(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