数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- lightgbm
- xgboost
- scikit-learn
- spark
- numpy
- matplotlib
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
二、高级功能
使用状态保存数据:
Gradio
支持 ”会话状态“,其中数据在页面加载中的多次提交中持续存在。会话状态对于构建演示很有用,例如,聊天机器人需要保留历史会话数据。请注意, 会话状态不会在模型的不同用户之间共享数据。要将数据存储在会话状态中,你需要做三件事:
向函数中传递一个额外的参数,该参数表示
Interface
的状态。
在函数结束时, 将状态的更新后的值以额外的返回值来返回
在创建
Interface
时添加state input
组件和state output
组件。
例如下面的聊天机器人的例子:
xxxxxxxxxx
import random import gradio as gr def chat(message, history): # history 存储 Interface 的状态 history = history or [] if message.startswith("How many"): response = random.randint(1, 10) elif message.startswith("How"): response = random.choice(["Great", "Good", "Okay", "Bad"]) elif message.startswith("Where"): response = random.choice(["Here", "There", "Somewhere"]) else: response = "I don't know" history.append((message, response)) return history, history # history 作为额外的返回值 iface = gr.Interface( chat, ["text", "state"], ["chatbot", "state"], allow_screenshot=False, allow_flagging="never", ) iface.launch()注意:可以给
state
参数(即,history
变量)传入一个默认值,作为state
的初始值。为输出结果提供解释:大多数机器学习模型都是黑盒子,函数的内部逻辑对终端用户是隐藏的。为了提高透明度,我们通过简单地将
Interface
类中的interpretation
关键字设置为默认值,使得向模型添加解释变得非常容易。这允许你的用户理解输入的哪些部分负责输出。示例:
xxxxxxxxxx
import requests import tensorflow as tf import gradio as gr inception_net = tf.keras.applications.MobileNetV2() # load the model # Download human-readable labels for ImageNet. response = requests.get("https://git.io/JJkYN") labels = response.text.split("\n") def classify_image(inp): inp = inp.reshape((-1, 224, 224, 3)) inp = tf.keras.applications.mobilenet_v2.preprocess_input(inp) prediction = inception_net.predict(inp).flatten() return {labels[i]: float(prediction[i]) for i in range(1000)} image = gr.Image(shape=(224, 224)) label = gr.Label(num_top_classes=3) title = "Gradio Image Classifiction + Interpretation Example" gr.Interface( fn=classify_image, inputs=image, outputs=label, interpretation="default", title=title ).launch()通过提交一个输入,然后单击输出组件下的
Interpret
来测试解释功能。除了
Gradio
提供的default
解释方法之外,你还可以为interpretation
参数指定shap
,并设置num_shap
参数。这使用基于Shapley
的解释。最后,还可以将自己的解释函数传入interpretation
参数。Blocks
:Blocks
是底层的API
,它和Interface
的区别在于:Interface
:高级API
,让你只需提供input
和output
组件,即可创建完整的机器学习演示。Block
:低级API
,它允许你完全控制你的应用程序的数据流和布局。
为什么要用
Block
?虽然Interface API
非常易于使用,但是缺乏Blocks API
提供的灵活性。例如:将一组演示整合成
web application
中的多个选项卡。更改
demo
的布局,例如,指定input
组件和output
组件的位置。具有
multi-step
的接口,其中一个模型的输出作为下一个模型的输入,或者通常具有更灵活的数据流。根据用户输入来调整组件的属性(如下拉列表的选项)、或可见性。
简单的示例:
xxxxxxxxxx
import gradio as gr def flip_text(x): return x[::-1] demo = gr.Blocks() with demo: gr.Markdown( """ # Flip Text! Start typing below to see the output. """ ) input = gr.Textbox(placeholder="Flip this text") output = gr.Textbox() input.change(fn=flip_text, inputs=input, outputs=output) # input 的 change 事件触发器 demo.launch()上述简单示例介绍了
block
的4
个基本概念:block
允许你允许你构建结合了markdown
、HTML
、button
、以及交互组件的web
应用程序,只需实例化这些组件。实例化组件的顺序很重要,因为每个元素都按照创建的顺序呈现到
web
应用程序中。更复杂的布局将在接下来讨论。你可以在代码中的任何位置定义常规
Python
函数, 并使用block
在用户输入的情况下运行它们。如示例中的flip_text
函数。你可以编写任何Python
函数, 从简单的计算到处理机器学习模型预测。你可以将事件指定给任何
block
组件。这将在组件被单击、被修改等情况下运行函数。当你分配一个事件时,你传入三个参数:fn
:事件发生时,应该被调用的函数。inputs
:被调用的输入组件(及其列表)outputs
:被调用的输出组件(及其列表)
在上面的示例中,当名为
input
的Textbox
中的值发生变化时,我们运行flip_text()
函数。该事件读取input
组件中的值,将其作为参数传递给flip_text()
,然后该函数返回一个值从而被传递给名为output
的Textbox
。block
会根据你定义的事件触发器自动确定组件是否应该是交互式的(接受用户输入)。在我们的示例中:第一个文本框是交互式的,因为它的值由
flip_text()
函数使用。第二个文本框不是交互式的,因为它的值从不用作输入。
在某些情况下,你可能想要覆盖它。此时,你可以通过传递一个布尔值给组件的
interactive
参数。例如gr.Textbox(placeholder="Flip this text", interactive=True)
。
自定义布局:默认情况下,
block
在单列中垂直呈现创建的组件。你可以通过使用with gradio.Column():
创建其他列或使用with gradio.Row():
创建其他行,从而在这些上下文中创建组件来改变这一点。注意:在Column
下创建的任何组件都将垂直布局(这也是默认设置);在Row
下创建的任何组件都将水平布局。最后,你还可以使用
with gradio.Tabs()
上下文管理器为你的demo
创建选项卡。在此上下文中,你可以通过使用gradio.TabItem(name_of_tab):
指定来创建选项卡的多个选项。在gradio.TabItem(name_of_tab):
中创建的任何组件都会出现在该选项卡中。示例:
xxxxxxxxxx
import numpy as np import gradio as gr demo = gr.Blocks() def flip_text(x): return x[::-1] def flip_image(x): return np.fliplr(x) with demo: gr.Markdown("Flip text or image files using this demo.") # 一个 Markdown 组件 with gr.Tabs(): # 一个选项卡 with gr.TabItem("Flip Text"): with gr.Row(): # 一行 text_input = gr.Textbox() text_output = gr.Textbox() text_button = gr.Button("Flip") with gr.TabItem("Flip Image"): with gr.Row(): image_input = gr.Image() image_output = gr.Image() image_button = gr.Button("Flip") text_button.click(flip_text, inputs=text_input, outputs=text_output) image_button.click(flip_image, inputs=image_input, outputs=image_output) demo.launch()探索事件和状态:正如你可以控制布局一样,
block
可以让你对触发函数调用的事件进行细粒度控制。每个组件和许多布局都有它们支持的特定事件。例如。Textbox
组件有两个事件:change()
:当文本框内的值发生变化时,该事件发生。submit()
:当用户焦点在文本框时且按下enter
键,则该事件发生。
更复杂的组件可以有更多的事件。例如,
Audio
组件也有单独的事件,用于播放、清除、暂停音频文件等。你可以将事件触发器附加到这些事件中的一个或多个。你可以通过在组件实例中调用事件名称作为函数来创建一个事件触发器。例如
textbox.change(...)
或btn.click(...)
。如前所述, 该函数接受三个参数:fn
:当该事件发生时需要回调的函数。inputs
:组件(及其列表), 其值应作为fn
函数的输入参数提供。每个组件的值按顺序映射到相应的函数参数。如果fn
函数不带任何参数,则此参数可以为None
。outputs
:应根据函数返回的值更新其值的组件(及其列表)。每个返回值按顺序设置相应组件的值。如果fn
函数不返回任何内容,则此参数可以为None
。
你甚至可以使输入和输出组件成为同一个组件,如:
xxxxxxxxxx
import gradio as gr api = gr.Interface.load("huggingface/EleutherAI/gpt-j-6B") def complete_with_gpt(text): # Use the last 50 characters of the text as context return text[:-50] + api(text[-50:]) with gr.Blocks() as demo: textbox = gr.Textbox(placeholder="Type here and press enter...", lines=4) btn = gr.Button("Generate") btn.click(complete_with_gpt, textbox, textbox) demo.launch()创建多步骤的演示:在某些情况下, 您可能需要一个多步骤的演示,其中复用一个函数的输出作为下一个函数的输入。使用
block
很容易做到这一点,因为你可以使用某个组件作为一个事件触发器的输入,但作为另一个事件触发器的输出。例如:一个文本组件,它的值是语音到文本模型的结果,但也被传递到情感分析模型中:
xxxxxxxxxx
from transformers import pipeline import gradio as gr asr = pipeline("automatic-speech-recognition", "facebook/wav2vec2-base-960h") classifier = pipeline("text-classification") def speech_to_text(speech): text = asr(speech)["text"] return text def text_to_sentiment(text): return classifier(text)[0]["label"] demo = gr.Blocks() with demo: audio_file = gr.Audio(type="filepath") text = gr.Textbox() label = gr.Label() b1 = gr.Button("Recognize Speech") b2 = gr.Button("Classify Sentiment") b1.click(speech_to_text, inputs=audio_file, outputs=text) b2.click(text_to_sentiment, inputs=text, outputs=label) demo.launch()更新组件的属性:到目前为止,我们已经了解了如何创建事件来更新另一个组件的值。但是,如果你想更改组件的其他属性(例如文本框的可见性) ,那么你可以通过返回组件类的
update()
方法而不是返回常规的返回值来做到这一点。示例:
import gradio as gr def change_textbox(choice): if choice == "short": return gr.Textbox.update(lines=2, visible=True) elif choice == "long": return gr.Textbox.update(lines=8, visible=True) else: return gr.Textbox.update(visible=False) with gr.Blocks() as block: radio = gr.Radio( ["short", "long", "none"], label="What kind of essay would you like to write?" ) text = gr.Textbox(lines=2, interactive=True) radio.change(fn=change_textbox, inputs=radio, outputs=text) block.launch()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论