【问题标题】:How can I make a tensorflow model take lists as input?如何使张量流模型将列表作为输入?
【发布时间】:2020-08-25 21:24:58
【问题描述】:

我是 tensorflow 的新手,我正在制作一个可以进行乘法运算的 AI,
我需要这样做,以便我的模型可以将列表作为输入。

这是我的代码:

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

multiplication_q = np.array([[10,10],[1,1],[2,2],[0,0],[3,3],[4,4],[5,5],[6,6],[7,7],[8,8],[9,9],[1,0],[11,10],[27,0],[30,2],[4,3],[17,22],[20,0],[8,13],[21,4],[19,24],[11,19],[8,2],[4,5],[11,11],[1,15],[2,12],[15,3],[18,0],[49,7],[5,7],[12,4]], dtype=object)
multiplication_a = np.array([100,1,4,0,9,16,25,36,49,64,96,0,110,0,60,12,374,0,104,84,456,209,16,20,121,15,24,45,0,343,35,48], dtype=float)


model = tf.keras.Sequential([
  tf.keras.layers.Dense(units=4, input_shape=[1]),
  tf.keras.layers.Dense(units=4),
  tf.keras.layers.Dense(units=1)
])

model.compile(loss='mean_squared_error', optimizer=tf.keras.optimizers.Adam(0.1))

history = model.fit(multiplication_q, multiplication_a, epochs=750, verbose=False)

print(model.predict([4, 5]))

这是错误信息:

ValueError: in user code:

    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:806 train_function  *
        return step_function(self, iterator)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:796 step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:1211 run
        return self._extended.call_for_each_replica(fn, args=args, kwargs=kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2585 call_for_each_replica
        return self._call_for_each_replica(fn, args, kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/distribute/distribute_lib.py:2945 _call_for_each_replica
        return fn(*args, **kwargs)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:789 run_step  **
        outputs = model.train_step(data)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/training.py:747 train_step
        y_pred = self(x, training=True)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/base_layer.py:976 __call__
        self.name)
    /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/engine/input_spec.py:216 assert_input_compatibility
        ' but received input with shape ' + str(shape))

    ValueError: Input 0 of layer sequential_10 is incompatible with the layer: expected axis -1 of input shape to have value 1 but received input with shape [32, 2]

【问题讨论】:

标签: python python-3.x tensorflow google-colaboratory


【解决方案1】:

要解决您的问题,您应该做 3 件事:

1- 将multiplication_q 中的dtypeobject 更改为int,如下所示:

multiplication_q = np.array([[10,10],[1,1],[2,2],[0,0],[3,3],[4,4],[5,5],[6,6],[7,7],[8,8],[9,9],[1,0],[11,10],[27,0],[30,2],[4,3],[17,22],[20,0],[8,13],[21,4],[19,24],[11,19],[8,2],[4,5],[11,11],[1,15],[2,12],[15,3],[18,0],[49,7],[5,7],[12,4]], dtype=int)

2- 在模型的第一个 Dense 层中使用 input_shape=(2,) 而不是 input_shape=[1],如下所示:

model = tf.keras.Sequential([
  tf.keras.layers.Dense(units=4, input_shape=(2,)),
  tf.keras.layers.Dense(units=4),
  tf.keras.layers.Dense(units=1)
])

3- 对于预测功能,您应该传递 listlist 而不是 list,因为您使用 listlist 进行了培训

model.predict([[4, 5]])

【讨论】:

    【解决方案2】:

    尝试将第一个密集层中的输入设置为multiplication_q.shape,将输入形状设置为1,而输入形状为32, 2

    编辑:下面的代码解决了您的问题,尽管您将不得不玩弄一些东西,因为它不是很准确。

    import tensorflow as tf
    import numpy as np
    import matplotlib.pyplot as plt
    
    multiplication_q = np.asarray([[10,10],[1,1],[2,2],[0,0],[3,3],[4,4],[5,5],[6,6],[7,7],[8,8],[9,9],[1,0],[11,10],[27,0],[30,2],[4,3],[17,22],[20,0],[8,13],[21,4],[19,24],[11,19],[8,2],[4,5],[11,11],[1,15],[2,12],[15,3],[18,0],[49,7],[5,7],[12,4]])
    multiplication_a = np.asarray([100,1,4,0,9,16,25,36,49,64,96,0,110,0,60,12,374,0,104,84,456,209,16,20,121,15,24,45,0,343,35,48])
    
    
    multiplication_q = multiplication_q/np.amax(multiplication_q)
    multiplication_a = multiplication_a/np.amax(multiplication_a)
    
    
    model = tf.keras.models.Sequential()
    model.add(tf.keras.Input(shape=(2, )))
    model.add(tf.keras.layers.Dense(32, activation='relu'))
    model.add(tf.keras.layers.Dense(units=1))
    
    
    model.compile(loss='mean_squared_error', optimizer=tf.keras.optimizers.Adam(0.1))
    
    history = model.fit(multiplication_q, multiplication_a, epochs=750)
    
    print(model.predict(np.asarray([[4, 5]])/np.amax(multiplication_q)*np.amax(multiplication_a)))
    

    【讨论】:

    • 它与 model.fit() 一起工作,但现在 model.predict() 出现错误。
    猜你喜欢
    • 2021-10-07
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2018-12-12
    相关资源
    最近更新 更多