Локализованные вычисления

В последнее время мы стали свидетелями того, как Интернет вещей (IoT) делает нашу физическую среду и инфраструктуры умнее. Нам также необходимо знать, что Интернет вещей меняет то, как мы воспринимаем вычисления и общение.

А поскольку в ближайшие годы будут активированы миллиарды устройств IoT, нам необходимо подумать о большей безопасности, более низких затратах и ​​более производительных приложениях - и ответ на проблему: локализованные вычисления.

Аппаратное обеспечение уже есть или почти готово (когда мы говорим о специализированных микрочипах), а программное обеспечение, позволяющее проводить вычисления на таких небольших устройствах, очень быстро возникает из разных умных умов. Мало кого из этих умов я встречал на Plumer.ai.

Они собрали Larq, который, если цитировать:

- это библиотека машинного обучения с открытым исходным кодом для обучения квантованных нейронных сетей (QNN) с чрезвычайно низкими точными весами и активациями (например, 1-бит). Существующие глубокие нейронные сети, как правило, большие, медленные и энергоемкие, что запрещает работу многих приложений в средах с ограниченными ресурсами. Larq разработан, чтобы предоставить простой в использовании, составной способ обучения QNN (например, бинаризованных нейронных сетей) на основе интерфейса 'tf.keras'.

А теперь попробуем:

Перво-наперво: pip install larq

Запустит его на хорошо известных наборах данных: MNIST

import tensorflow as tf
import larq as lq
(train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.mnist.load_data()
train_images = train_images.reshape((60000, 28, 28, 1))
test_images = test_images.reshape((10000, 28, 28, 1))
# Normalize pixel values to be between -1 and 1
train_images, test_images = train_images / 127.5 - 1, test_images / 127.5 - 1
kwargs = dict(input_quantizer="ste_sign", kernel_quantizer="ste_sign", kernel_constraint="weight_clip")
model = tf.keras.models.Sequential()
model.add(lq.layers.QuantConv2D(32, (3, 3), kernel_quantizer="ste_sign", kernel_constraint="weight_clip", use_bias=False, input_shape=(28, 28, 1)))
model.add(tf.keras.layers.MaxPooling2D((2, 2)))
model.add(tf.keras.layers.BatchNormalization(scale=False))
model.add(lq.layers.QuantConv2D(64, (3, 3), use_bias=False, **kwargs))
model.add(tf.keras.layers.MaxPooling2D((2, 2)))
model.add(tf.keras.layers.BatchNormalization(scale=False))
model.add(lq.layers.QuantConv2D(64, (3, 3), use_bias=False, **kwargs))
model.add(tf.keras.layers.BatchNormalization(scale=False))
model.add(tf.keras.layers.Flatten())
model.add(lq.layers.QuantDense(64, use_bias=False, **kwargs))
model.add(tf.keras.layers.BatchNormalization(scale=False))
model.add(lq.layers.QuantDense(10, use_bias=False, **kwargs))
model.add(tf.keras.layers.BatchNormalization(scale=False))
model.add(tf.keras.layers.Activation("softmax"))

lq.models.summary(model)

    Layer                  Outputs             # 1-bit    # 32-bit
    ---------------------  ----------------  ---------  ----------
    quant_conv2d           (-1, 26, 26, 32)        288           0
    max_pooling2d          (-1, 13, 13, 32)          0           0
    batch_normalization    (-1, 13, 13, 32)          0          96
    quant_conv2d_1         (-1, 11, 11, 64)      18432           0
    max_pooling2d_1        (-1, 5, 5, 64)            0           0
    batch_normalization_1  (-1, 5, 5, 64)            0         192
    quant_conv2d_2         (-1, 3, 3, 64)        36864           0
    batch_normalization_2  (-1, 3, 3, 64)            0         192
    flatten                (-1, 576)                 0           0
    quant_dense            (-1, 64)              36864           0
    batch_normalization_3  (-1, 64)                  0         192
    quant_dense_1          (-1, 10)                640           0
    batch_normalization_4  (-1, 10)                  0          30
    activation             (-1, 10)                  0           0
    Total                                        93088         702

    Total params: 93790
    Trainable params: 93322
    Non-trainable params: 468

Пожалуйста, не стесняйтесь найти более подробную информацию на github plumer.ai и в демонстрационных версиях, которые вы можете найти в ресурсах ниже.

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(train_images, train_labels, batch_size=64, epochs=6)

test_loss, test_acc = model.evaluate(test_images, test_labels)

Эпоха 1/6 60000/60000 [==============================] - 91 с 2 мс / шаг - потеря: 0,6450 - в соотв. : 0.9082 Эпоха 2/6 60000/60000 [==============================] - 88 с 1 мс / шаг - потеря: 0,4708 - согласно: 0.9626 Эпоха 3/6 60000/60000 [==============================] - 77 с 1 мс / шаг - потеря : 0.4449 - согласно: 0.9693 Epoch 4/6 60000/60000 [==============================] - 88 с 1 мс / шаг - потеря: 0,4326 - точность: 0,9735 Epoch 5/6 60000/60000 [==============================] - 142 с 2 мс / шаг - потеря: 0,4272 - согласно: 0,9758 Эпоха 6/6 60000/60000 [==============================] - 107 с 2 мс / шаг - потеря: 0,4243 - согласно: 0,9771 10000/10000 [==============================] - 3 с 344 мкс /шаг

print(f"Test accuracy {test_acc * 100:.2f} %")

Точность теста 93,30%

Хотя точность выше 97–98%, как вы можете видеть в их демонстрациях, в приведенных ниже ресурсах, возможно, это была моя машина и подход, возможно, мне стоит дать ей еще пару прогонов.

Ресурсы:

Спасибо! и если я хочу связаться с Plumer.ai, дайте мне кайф.