如何提高简单神经网络的速度?

我刚刚开始探索TensorFlow,但是我遇到了有关性能的问题。首先,我尝试实现一个模型来模拟逻辑门。假设有两个输入AB和一个输出Y。假设Y仅取决于B,而不取决于A。这意味着以下是有效的示例:

[0,0] -> 0
[1,0] -> 0
[0,1] -> 1
[1,1] -> 1

我为此数据创建了训练集,并创建了一个使用DenseFeatures图层的模型,该图层使用了两个功能AB。该层进入Dense(128,'relu')层,然后进入Dense(16,'relu')层,最后进入Dense(1,'sigmoid')层。

训练此NN效果很好,并且预测是完美的。但是,我注意到在MacBook上,每个预测大约需要250毫秒。这太多了,因为我的最终目标是使用这种NN每秒测试数百个预测。

因此,我将网络剥离为DenseFeatures([A,B]) -> Dense(8,'relu') -> Dense(1,'sigmoid'),但是对该NN的预测仍然需要花费大约相同的时间。我期望执行速度取决于模型的复杂性。我可以看到这里不是这样吗?我在做什么错了?

此外,我已经读过TensorFlow使用浮点数学来提高准确性,但是这会对性能造成不利影响,如果我们将数据转换为使用整数数学,它将加快处理速度。但是,我不知道该如何实现。

如果有人能帮助我理解为什么对如此简单的逻辑门和如此简单的NN进行预测会花费这么长时间,我将不胜感激。以及我该如何加快速度。

作为参考,这是我在python中的代码:

  import random
  from typing import Any,List

  import numpy as np
  import tensorflow as tf
  from sklearn.model_selection import train_test_split
  from tensorflow import feature_column
  from tensorflow.keras import layers

  class Input:
    def __init__(self,data: List[int]):
      self.data = data

  class Output:
    def __init__(self,value: float):
      self.value = value

  class Item:
    def __init__(self,input: Input,output: Output):
      self.input = input
      self.output = output

  DATA: List[Item] = []
  for i in range(10000):
    x = Input([random.randint(0,1),random.randint(0,1)])
    y = Output(x.data[1])
    DATA.append(Item(x,y))

  BATCH_SIZE = 5
  DATA_TRAIN,DATA_TEST = train_test_split(DATA,shuffle=True,test_size=0.2)
  DATA_TRAIN,DATA_VAL  = train_test_split(DATA_TRAIN,test_size=0.2/0.8)

  def toDataSet(data: List[Item],shuffle: bool,batch_size: int):
    a = {
      'a': [x.input.data[0] for x in data],'b': [x.input.data[1] for x in data],}
    b = [x.output.value for x in data]
    return tf.data.Dataset.from_tensor_slices((a,b)).shuffle(buffer_size=len(data)).batch(BATCH_SIZE)

  DS_TRAIN = toDataSet(DATA_TRAIN,True,5)
  DS_VAL   = toDataSet(DATA_VAL,5)
  DS_TEST  = toDataSet(DATA_TEST,5)

  FEATURES = []
  FEATURES.append(a)
  FEATURES.append(b)
  feature_layer = tf.keras.layers.DenseFeatures(FEATURES)
  model = tf.keras.models.load_model('MODEL.H5')
  model = tf.keras.Sequential([
    feature_layer,layers.Dense(8,activation='relu'),layers.Dense(1,activation='sigmoid')
  ])
  model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])
  model.fit(DS_TRAIN,validation_data=DS_VAL,epochs=10)
  loss,accuracy = model.evaluate(DS_TEST)

  for i in range(1000):
    val = model.predict([np.array([random.randint(0,1)]),np.array([random.randint(0,1)])])
PINGPING456 回答:如何提高简单神经网络的速度?

由于仅使用整数,因此将模型的输入更改为使用8位带符号整数。您可以通过添加 dtype 参数来更改输入层中的数据类型来做到这一点。因为您不会浪费计算,所以将大大提高处理速度。

本文链接:https://www.f2er.com/3133287.html

大家都在问