Buckets:
| # Расширенные возможности Interface[[advanced-interface-features]] | |
| <CourseFloatingBanner chapter={9} | |
| classNames="absolute z-10 right-0 top-0" | |
| notebooks={[ | |
| {label: "Google Colab", value: "https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter9/section6.ipynb"}, | |
| {label: "Aws Studio", value: "https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter9/section6.ipynb"}, | |
| ]} /> | |
| Теперь, когда мы можем создать базовый интерфейс и поделиться им, давайте изучим некоторые более продвинутые возможности, такие как состояние и интерпретации. | |
| ### Использование состояния для сохранения данных[[using-state-to-persist-data]] | |
| Gradio поддерживает *состояние сеанса*, когда данные сохраняются при нескольких отправках в рамках | |
| загруженной страницы. Состояние сессии полезно для создания демо, например, чат-ботов, где необходимо | |
| сохранять данные по мере того, как пользователь взаимодействует с моделью. Обратите внимание, что состояние сессии не позволяет обмениваться данными между разными пользователями вашей модели. | |
| Чтобы хранить данные о состоянии сеанса, необходимо выполнить три действия: | |
| 1. Передайте в вашу функцию *дополнительный параметр*, который представляет собой состояние интерфейса. | |
| 2. В завершении работы функции верните обновленное значение состояния в качестве *дополнительного возвращаемого значения*. | |
| 3. Добавьте входной компонент 'state' и выходной компонент 'state' при создании вашего `Interface`. | |
| Посмотрите пример чатбота ниже: | |
| ```py | |
| import random | |
| import gradio as gr | |
| def chat(message, history): | |
| 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 | |
| iface = gr.Interface( | |
| chat, | |
| ["text", "state"], | |
| ["chatbot", "state"], | |
| allow_screenshot=False, | |
| allow_flagging="never", | |
| ) | |
| iface.launch() | |
| ``` | |
| <iframe src="https://course-demos-Chatbot-Demo.hf.space" frameBorder="0" height="350" title="Gradio app" class="container p-0 flex-grow space-iframe" allow="accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"></iframe> | |
| Обратите внимание, что состояние выходного компонента сохраняется при всех отправках данных. | |
| Примечание: в параметр state можно передать значение по умолчанию, | |
| которое используется в качестве начального значения состояния. | |
| ### Использование интерпретации для понимания прогнозов[[using-interpretation-to-understand-predictions]] | |
| Большинство моделей машинного обучения представляют собой "черные ящики", и внутренняя логика функции скрыта от конечного пользователя. Чтобы стимулировать прозрачность, мы упростили добавление интерпретации в вашу модель, просто задав ключевое слово interpretation в классе Interface по умолчанию. Это позволит вашим пользователям понять, какие части входных данных отвечают за вывод. Взгляните на простой интерфейс ниже, который показывает классификатор изображений, также включающий интерпретацию: | |
| ```py | |
| import requests | |
| import tensorflow as tf | |
| import gradio as gr | |
| inception_net = tf.keras.applications.MobileNetV2() # загрузим модель | |
| # Загрузим человекочитаемые метки для 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) под компонентом вывода. | |
| <iframe src="https://course-demos-gradio-image-interpretation.hf.space" frameBorder="0" height="570" title="Gradio app" class="container p-0 flex-grow space-iframe" allow="accelerometer; ambient-light-sensor; autoplay; battery; camera; document-domain; encrypted-media; fullscreen; geolocation; gyroscope; layout-animations; legacy-image-formats; magnetometer; microphone; midi; oversized-images; payment; picture-in-picture; publickey-credentials-get; sync-xhr; usb; vr ; wake-lock; xr-spatial-tracking" sandbox="allow-forms allow-modals allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts allow-downloads"></iframe> | |
| Помимо метода интерпретации, предоставляемого Gradio по умолчанию, вы также можете задать `shap` для параметра `interpretation` и установить параметр `num_shap`. При этом используется интерпретация на основе Шэпли, о которой вы можете подробнее прочитать [здесь](https://christophm.github.io/interpretable-ml-book/shap.html). Наконец, в параметр `interpretation` можно передать собственную функцию интерпретации. Пример можно посмотреть на странице Gradio, посвященной началу работы [здесь](https://gradio.app/getting_started/). | |
| На этом мы завершаем наше глубокое погружение в класс `Interface` в Gradio. Как мы уже видели, этот класс позволяет создавать демо машинного обучения в несколько строк кода на Python. Однако иногда возникает необходимость доработать демо, изменив его макет или соединив несколько функций предсказания в цепочку. Было бы здорово, если бы мы могли как-то разделить `Interface` на настраиваемые "блоки"? К счастью, такая возможность есть! Этой теме посвящен последний раздел. | |
| <EditOnGithub source="https://github.com/huggingface/course/blob/main/chapters/ru/chapter9/6.mdx" /> |
Xet Storage Details
- Size:
- 8.62 kB
- Xet hash:
- ef6fb0ab1a578e5bdddd14d797ba2239524f79b2a495394302bc87e35ae4d4aa
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.