<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9D%D0%B0%D0%B1%D0%BB%D1%8E%D0%B4%D0%B0%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_TensorFlow_Keras</id>
	<title>Наблюдаемость TensorFlow Keras - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://doc.ruscomtech.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9D%D0%B0%D0%B1%D0%BB%D1%8E%D0%B4%D0%B0%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_TensorFlow_Keras"/>
	<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=%D0%9D%D0%B0%D0%B1%D0%BB%D1%8E%D0%B4%D0%B0%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_TensorFlow_Keras&amp;action=history"/>
	<updated>2026-04-21T10:32:56Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.36.1</generator>
	<entry>
		<id>https://doc.ruscomtech.ru/index.php?title=%D0%9D%D0%B0%D0%B1%D0%BB%D1%8E%D0%B4%D0%B0%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_TensorFlow_Keras&amp;diff=6161&amp;oldid=prev</id>
		<title>IKuznetsov: Новая страница: «'''TensorFlow''' и его удобный последовательный интерфейс '''Keras''' представляют собой передовую...»</title>
		<link rel="alternate" type="text/html" href="https://doc.ruscomtech.ru/index.php?title=%D0%9D%D0%B0%D0%B1%D0%BB%D1%8E%D0%B4%D0%B0%D0%B5%D0%BC%D0%BE%D1%81%D1%82%D1%8C_TensorFlow_Keras&amp;diff=6161&amp;oldid=prev"/>
		<updated>2026-02-04T16:21:28Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «&amp;#039;&amp;#039;&amp;#039;TensorFlow&amp;#039;&amp;#039;&amp;#039; и его удобный последовательный интерфейс &amp;#039;&amp;#039;&amp;#039;Keras&amp;#039;&amp;#039;&amp;#039; представляют собой передовую...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;'''TensorFlow''' и его удобный последовательный интерфейс '''Keras''' представляют собой передовую технологию для обучения и запуска моделей глубокого обучения.&lt;br /&gt;
&lt;br /&gt;
'''TensorFlow''' представляет собой универсальную платформу машинного обучения, которая позволяет специалистам по обработке данных создавать, обучать и запускать всевозможные модели искусственного интеллекта на её основе.&lt;br /&gt;
&lt;br /&gt;
'''TensorFlow''' также поставляется вместе с удобным сервером отладки под названием '''TensorBoard''', который позволяет специалистам по обработке данных собирать и визуализировать всю соответствующую информацию об обучении, такую ​​как логи, события и метрики, на веб-дашборде.&lt;br /&gt;
&lt;br /&gt;
'''TensorBoard''' — отличный инструмент для локальной отладки вашей модели ИИ, он неприменим для долговременного наблюдения за работающей моделью ИИ в производственной среде.&lt;br /&gt;
&lt;br /&gt;
Поскольку сбор данных в '''TensorBoard''' основан на гибком интерфейсе приема обратных вызовов '''TensorFlow''', легко напрямую отправлять информацию о работе вашей модели '''ИИ''' в Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
Все, что необходимо — это специальная реализация функции обратного вызова '''TensorFlow''', которая собирает данные и пересылает их в среду мониторинга Ключ-АСТРОМ.&lt;br /&gt;
&lt;br /&gt;
== Ключ-АСТРОМ TensorFlow callback receiver ==&lt;br /&gt;
Реализация обработчика обратных вызовов '''TensorFlow''' действительно получает важные обновления информации во время этапов обучения и оценки модели.&lt;br /&gt;
&lt;br /&gt;
Ниже представлена ​​реализация обработчика обратных вызовов Ключ-АСТРОМ '''TensorFlow''', который передает метрические данные во время обучения и оценки модели.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|import tensorflow as tf&lt;br /&gt;
&lt;br /&gt;
from tensorflow import keras&lt;br /&gt;
&lt;br /&gt;
import requests&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Custom TensorFlow Keras callback receiver that sends the logged metrics&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; to a astromkey monitoring environment.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Read more about writing your own callback receiver here:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; &amp;lt;nowiki&amp;gt;https://www.tensorflow.org/guide/keras/custom_callback&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class astromkeyKerasCallback(keras.callbacks.Callback):&lt;br /&gt;
&lt;br /&gt;
    metricprefix = &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    modelname = &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    url = &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    apitoken = &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    batch = &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    # Constructor that takes a metric prefix, the name of the current model that is used,&lt;br /&gt;
&lt;br /&gt;
    # the astromkey metric ingest API endpoint (e.g.: &amp;lt;nowiki&amp;gt;https://your.live.astromkey.com/api/v2/metrics/ingest&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
    # and the astromkey API token (with metric ingest scope enabled)&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, metricprefix='tensorflow.', modelname=&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;, url=&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;, apitoken=&amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
        self.metricprefix = metricprefix&lt;br /&gt;
&lt;br /&gt;
        self.modelname = modelname&lt;br /&gt;
&lt;br /&gt;
        self.url = url&lt;br /&gt;
&lt;br /&gt;
        self.apitoken = apitoken&lt;br /&gt;
&lt;br /&gt;
    def send_metric(self, name, value, tags):&lt;br /&gt;
&lt;br /&gt;
      tags_str = &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
      for tag_key in tags:&lt;br /&gt;
&lt;br /&gt;
        tags_str = tags_str + ',{key}={value}'.format(key=tag_key, value=tags[tag_key])&lt;br /&gt;
&lt;br /&gt;
      line = '{prefix}.{name}{tags} {value}\n'.format(prefix=self.metricprefix, tags=tags_str, model=self.modelname, name=name, value=value)&lt;br /&gt;
&lt;br /&gt;
      self.batch = self.batch + line&lt;br /&gt;
&lt;br /&gt;
    def flush(self):&lt;br /&gt;
&lt;br /&gt;
      print(self.batch)&lt;br /&gt;
&lt;br /&gt;
      r = requests.post(self.url, headers={'Content-Type': 'text/plain', 'Authorization' : 'Api-Token ' + self.apitoken}, data=self.batch)&lt;br /&gt;
&lt;br /&gt;
      self.batch = &amp;lt;nowiki&amp;gt;''&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    def on_train_end(self, logs=None):&lt;br /&gt;
&lt;br /&gt;
        keys = list(logs.keys())&lt;br /&gt;
&lt;br /&gt;
        for m in keys:&lt;br /&gt;
&lt;br /&gt;
          self.send_metric(m, logs[m], { 'model' : self.modelname, 'stage' : 'train' })&lt;br /&gt;
&lt;br /&gt;
        self.flush()&lt;br /&gt;
&lt;br /&gt;
    def on_epoch_end(self, epoch, logs=None):&lt;br /&gt;
&lt;br /&gt;
        keys = list(logs.keys())&lt;br /&gt;
&lt;br /&gt;
        for m in keys:&lt;br /&gt;
&lt;br /&gt;
          self.send_metric(m, logs[m], { 'model' : self.modelname, 'stage' : 'train' })&lt;br /&gt;
&lt;br /&gt;
        self.flush()&lt;br /&gt;
&lt;br /&gt;
    def on_test_end(self, logs=None):&lt;br /&gt;
&lt;br /&gt;
        keys = list(logs.keys())&lt;br /&gt;
&lt;br /&gt;
        for m in keys:&lt;br /&gt;
&lt;br /&gt;
          self.send_metric(m, logs[m], { 'model' : self.modelname, 'stage' : 'test' })&lt;br /&gt;
&lt;br /&gt;
        self.flush()&lt;br /&gt;
&lt;br /&gt;
    def on_predict_end(self, logs=None):&lt;br /&gt;
&lt;br /&gt;
        keys = list(logs.keys())&lt;br /&gt;
&lt;br /&gt;
        for m in keys:&lt;br /&gt;
&lt;br /&gt;
          self.send_metric(m, logs[m], { 'model' : self.modelname, 'stage' : 'predict' })&lt;br /&gt;
&lt;br /&gt;
        self.flush()&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Пример обучения и оценки модели Keras ==&lt;br /&gt;
В следующем примере модель '''Keras''' загружает известный набор тестовых данных ('''MNIST''') и обучает последовательную модель '''Keras'''.&lt;br /&gt;
&lt;br /&gt;
Настроенный приемник обратного вызова Ключ-АСТРОМ '''TensorFlow''', который автоматически получает и пересылает метрики точности и потерь в настроенную среду мониторинга.&lt;br /&gt;
&lt;br /&gt;
В производственной среде (на этапе оценки) тот же приёмник обратного вызова Ключ-АСТРОМ используется для непрерывного получения данных наблюдаемости о работающей модели.&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|import tensorflow as tf&lt;br /&gt;
&lt;br /&gt;
print(&amp;quot;TensorFlow version:&amp;quot;, tf.__version__)&lt;br /&gt;
&lt;br /&gt;
import time&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; load the astromkey callback receiver&lt;br /&gt;
&lt;br /&gt;
from astromkey import astromkeyKerasCallback&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Load a sample data set&lt;br /&gt;
&lt;br /&gt;
mnist = tf.keras.datasets.mnist&lt;br /&gt;
&lt;br /&gt;
(x_train, y_train), (x_test, y_test) = mnist.load_data()&lt;br /&gt;
&lt;br /&gt;
x_train, x_test = x_train / 255.0, x_test / 255.0&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Define a model&lt;br /&gt;
&lt;br /&gt;
model = tf.keras.models.Sequential([&lt;br /&gt;
&lt;br /&gt;
  tf.keras.layers.Flatten(input_shape=(28, 28)),&lt;br /&gt;
&lt;br /&gt;
  tf.keras.layers.Dense(128, activation='relu'),&lt;br /&gt;
&lt;br /&gt;
  tf.keras.layers.Dropout(0.2),&lt;br /&gt;
&lt;br /&gt;
  tf.keras.layers.Dense(10)&lt;br /&gt;
&lt;br /&gt;
])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Define a loss function&lt;br /&gt;
&lt;br /&gt;
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Compile the model&lt;br /&gt;
&lt;br /&gt;
model.compile(optimizer='adam',&lt;br /&gt;
&lt;br /&gt;
              loss=loss_fn,&lt;br /&gt;
&lt;br /&gt;
              metrics=['accuracy'])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Define the tensor board callbacks&lt;br /&gt;
&lt;br /&gt;
dt_callback = astromkeyKerasCallback(metricprefix='tensorflow', modelname='mnist-classifier', url='https://&amp;lt;YOUR_ENV&amp;gt;.live.astromkey.com/api/v2/metrics/ingest', apitoken='&amp;lt;YOUR_TOKEN&amp;gt;')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Train the model&lt;br /&gt;
&lt;br /&gt;
model.fit(x_train, y_train, epochs=5, callbacks=[dt_callback])&lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;#&amp;lt;/nowiki&amp;gt; Use the model in production&lt;br /&gt;
&lt;br /&gt;
while True:&lt;br /&gt;
&lt;br /&gt;
    model.evaluate(x_test,  y_test, verbose=2, callbacks=[dt_callback])&lt;br /&gt;
&lt;br /&gt;
    time.sleep(60)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Визуализация метрик модели TensorFlow в Ключ-АСТРОМ ==&lt;br /&gt;
После того как приёмник обратного вызова Ключ-АСТРОМ '''TensorFlow''' зарегистрирован в вашей собственной AI-модели, все собранные метрики перенаправляются в вашу среду мониторинга.&lt;/div&gt;</summary>
		<author><name>IKuznetsov</name></author>
	</entry>
</feed>