簡體   English   中英

使用未經訓練的 Keras 模型預測數據

[英]Predicting Data using an Untrained Keras Model

本質上,我想通過 Keras 模型傳播數據,而無需先訓練 Keras 模型。 我嘗試同時使用 predict() 並將原始張量輸入模型。

數據是一個形狀為 (3, 3) 的 2D Numpy float64 數組,完全用零填充。

該模型本身概述如下:

inputs = keras.Input(shape=(3,), batch_size=1)
FFNNlayer1 = keras.layers.Dense(100, activation='relu')(inputs)
FFNNlayer2 = keras.layers.Dense(100, activation='relu')(FFNNlayer1)
numericalOutput = keras.layers.Dense(3, activation='sigmoid')(FFNNlayer2)
categoricalOutput = keras.layers.Dense(9, activation='softmax')(FFNNlayer2)
outputs = keras.layers.concatenate([numericalOutput, categoricalOutput])
hyperparameters = keras.Model(inputs=inputs, outputs=outputs, name="hyperparameters")
hyperparameters.summary()

該模型的輸出層需要兩個不同的激活函數,因此我使用了函數式 API。

我首先嘗試使用hyperparameter.predict(data[0]) ,但不斷收到以下錯誤:

WARNING:tensorflow:Model was constructed with shape (1, 3) for input KerasTensor(type_spec=TensorSpec(shape=(1, 3), dtype=tf.float32, name='input_15'), name='input_15', description="created by layer 'input_15'"), but it was called on an input with incompatible shape (None,).
Traceback (most recent call last):

  File "<ipython-input-144-4c4a629eaefa>", line 1, in <module>
    mainNet.hyperparameters.predict([dataset_info[0]])

  File "C:\Users\hudso\anaconda3\lib\site-packages\keras\utils\traceback_utils.py", line 67, in error_handler
    raise e.with_traceback(filtered_tb) from None

  File "C:\Users\hudso\AppData\Roaming\Python\Python38\site-packages\tensorflow\python\framework\func_graph.py", line 1129, in autograph_handler
    raise e.ag_error_metadata.to_exception(e)

ValueError: in user code:

    File "C:\Users\hudso\anaconda3\lib\site-packages\keras\engine\training.py", line 1621, in predict_function  *
        return step_function(self, iterator)
    File "C:\Users\hudso\anaconda3\lib\site-packages\keras\engine\training.py", line 1611, in step_function  **
        outputs = model.distribute_strategy.run(run_step, args=(data,))
    File "C:\Users\hudso\anaconda3\lib\site-packages\keras\engine\training.py", line 1604, in run_step  **
        outputs = model.predict_step(data)
    File "C:\Users\hudso\anaconda3\lib\site-packages\keras\engine\training.py", line 1572, in predict_step
        return self(x, training=False)
    File "C:\Users\hudso\anaconda3\lib\site-packages\keras\utils\traceback_utils.py", line 67, in error_handler
        raise e.with_traceback(filtered_tb) from None
    File "C:\Users\hudso\anaconda3\lib\site-packages\keras\engine\input_spec.py", line 227, in assert_input_compatibility
        raise ValueError(f'Input {input_index} of layer "{layer_name}" '

    ValueError: Exception encountered when calling layer "hyperparameters" (type Functional).
    
    Input 0 of layer "dense_20" is incompatible with the layer: expected min_ndim=2, found ndim=1. Full shape received: (None,)
    
    Call arguments received:
      • inputs=('tf.Tensor(shape=(None,), dtype=float32)',)
      • training=False
      • mask=None

我稍微擺弄了一下數組尺寸,但模型繼續給出同樣的錯誤。 然后我嘗試使用以下代碼將原始張量輸入模型:

tensorflow_dataset_info =  tf.data.Dataset.from_tensor_slices([dataset_info[0]]).batch(1)
aaaaa = enumerate(tensorflow_dataset_info)
predictions = mainNet.hyperparameters(aaaaa)

此代碼繼續給出以下錯誤:

Traceback (most recent call last):

  File "<ipython-input-143-df51fe8fd203>", line 1, in <module>
    hyperparameters = mainNet.hyperparameters(enumerate(tensorflow_dataset_info))

  File "C:\Users\hudso\anaconda3\lib\site-packages\keras\utils\traceback_utils.py", line 67, in error_handler
    raise e.with_traceback(filtered_tb) from None

  File "C:\Users\hudso\anaconda3\lib\site-packages\keras\engine\input_spec.py", line 196, in assert_input_compatibility
    raise TypeError(f'Inputs to a layer should be tensors. Got: {x}')

TypeError: Inputs to a layer should be tensors. Got: <enumerate object at 0x000001F60081EA40>

我在網上看了一段時間,也搜索了 tf.data 文檔,但我仍然不確定如何解決這個問題。 同樣,我嘗試了此代碼的多種變體,並且我繼續得到大部分相同的錯誤。

如果data.shape = (3, 3) ,當您將data[0]傳遞給model.predict()時,您實際上是在發送一個形狀為(3, )的向量,但您的模型期望形狀為(1, 3)表示 1 個尺寸為 3 的示例。

嘗試對數據進行切片:

model.predict(data[:1])

這樣,您的張量將具有形狀 (1, 3)。

一種方法是切片model.predict(data[:1])

另一種方法是您可以嘗試model.predict(np.array([list(data[0])]))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM