国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

聯(lián)邦學習實戰(zhàn)-1:用python從零開始實現(xiàn)橫向聯(lián)邦學習

這篇具有很好參考價值的文章主要介紹了聯(lián)邦學習實戰(zhàn)-1:用python從零開始實現(xiàn)橫向聯(lián)邦學習。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

什么是聯(lián)邦學習?

簡單來說就是在一個多方的環(huán)境中,數(shù)據(jù)集是零散的(在各個不同的客戶端中),那么怎樣實現(xiàn)機器學習算法呢?

首先想到的就是將多個數(shù)據(jù)集合并合并起來,然后統(tǒng)一的使用傳統(tǒng)的機器學習或者深度學習算法進行計算,但是如果有一方因為數(shù)據(jù)隱私問題不愿意提交自己的數(shù)據(jù)呢?

那么就出現(xiàn)了聯(lián)邦學習,核心就是“數(shù)據(jù)不動模型動,數(shù)據(jù)可用不可見

多個客戶端不提交數(shù)據(jù)而是提交訓練時的參數(shù)/梯度給中心服務(wù)器,中心服務(wù)器進行計算后再將參數(shù)/梯度返回多個客戶端再學習的過程

整個過程數(shù)據(jù)的所有權(quán)依然在用戶手中,這就是聯(lián)邦學習

當然數(shù)據(jù)隱私方面,聯(lián)邦學習還將結(jié)合同態(tài)加密、安全多方計算、查分隱私等隱私計算技術(shù)實現(xiàn)更安全的保障

(ps:這里只是簡單的介紹,詳細的內(nèi)容請多查閱其他資料)

基本概念入門學習見:《Federated_Machine_Learning:Concept_and_Applications》精讀

一、環(huán)境準備

實驗基于機器學習庫PyTorch, 所以需要一些基礎(chǔ)的PyTorch使用

(ps:不會也沒事,下面代碼有詳細的注釋,因為我也剛剛?cè)腴T ?? )

  • anaconda、python3.7、PyTorch
    pip install torch
  • GPU安裝CUDA、cuDNN

二、橫向聯(lián)邦圖像分類

基本信息

數(shù)據(jù)集:CIFAR10

模型:ResNet-18

環(huán)境角色:

  • 中心服務(wù)器
  • 多個客戶端

為了簡化,這里服務(wù)器客戶端都是在單機上模擬,后面使用FATE會在真實多臺機器上實現(xiàn)

聯(lián)邦學習實戰(zhàn)-1:用python從零開始實現(xiàn)橫向聯(lián)邦學習

基本的流程:

  1. 服務(wù)器按配置生成初始化模型,客戶端按照順序?qū)?shù)據(jù)集橫向不重疊切割
  2. 服務(wù)器將全局模型發(fā)送給客戶端
  3. 客戶端接收全局模型(來自服務(wù)器)通過本地多次迭代計算本地參數(shù)差值返回給服務(wù)器
  4. 服務(wù)器聚合各個客戶端差值更新模型,再評估當前模型性能
  5. 如果性能未達標,則重復2過程,否則結(jié)束

2.1 配置文件

配置文件包含了整個項目的模型、數(shù)據(jù)集、epoch等核心訓練參數(shù)

需要注意的是,一般來說配置文件需要在所有的客戶端與服務(wù)端之間同步一致

創(chuàng)建一個配置文件:

項目文件夾下./utils/conf.json創(chuàng)建配置文件:

{
  "model_name" : "resnet18",
  "no_models" : 10,
  "type" : "cifar",
  "global_epochs" : 20,
  "local_epochs" : 3,
  "k" : 6,
  "batch_size" : 32,
  "lr" : 0.001,
  "momentum" : 0.0001,
  "lambda" : 0.1 
}
  • model_name:模型名稱
  • no_models:客戶端總數(shù)量
  • type:數(shù)據(jù)集信息
  • global_epochs:全局迭代次數(shù),即服務(wù)端與客戶端的通信迭代次數(shù)
  • local_epochs:本地模型訓練迭代次數(shù)
  • k:每一輪迭代時,服務(wù)端會從所有客戶端中挑選k個客戶端參與訓練。
  • batch_size:本地訓練每一輪的樣本數(shù)
  • lr,momentum,lambda:本地訓練的超參數(shù)設(shè)置

2.1 構(gòu)建訓練數(shù)據(jù)集

構(gòu)建數(shù)據(jù)集代碼如下:

datasets.py

import torchvision as tv

# 獲取數(shù)據(jù)集
def get_dataset(dir, name):
    if name == 'mnist':
        # root: 數(shù)據(jù)路徑
        # train參數(shù)表示是否是訓練集或者測試集
        # download=true表示從互聯(lián)網(wǎng)上下載數(shù)據(jù)集并把數(shù)據(jù)集放在root路徑中
        # transform:圖像類型的轉(zhuǎn)換
        train_dataset = tv.datasets.MNIST(dir, train=True, download=True, transform=tv.transforms.ToTensor())
        eval_dataset = tv.datasets.MNIST(dir, train=False, transform=tv.transforms.ToTensor())
    elif name == 'cifar':
        # 設(shè)置兩個轉(zhuǎn)換格式
        # transforms.Compose 是將多個transform組合起來使用(由transform構(gòu)成的列表)
        transform_train = tv.transforms.Compose([
            # transforms.RandomCrop: 切割中心點的位置隨機選取
            tv.transforms.RandomCrop(32, padding=4), tv.transforms.RandomHorizontalFlip(),
            tv.transforms.ToTensor(),
            # transforms.Normalize: 給定均值:(R,G,B) 方差:(R,G,B),將會把Tensor正則化
            tv.transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
        ])
        transform_test = tv.transforms.Compose([
            tv.transforms.ToTensor(),
            tv.transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
        ])
        train_dataset = tv.datasets.CIFAR10(dir, train=True, download=True, transform=transform_train)
        eval_dataset = tv.datasets.CIFAR10(dir, train=False, transform=transform_test)
    return train_dataset, eval_dataset

2.2 服務(wù)端

服務(wù)端的主要功能是模型的聚合、評估,最終的模型也是在服務(wù)器上生成

首先創(chuàng)建一個服務(wù)類

所有的程序放在server.py

構(gòu)造函數(shù)

定義其構(gòu)造函數(shù):

# 定義構(gòu)造函數(shù)
def __init__(self, conf, eval_dataset):
  # 導入配置文件
  self.conf = conf
  # 根據(jù)配置獲取模型文件
  self.global_model = models.get_model(self.conf["model_name"])
  # 生成一個測試集合加載器
  self.eval_loader = torch.utils.data.DataLoader(
    eval_dataset,
    # 設(shè)置單個批次大小32
    batch_size=self.conf["batch_size"],
    # 打亂數(shù)據(jù)集
    shuffle=True
  )

聚合函數(shù)

定義全局聯(lián)邦平均FedAvg聚合函數(shù):

FedAvg算法的公式如下:

G t + 1 = G t + λ ∑ i = 1 m ( L i t + 1 ? G i t ) G^{t+1} = G^{t} + \lambda \sum^m_{i=1}(L_i^{t+1}-G_i^t) Gt+1=Gt+λi=1m?(Lit+1??Git?)?

G t G^t Gt表示第t輪更新的全局模型參數(shù), L i t + 1 L_i^{t+1} Lit+1??表示第i個客戶端在第t+1輪本地更新后的模型

在模型聚合時,weight_accumulator就是 ( L i t + 1 ? G i t ) ? i = 1 , 2 , . . . m (L_i^{t+1}-G_i^t) \ i = 1,2,...m (Lit+1??Git?)?i=1,2,...m?部分,具體weight_accumulator的計算會在后面詳細介紹其實現(xiàn)

# 全局聚合模型
# weight_accumulator 存儲了每一個客戶端的上傳參數(shù)變化值/差值
def model_aggregate(self, weight_accumulator):
  # 遍歷服務(wù)器的全局模型
  for name, data in self.global_model.state_dict().items():
    # 更新每一層乘上學習率
    update_per_layer = weight_accumulator[name] * self.conf["lambda"]
    # 累加和
    if data.type() != update_per_layer.type():
      	# 因為update_per_layer的type是floatTensor,所以將起轉(zhuǎn)換為模型的LongTensor(有一定的精度損失)
      	data.add_(update_per_layer.to(torch.int64))
      else:
        data.add_(update_per_layer)

評估函數(shù)

定義模型評估函數(shù)

評估函數(shù)主要是不斷的評估當前模型的性能,判斷是否可以提前終止迭代或者是出現(xiàn)了發(fā)散退化等現(xiàn)象

		# 評估函數(shù)
    def model_eval(self):
        self.global_model.eval()    # 開啟模型評估模式(不修改參數(shù))
        total_loss = 0.0
        correct = 0
        dataset_size = 0
        # 遍歷評估數(shù)據(jù)集合
        for batch_id, batch in enumerate(self.eval_loader):
            data, target = batch
            # 獲取所有的樣本總量大小
            dataset_size += data.size()[0]
            # 存儲到gpu
            if torch.cuda.is_available():
                data = data.cuda()
                target = target.cuda()
            # 加載到模型中訓練
            output = self.global_model(data)
            # 聚合所有的損失 cross_entropy交叉熵函數(shù)計算損失
            total_loss += torch.nn.functional.cross_entropy(
                output,
                target,
                reduction='sum'
            ).item()
            # 獲取最大的對數(shù)概率的索引值, 即在所有預測結(jié)果中選擇可能性最大的作為最終的分類結(jié)果
            pred = output.data.max(1)[1]
            # 統(tǒng)計預測結(jié)果與真實標簽target的匹配總個數(shù)
            correct += pred.eq(target.data.view_as(pred)).cpu().sum().item()
        acc = 100.0 * (float(correct) / float(dataset_size))    # 計算準確率
        total_1 = total_loss / dataset_size                     # 計算損失值
        return acc, total_1

2.3 客戶端

客戶端的主要功能是:

  • 接受服務(wù)器下發(fā)的指令和全局模型
  • 利用本地數(shù)據(jù)進行局部模型訓練

此部分所有程序都在client.py

構(gòu)造函數(shù)

定義client類

 		# 構(gòu)造函數(shù)
    def __init__(self, conf, model, train_dataset, id = 1):
        # 配置文件
        self.conf = conf
        # 客戶端本地模型(一般由服務(wù)器傳輸)
        self.local_model = model
        # 客戶端ID
        self.client_id = id
        # 客戶端本地數(shù)據(jù)集
        self.train_dataset = train_dataset
        # 按ID對訓練集合的拆分
        all_range = list(range(len(self.train_dataset)))
        data_len = int(len(self.train_dataset) / self.conf['no_models'])
        indices = all_range[id * data_len: (id + 1) * data_len]
        # 生成一個數(shù)據(jù)加載器
        self.train_loader = torch.utils.data.DataLoader(
            # 制定父集合
            self.train_dataset,
            # batch_size每個batch加載多少個樣本(默認: 1)
            batch_size=conf["batch_size"],
            # 指定子集合
            # sampler定義從數(shù)據(jù)集中提取樣本的策略
            sampler=torch.utils.data.sampler.SubsetRandomSampler(indices)
        )

本案例中根據(jù)ID將數(shù)據(jù)集進行橫向切分,每個客戶端之間沒有交集

本地訓練

本地模型訓練函數(shù):采用交叉熵作為本地訓練的損失函數(shù),并使用梯度下降來求解參數(shù)

		# 模型本地訓練函數(shù)
    def local_train(self, model):
        # 整體的過程:拉取服務(wù)器的模型,通過部分本地數(shù)據(jù)集訓練得到
        for name, param in model.state_dict().items():
            # 客戶端首先用服務(wù)器端下發(fā)的全局模型覆蓋本地模型
            self.local_model.state_dict()[name].copy_(param.clone())
        # 定義最優(yōu)化函數(shù)器用于本地模型訓練
        optimizer = torch.optim.SGD(self.local_model.parameters(), lr=self.conf['lr'], momentum=self.conf['momentum'])

        # 本地訓練模型
        self.local_model.train()        # 設(shè)置開啟模型訓練(可以更改參數(shù))
        # 開始訓練模型
        for e in range(self.conf["local_epochs"]):
            for batch_id, batch in enumerate(self.train_loader):
                data, target = batch
                # 加載到gpu
                if torch.cuda.is_available():
                    data = data.cuda()
                    target = target.cuda()
                # 梯度
                optimizer.zero_grad()
                # 訓練預測
                output = self.local_model(data)
                # 計算損失函數(shù) cross_entropy交叉熵誤差
                loss = torch.nn.functional.cross_entropy(output, target)
                # 反向傳播
                loss.backward()
                # 更新參數(shù)
                optimizer.step()
            print("Epoch %d done" % e)
        # 創(chuàng)建差值字典(結(jié)構(gòu)與模型參數(shù)同規(guī)格),用于記錄差值
        diff = dict()
        for name, data in self.local_model.state_dict().items():
            # 計算訓練后與訓練前的差值
            diff[name] = (data - model.state_dict()[name])
        print("Client %d local train done" % self.client_id)
        # 客戶端返回差值
        return diff

2.4 整合

所有程序代碼在main.py

import argparse
import json
import random

import datasets
from client import *
from server import *

if __name__ == '__main__':

    # 設(shè)置命令行程序
    parser = argparse.ArgumentParser(description='Federated Learning')
    parser.add_argument('-c', '--conf', dest='conf')
    # 獲取所有的參數(shù)
    args = parser.parse_args()

    # 讀取配置文件
    with open(args.conf, 'r') as f:
        conf = json.load(f)

    # 獲取數(shù)據(jù)集, 加載描述信息
    train_datasets, eval_datasets = datasets.get_dataset("./data/", conf["type"])

    # 開啟服務(wù)器
    server = Server(conf, eval_datasets)
    # 客戶端列表
    clients = []

    # 添加10個客戶端到列表
    for c in range(conf["no_models"]):
        clients.append(Client(conf, server.global_model, train_datasets, c))

    print("\n\n")

    # 全局模型訓練
    for e in range(conf["global_epochs"]):
        print("Global Epoch %d" % e)
        # 每次訓練都是從clients列表中隨機采樣k個進行本輪訓練
        candidates = random.sample(clients, conf["k"])
        print("select clients is: ")
        for c in candidates:
            print(c.client_id)

        # 權(quán)重累計
        weight_accumulator = {}

        # 初始化空模型參數(shù)weight_accumulator
        for name, params in server.global_model.state_dict().items():
            # 生成一個和參數(shù)矩陣大小相同的0矩陣
            weight_accumulator[name] = torch.zeros_like(params)

        # 遍歷客戶端,每個客戶端本地訓練模型
        for c in candidates:
            diff = c.local_train(server.global_model)

            # 根據(jù)客戶端的參數(shù)差值字典更新總體權(quán)重
            for name, params in server.global_model.state_dict().items():
                weight_accumulator[name].add_(diff[name])

        # 模型參數(shù)聚合
        server.model_aggregate(weight_accumulator)

        # 模型評估
        acc, loss = server.model_eval()

        print("Epoch %d, acc: %f, loss: %f\n" % (e, acc, loss))

2.5 測試

按照以上配置,(本人)運行后的準確度以及損失為:

聯(lián)邦學習實戰(zhàn)-1:用python從零開始實現(xiàn)橫向聯(lián)邦學習

官方的對比:

聯(lián)邦學習與中心化訓練的效果對比

聯(lián)邦學習實戰(zhàn)-1:用python從零開始實現(xiàn)橫向聯(lián)邦學習

  • 聯(lián)邦訓練配置:一共10臺客戶端設(shè)備(no_models=10),每一輪任意挑選其中的5臺參與訓練(k=5), 每一次本地訓練迭代次數(shù)為3次(local_epochs=3),全局迭代次數(shù)為20次(global_epochs=20)。
  • 集中式訓練配置:我們不需要單獨編寫集中式訓練代碼,只需要修改聯(lián)邦學習配置既可使其等價于集中式訓練。具體來說,我們將客戶端設(shè)備no_models和每一輪挑選的參與訓練設(shè)備數(shù)k都設(shè)為1即可。這樣只有1臺設(shè)備參與的聯(lián)邦訓練等價于集中式訓練。其余參數(shù)配置信息與聯(lián)邦學習訓練一致。圖中我們將局部迭代次數(shù)分別設(shè)置了1,2,3來進行比較。

聯(lián)邦學習在模型推斷上的效果對比

聯(lián)邦學習實戰(zhàn)-1:用python從零開始實現(xiàn)橫向聯(lián)邦學習

圖中的單點訓練只的是在某一個客戶端下,利用本地的數(shù)據(jù)進行模型訓練的結(jié)果。

  • 我們看到單點訓練的模型效果(藍色條)明顯要低于聯(lián)邦訓練 的效果(綠色條和紅色條),這也說明了僅僅通過單個客戶端的數(shù)據(jù),不能夠 很好的學習到數(shù)據(jù)的全局分布特性,模型的泛化能力較差。
  • 此外,對于每一輪 參與聯(lián)邦訓練的客戶端數(shù)目(k 值)不同,其性能也會有一定的差別,k 值越大,每一輪參與訓練的客戶端數(shù)目越多,其性能也會越好,但每一輪的完成時間也會相對較長。

學習資料來自于:

楊強:《聯(lián)邦學習實戰(zhàn)》

https://github.com/FederatedAI/Practicing-Federated-Learning/tree/main/chapter03_Python_image_classification文章來源地址http://www.zghlxwxcb.cn/news/detail-403703.html

到了這里,關(guān)于聯(lián)邦學習實戰(zhàn)-1:用python從零開始實現(xiàn)橫向聯(lián)邦學習的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔相關(guān)法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 從零開始學習Python控制開源Selenium庫自動化瀏覽器操作,實現(xiàn)爬蟲,自動化測試等功能(一)

    從零開始學習Python控制開源Selenium庫自動化瀏覽器操作,實現(xiàn)爬蟲,自動化測試等功能(一)

    介紹Selenium : Selenium是一個用于自動化瀏覽器操作的開源工具和庫。它最初是為Web應(yīng)用測試而創(chuàng)建的,但隨著時間的推移,它被廣泛用于Web數(shù)據(jù)抓取和網(wǎng)頁自動化操作。Selenium 支持多種編程語言,包括Python,Java,C#等。 這里我們主要實現(xiàn)采用Python的方式 Selenium 的主要特點和

    2024年01月22日
    瀏覽(92)
  • AI提示工程實戰(zhàn):從零開始利用提示工程學習應(yīng)用大語言模型【文末送書-19】

    AI提示工程實戰(zhàn):從零開始利用提示工程學習應(yīng)用大語言模型【文末送書-19】

    隨著人工智能技術(shù)的飛速發(fā)展,大語言模型如GPT-4等在自然語言處理領(lǐng)域取得了令人矚目的成果。而對于普通用戶而言,如何利用這些強大的模型進行實際應(yīng)用成為一個備受關(guān)注的話題。本文將介紹一種稱之為“提示工程”的方法,通過簡單的提示構(gòu)建,讓大語言模型為我們

    2024年02月19日
    瀏覽(25)
  • 【Spring教程28】Spring框架實戰(zhàn):從零開始學習SpringMVC 之 請求與請求參數(shù)詳解

    【Spring教程28】Spring框架實戰(zhàn):從零開始學習SpringMVC 之 請求與請求參數(shù)詳解

    歡迎大家回到《Java教程之Spring30天快速入門》,本教程所有示例均基于Maven實現(xiàn),如果您對Maven還很陌生,請移步本人的博文《如何在windows11下安裝Maven并配置以及 IDEA配置Maven環(huán)境》,本文的上一篇為《PostMan工具的安裝與使用技巧》 前面我們已經(jīng)完成了入門案例相關(guān)的知識學

    2024年02月03日
    瀏覽(28)
  • Python入門指南:從零開始學習Python編程

    Python入門指南:從零開始學習Python編程

    Python是一種簡單而又強大的編程語言,它在全球范圍內(nèi)廣受歡迎,適用于各種應(yīng)用場景,包括Web開發(fā)、數(shù)據(jù)分析、人工智能和科學計算等。本篇博客將為初學者提供一份Python入門指南,幫助你從零開始掌握Python編程基礎(chǔ)。 首先,我們需要安裝Python解釋器。前往Python官方網(wǎng)站(

    2024年02月14日
    瀏覽(24)
  • 【Spring教程23】Spring框架實戰(zhàn):從零開始學習SpringMVC 之 SpringMVC簡介與SpringMVC概述

    【Spring教程23】Spring框架實戰(zhàn):從零開始學習SpringMVC 之 SpringMVC簡介與SpringMVC概述

    歡迎大家回到《Java教程之Spring30天快速入門》,本教程所有示例均基于Maven實現(xiàn),如果您對Maven還很陌生,請移步本人的博文《如何在windows11下安裝Maven并配置以及 IDEA配置Maven環(huán)境》,本文的上一篇為《Spring事務(wù)角色與 Spring事務(wù)屬性、事務(wù)傳播行為》 從這一節(jié)開始,我們開始

    2024年02月03日
    瀏覽(25)
  • 【Spring教程29】Spring框架實戰(zhàn):從零開始學習SpringMVC 之 服務(wù)器響應(yīng)知識全面詳解

    【Spring教程29】Spring框架實戰(zhàn):從零開始學習SpringMVC 之 服務(wù)器響應(yīng)知識全面詳解

    歡迎大家回到《Java教程之Spring30天快速入門》,本教程所有示例均基于Maven實現(xiàn),如果您對Maven還很陌生,請移步本人的博文《如何在windows11下安裝Maven并配置以及 IDEA配置Maven環(huán)境》,本文的上一篇為《SpringMVC 之 請求與請求參數(shù)詳解》 上一節(jié)我們說了SpringMvc請求知識,這一節(jié)

    2024年02月03日
    瀏覽(32)
  • 機器學習&&深度學習——RNN的從零開始實現(xiàn)與簡潔實現(xiàn)

    機器學習&&深度學習——RNN的從零開始實現(xiàn)與簡潔實現(xiàn)

    ?????作者簡介:一位即將上大四,正專攻機器學習的保研er ??上期文章:機器學習深度學習——循環(huán)神經(jīng)網(wǎng)絡(luò)RNN ??訂閱專欄:機器學習深度學習 希望文章對你們有所幫助 我們將在之前所說的《時光機器》數(shù)據(jù)集上訓練,先讀取數(shù)據(jù)集: 回想一下,在train_iter中,每個詞

    2024年02月13日
    瀏覽(24)
  • 機器學習&&深度學習——線性回歸的從零開始實現(xiàn)

    機器學習&&深度學習——線性回歸的從零開始實現(xiàn)

    雖然現(xiàn)在的深度學習框架幾乎可以自動化實現(xiàn)下面的工作,但從零開始實現(xiàn)可以更了解工作原理,方便我們自定義模型、自定義層或自定義損失函數(shù)。 根據(jù)帶有噪聲的線性模型構(gòu)造一個人造數(shù)據(jù)集。任務(wù)是使用這個數(shù)據(jù)集來恢復模型的參數(shù)。我們使用低維數(shù)據(jù),可以更容易地

    2024年02月15日
    瀏覽(20)
  • 從零開始的Django框架入門到實戰(zhàn)教程(內(nèi)含實戰(zhàn)實例) - 01 創(chuàng)建項目與app、加入靜態(tài)文件、模板語法介紹(學習筆記)

    從零開始的Django框架入門到實戰(zhàn)教程(內(nèi)含實戰(zhàn)實例) - 01 創(chuàng)建項目與app、加入靜態(tài)文件、模板語法介紹(學習筆記)

    ??Django是目前比較火爆的框架,之前有在知乎刷到,很多畢業(yè)生進入大廠實習后因為不會git和Django框架3天就被踢掉了,因為他們很難把自己的工作融入到整個組的工作中。因此,我嘗試自學Django并整理出如下筆記。 ??在這部分,我將從Django的安裝講起,從創(chuàng)建項目到制

    2024年02月09日
    瀏覽(27)
  • 從零開始學習Python基礎(chǔ)語法:打開編程大門的鑰匙

    從零開始學習Python基礎(chǔ)語法:打開編程大門的鑰匙

    重溫Python,適合新手搭建知識體系,也適合大佬的溫故知新~ 1.1 Python作為一種流行的編程語言的介紹 Python是一種流行的高級編程語言,以其簡潔、易讀和強大的特性而備受開發(fā)者歡迎。它由 Guido van Rossum 于 1991 年創(chuàng)建,并且在過去幾十年中得到了廣泛的發(fā)展和應(yīng)用。 Python作

    2024年01月20日
    瀏覽(46)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包