我正在尝试仅基于我公寓的所有电力之和对打开的电子设备进行分类。我有一个设置,可以测量每个瓦特小时(LED的闪烁),因此,以瓦特为单位的电流消耗具有约10秒的精度,这很棒。
我正在尝试在张量流中执行此操作,并且在第一次迭代中,我只想使用一个输入(总瓦特,例如200W),并且每个电子设备都希望有一个输出。现在,我还使用伪数据来查看其工作原理(并且由于对每种度量进行分类以教授该算法将非常麻烦)。
这是我的代码:
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%的灯。如果可能的话,我本来希望二进制输出。
我是否需要输出“无”?
答案 0 :(得分:1)
您需要将模型类型与您的问题相匹配。您已将基本上是混合线性回归预测的内容应用于二进制分类问题。如果您要在打开电器的情况下预测瓦数,则该模型很好,但是在相反的方向上并不是很好。
它将尝试使用给定的数据少和模型固有的自由度进行各种操作。请注意,您实际上只有四个训练输入:以相同数量制作多份副本并不能真正使您的训练更好。
最重要的是,为什么不使用“求和目标”算法来做到这一点,这是解决问题的更简单有效的方法。提出的问题实际上不是ML的问题。
如果您只是想通过训练模型来做到这一点,然后使用多个二进制输出构建模型。您可以研究“多个标签”,以获得有关如何进行销售的线索。如果仅在家里使用少数几种电器,则可能要以2 ^ n个输出状态将其击败,而不必担心结构精度。