Электричество категоризация - PullRequest
0 голосов
/ 28 января 2019

Я пытаюсь классифицировать, какие электронные устройства, которые включены, основаны только на сумме всего электричества для моей квартиры.У меня есть установка, в которой я измеряю каждый ватт-час (мигание светодиода), поэтому потребление тока в ваттах имеет точность около 10 секунд, и это здорово.

Я пытаюсь сделать это в тензорном потоке, и на первой итерации я хочу использовать только один вход (общий ватт, например, 200 Вт), и я хочу иметь один выход на каждое электронное устройство.Сейчас я также использую фиктивные данные, чтобы увидеть, как они работают (и потому что было бы очень сложно классифицировать каждое измерение, чтобы иметь возможность обучать алгоритму).

Вот мой код сейчас:

import tensorflow as tf
import numpy as np

LABELS = [
'Nothing',
'Toaster',  # Toaster uses 800W
'Lamp']  # Lamp uses just 100W

DATA_LENGTH = 20000

np.random.seed(1)  # To be able to reproduce

# Create dummy data (1:s or 0:s)
nothing_data = np.array([1] * DATA_LENGTH)
toaster_data = np.random.randint(2, size=DATA_LENGTH)
lamp_data = np.random.randint(2, size=DATA_LENGTH)

labels = np.array(list(zip(nothing_data, toaster_data, lamp_data)))

x_train = (toaster_data * 800 + lamp_data * 100) / 900  # Normalize
y_train = labels

# Split up train and test data
x_test = x_train[15000:]
y_test = y_train[15000:]
x_train = x_train[:15000]
y_train = y_train[:15000]

# The model
model = tf.keras.models.Sequential([
    tf.keras.layers.Dense(1, input_dim=1),
    tf.keras.layers.Dense(4, activation=tf.nn.relu),
    tf.keras.layers.Dense(4, activation=tf.nn.relu),
    tf.keras.layers.Dense(3, activation=tf.nn.sigmoid)
])

model.compile(optimizer='adadelta',
              loss='binary_crossentropy',
              metrics=['accuracy'])

history = model.fit(x_train, y_train, epochs=10)

val_loss, val_acc = model.evaluate(x_test, y_test)
print(val_loss, val_acc)

Теперь к проблеме, val_acc равен 1,0, 100%.(val_loss = 0.059, val_acc = 1.0) Тем не менее, когда я предсказываю, прогнозы очень сбиты.

# Predict
predict_input = [0.88888, 0.111111, 1.0000, 0.222]
predict_output = model.predict(predict_input)

Сначала должен быть тостер + ничего, но он также имеет 33% лампы.Мне бы понравился бинарный вывод, если бы это было возможно.

Нужно ли вывод "ничего"?

1 Ответ

0 голосов
/ 29 января 2019

Вам необходимо сопоставить тип модели с вашей проблемой.Вы применили то, что в основном представляет собой смешанное предсказание линейной регрессии, к проблеме двоичной классификации.Модель хороша, если вы хотите предсказать эту мощность, учитывая включенные устройства, но она не так хороша в обратном направлении.свобода, присущая модели.Обратите внимание, что у вас действительно есть только четыре учебных входа: создание нескольких копий в равных количествах на самом деле не делает ваше обучение лучше.

Прежде всего, почему вы не делаете это с "Алгоритм суммирования к цели, гораздо более простой и эффективный способ решения проблемы.Представленная проблема на самом деле не является проблемой ML.

Если вы просто хотите сделать это путем обучения модели, то создайте ее с несколькими двоичными выходами.Вы можете найти «несколько ярлыков», чтобы узнать, как это сделать.Если вы делаете это только для небольшого количества приборов в вашем доме, вы можете избить его до смерти с помощью 2 ^ n выходных состояний и не беспокоиться о конструктивной точности.

...