Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
是否正在為創(chuàng)建專業(yè)的個(gè)人作品集網(wǎng)站而苦惱?別再猶豫了!您可以使用開發(fā)者作品集模板,立即創(chuàng)建您自己的個(gè)性化作品集!我的網(wǎng)站設(shè)計(jì)用戶友好且易于定制,非常適合開發(fā)人員和自由職業(yè)者。
部分
您需要下載 Git 和 Node 來運(yùn)行此項(xiàng)目
確保您的計(jì)算機(jī)上安裝了最新版本的 Git 和 Node。
node --version
git --version
要 Fork 倉庫,請單擊頁面右上角的 fork 按鈕。Fork 倉庫后,打開終端并執(zhí)行以下命令
git clone https://github.com/<YOUR GITHUB USERNAME>/developer-portfolio.git
cd developer-portfolio
從根目錄安裝軟件包
npm install
# or
yarn install
然后,運(yùn)行開發(fā)服務(wù)器:
npm run dev
# or
yarn dev
使用瀏覽器打開 http://localhost:3000 查看結(jié)果。
前往 emailjs.com 并創(chuàng)建一個(gè)新帳戶以發(fā)送郵件。在免費(fèi)試用版中,您每月將獲得 200 封郵件。設(shè)置 emailjs 帳戶后,請從 .env.example 文件創(chuàng)建一個(gè)新的 .env 文件。
例如:
NEXT_PUBLIC_EMAILJS_SERVICE_ID=NEXT_PUBLIC_EMAILJS_TEMPLATE_ID=NEXT_PUBLIC_EMAILJS_PUBLIC_KEY=NEXT_PUBLIC_GTM=# For site analytics
NEXT_PUBLIC_APP_URL="http://127.0.0.1:3000"
NEXT_PUBLIC_RECAPTCHA_SECRET_KEY=# For captcha verification on contact form
NEXT_PUBLIC_RECAPTCHA_SITE_KEY=
然后,在 utils/data 文件夾中自定義數(shù)據(jù)。
例如:
export const personalData={
name: "ABU SAID",
profile: "/profile.png",
designation: "Full-Stack Software Developer",
description: "My name is ABU SAID....",
email: "abusaid7388@gmail.com",
phone: "+8801608797655",
address: "Dhaka, Bangladesh",
github: "https://github.com/said7388",
facebook: "https://www.facebook.com/abusaid.riyaz/",
linkedIn: "https://www.linkedin.com/in/abu-said-bd/",
twitter: "https://twitter.com/said7388",
stackOverflow: "https://stackoverflow.com/users/16840768/abu-said",
leetcode: "https://leetcode.com/said3812/",
devUsername: "said7388",
resume: "...",
};
devUsername 用于從 dev.to 獲取博客。
使用的軟件包列表
項(xiàng)目地址:https://github.com/said7388/developer-portfolio
指南將引導(dǎo)你學(xué)習(xí)構(gòu)建一個(gè)自動(dòng)完成任意輸入文本的Web應(yīng)用程序。
作者 | Dev Sharma
譯者 | 蘇本如,責(zé)編 | 郭芮
出品 | CSDN(ID:CSDNnews)
以下為譯文:
在本文中,我們將使用OpenAI的新一代表語言模型GPT-2來建立模型,使用Panel框架來構(gòu)建web頁面的儀表板。本指南分為兩部分。在第一部分中,我們將加載我們的模型并編寫一個(gè)預(yù)測函數(shù)。在第二部分中,我們將構(gòu)建一個(gè)web應(yīng)用程序。
自動(dòng)生成文本的應(yīng)用程序示例。我們將構(gòu)建這個(gè)web應(yīng)用程序的一個(gè)更簡單的變體。
準(zhǔn)備工作
本教程假設(shè)你已經(jīng)安裝了Python 3.7+,并且對語言模型有一定的了解。盡管本教程所涉及的所有步驟都可以在Jupyter之外完成,但是強(qiáng)烈建議你使用jupyter notebook。
我們將使用PyTorch作為我們選擇的深度學(xué)習(xí)庫。在PyTorch中,我們將使用transformers庫導(dǎo)入預(yù)先訓(xùn)練好的OpenGPT-2模型。可以通過在bash命令行中分別輸入以下命令來安裝這些庫:
pip install torch
pip install transformers
對于我們的web應(yīng)用程序,我們將利用Panel這個(gè)窗口容器/框架,這是一個(gè)很好的工具,可以被用來從jupyter notebooks或者常規(guī)的Python腳本中輕松地創(chuàng)建可維護(hù)的儀表板。可以使用以下命令安裝Panel:
pip install panel
第一部分:建立模型
OpenAI的GPT是一種基于transformer的語言模型,它在生成類似人類語言的文本方面受到了很多關(guān)注。如果你以前沒有嘗試過,你很可能會(huì)在閱讀結(jié)束時(shí)得出同樣的觀點(diǎn)。
加載模型
首先,我們需要導(dǎo)入所需的包。詳情如下:
import numpy as np
import torch
import torch.nn.functional as F
from transformers import GPT2Tokenizer, GPT2LMHeadModel
from random import choice
接下來,我們將加載OpenGPT2的Tokenizer和語言模型:(如果是第一次運(yùn)行,可能需要幾分鐘下載預(yù)先訓(xùn)練的模型)
tok=GPT2Tokenizer.from_pretrained("gpt2")
model=GPT2LMHeadModel.from_pretrained("gpt2")
預(yù)測函數(shù)
在這個(gè)階段,大部分工作已經(jīng)完成了。因?yàn)槲覀兊哪P褪穷A(yù)先訓(xùn)練過的,所以我們不需要再次訓(xùn)練它或做任何修改。我們只需要編寫一個(gè)函數(shù),它可以向模型輸入文本并生成預(yù)測的文本。
def get_pred(text, model, tok, p=0.7):
input_ids=torch.tensor(tok.encode(text)).unsqueeze(0)
logits=model(input_ids)[0][:, -1]
probs=F.softmax(logits, dim=-1).squeeze
idxs=torch.argsort(probs, descending=True)
res, cumsum=, 0.
for idx in idxs:
res.append(idx)
cumsum +=probs[idx]
if cumsum > p:
pred_idx=idxs.new_tensor([choice(res)])
break
pred=tok.convert_ids_to_tokens(int(pred_idx))
return tok.convert_tokens_to_string(pred)
這個(gè)函數(shù)中發(fā)生了很多事情。因此,讓我們把它分解來看看。首先,我們對input_ids中的輸入文本進(jìn)行標(biāo)記(tokenize)和編碼(encode)。接著,我們要求我們的模型為下一個(gè)單詞/標(biāo)記(token)生成一個(gè)logits向量。在應(yīng)用softmax函數(shù)并按降序?qū)@些可能的概率結(jié)果進(jìn)行排序之后,我們得到了一個(gè)向量idxs,它按各自的概率順序列出了每個(gè)token的索引。
在這個(gè)階段,我們可以選擇概率最高的token。但是,我們希望能夠混合結(jié)果,以便相同的輸入文本可以生成各種文本。為此,我們將添加一個(gè)隨機(jī)元素,從最可能的下一個(gè)token列表中選擇一個(gè)隨機(jī)token。這樣的話,我們就不會(huì)每次都選擇相同的預(yù)測token。為了做到這一點(diǎn),我們采用了Nucleus (Top-p) Sampling 方式。
我們通過循環(huán)遍歷每個(gè)概率來執(zhí)行此操作,直到循環(huán)遍歷的所有概率之和大于p(這里的p是一個(gè)介于0到1之間的任意數(shù)字)。當(dāng)p被超過前,所有遍歷到的token都將被存儲(chǔ)在列表res中。一旦p被超過,我們就從這個(gè)列表中隨機(jī)選擇一個(gè)token。請記住,我們正在遍歷的概率列表包含了其按概率排序的索引。注意,p值越高,我們的列表中將包含更多的token。反之亦然。因此,如果每次都希望得到相同的結(jié)果,可以將p值設(shè)置為0。
現(xiàn)在,讓我們測試一下我們的預(yù)測函數(shù):
每次都會(huì)有不同的結(jié)果,這正是我們所期望的。現(xiàn)在,我們的預(yù)測功能準(zhǔn)備好了。讓我們開始構(gòu)建我們的Web應(yīng)用程序吧!
第二部分:構(gòu)建web應(yīng)用程序
Panel框架簡介
如果你還不熟悉Panel框架,那請記住,Panel框架可以幫助我們創(chuàng)建一個(gè)web儀表板和web應(yīng)用程序。簡而言之,你需要知道的是它有三個(gè)主要組件:
Panel:可以包含一個(gè)或多個(gè)窗格(pane)對象的容器,面板(pane)對象是指文本、圖像、圖形、小部件等(也可以包含其他panel);
Pane:任何單個(gè)對象,例如文本、圖像、數(shù)據(jù)幀等;
Widget(小部件):用戶可以自行調(diào)整的項(xiàng)目,包括文本輸入框、滑塊、按鈕、復(fù)選框,等等可以改變窗格的行為的小部件。
下一個(gè)也是最后一個(gè)你需要知道的事情是:我們有多種方法來定義不同的窗格和小部件之間的交互方式,我們稱之為“callback(回調(diào))”。例如,如果按下某個(gè)按鈕,其他窗格應(yīng)該如何更新呢?稍后我們將定義一個(gè)回調(diào)函數(shù)來演示它將如何準(zhǔn)確地做到這一點(diǎn)。
Web應(yīng)用程序簡介
我們的文本生成器應(yīng)用程序?qū)⒂幸粋€(gè)輸入窗口,以便用戶輸入他們想要輸入的文本。接下來,用戶應(yīng)該能夠通過按下按鈕生成新的token。在這之后,它將使用我們在第一部分中定義的預(yù)測函數(shù)來預(yù)測新的token來生成新文本。最后,用戶應(yīng)該能夠在已經(jīng)預(yù)測的token基礎(chǔ)之上繼續(xù)生成新的文本。
實(shí)施
讓我們首先導(dǎo)入Panel并創(chuàng)建文本輸入小部件:
import panel as pn
pn.extension # loading panel's extension for jupyter compatibility text_input=pn.widgets.TextInput
現(xiàn)在,如果在jupyter中執(zhí)行文本輸入,我們將得到以下結(jié)果:
接下來,我們需要一個(gè)窗格,它會(huì)在越來越多的token生成時(shí)存儲(chǔ)整個(gè)文本:
generated_text=pn.pane.Markdown(object=text_input.value)
注意,這里我們將文本對象設(shè)置為text_input的值。我們希望generated_text的值與text_input的值相同,因?yàn)槲覀儗⒁趃enerated_text之上預(yù)測新文本。隨著越來越多的token被添加到我們的序列中,我們將繼續(xù)基于generated_text進(jìn)行預(yù)測,直到用戶改變了text_input。一旦用戶改變了text_input,這個(gè)進(jìn)程將重新啟動(dòng)。
然而,到這里事情還沒有完全結(jié)束。盡管generated_text將在開始時(shí)接受text_input的值,但如果text_input值發(fā)生更改,generated_text值將不會(huì)自我更新。為此,我們需要像下面這樣將這兩個(gè)對象鏈接在一起:
text_input.link(generated_text, value='object')
這里,我們在text_input和generated_text之間形成了單向鏈接。因此,每當(dāng)text_input的值發(fā)生更改時(shí),generated_text值也將更改為新值。如下所示:
觀察面板中文的text_input和generated_text之間的鏈接行為。注意:作為組件的pn.Row也是一個(gè)面板,即它是一個(gè)窗格和小部件的容器。
現(xiàn)在我們有了兩個(gè)文本對象,讓我們來創(chuàng)建按鈕小部件:
button=pn.widgets.Button(name="Generate",button_type="primary")
很好,現(xiàn)在我們有了一個(gè)按鈕,我們只需要把它和我們想要的行為鏈接起來。為此,我們將編寫一個(gè)回調(diào)函數(shù),該函數(shù)將在每次單擊按鈕時(shí)運(yùn)行:
def click_cb(event):
pred=get_pred(generated_text.object, model, tok)
generated_text.object +=pred
這里發(fā)生了兩件事。首先,我們將generated_text作為輸入傳遞給我們之前編寫的預(yù)測函數(shù),該函數(shù)將生成一個(gè)新的token。其次,將此token添加到generated_text中。每次新單擊按鈕時(shí),這個(gè)過程都會(huì)重復(fù)。
到這里,我們?nèi)匀恍枰獙粹o單擊事件與回調(diào)函數(shù)綁定在一起。我們可以這樣做:
button.on_click(click_cb)
我們現(xiàn)在已經(jīng)完成了所有小部件、窗格和函數(shù)的創(chuàng)建。接下來我們需要做的只是把這些東西放在一個(gè)面板里,然后看看會(huì)發(fā)現(xiàn)什么:
app=pn.Column(text_input, button, generated_text); app
注:pn.Column與pn.Row類似,它是另一種類型的panel,即小部件、窗格甚至其他panel的容器。
讓我們再添加一個(gè)標(biāo)題和一個(gè)簡短的描述,我們就大功告成了!
title=pn.pane.Markdown("# **Text Generator**")
desc=pn.pane.HTML("<marquee scrollamount='10'><b>Welcome to the text generator! In order to get started, simply enter some starting input text below, click generate a few times and watch it go!</b></marquee>")final_app=pn.Column(title, desc ,app)
服務(wù)你的Web應(yīng)用程序
Panel框架使得服務(wù)web應(yīng)用程序變得非常容易。有兩種方法可以用來做這件事。第一個(gè)是調(diào)用“.show”命令。這種方法通常用于調(diào)試,如下面所示。它將啟動(dòng)一個(gè)新窗口,在這個(gè)窗口中,一個(gè)名為final_app的 panel將作為一個(gè)web應(yīng)用程序運(yùn)行。
final_app.show
而為了讓它在生產(chǎn)環(huán)境中運(yùn)行,你需要使用“.servable”方法。但是,如果你以類似于show方法的方式運(yùn)行此操作,你的筆記本上不會(huì)出現(xiàn)任何東西,你必須像下面這樣在你的筆記本上運(yùn)行bash腳本:
panel serve --show text_generation_app.ipynb
只要你的筆記本中有以下代碼,這個(gè)操作將在本地端口上啟動(dòng)你的web應(yīng)用:
final_app.servable
大功告成!
現(xiàn)在,你自己有能力構(gòu)建一個(gè)自動(dòng)生成文本的應(yīng)用程序。你可以通過添加更多panel組件來進(jìn)一步完善它。你甚至可以將此應(yīng)用程序嵌入到其他項(xiàng)目中。像往常一樣,你可以在github上找到我的代碼庫。注意:下面圖片中的app是我在本教程中使用的app(text_generation_app.ipynb)的高級(jí)變體:。
原文:https://towardsdatascience.com/build-a-text-generator-web-app-in-under-50-lines-of-python-9b63d47edabb
本文為 CSDN 翻譯,轉(zhuǎn)載請注明來源出處。
【End】
習(xí)目標(biāo)
*請認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。