Локализованные вычисления
В последнее время мы стали свидетелями того, как Интернет вещей (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%, как вы можете видеть в их демонстрациях, в приведенных ниже ресурсах, возможно, это была моя машина и подход, возможно, мне стоит дать ей еще пару прогонов.
Ресурсы:
- Библиотека машинного обучения с открытым исходным кодом для обучения бинаризованных нейронных сетей
- Plumerai на Github
- Бинаризованные сверточные нейронные сети
- Модель Кераса
Спасибо! и если я хочу связаться с Plumer.ai, дайте мне кайф.