我想在keras/tensorflow的lambda層中做一個極其簡單的加法器的例子(把兩個標量張量加在一起)。以下是我的最小例子:
import tensorflow as tf
from tensorflow import keras
def adder(x1,x2)。
return tf.math.add(x1,x2)
我可以對我的加法器函式進行一次快速測驗:
# Check that the adder function works well for two scaler tensors
scaler1 = tf.convert_to_tensor(21.1)
scaler2 = tf.convert_to_tensor(12.0)
print(adder(scaler1,scaler2))
這將得到正確的輸出:
這將得到正確的輸出。
tf.Tensor(33.1, shape=(), dtype=float32)
所以我現在定義了一個多輸入的keras網路,其中有一個lambda層,它試圖將兩個輸入加在一起:
inpAdder1 = keras.layer.Input((1), name="Input1")
inpAdder2 = keras.layer.Input((1), name="Input2")
doAdd = keras.layer. Lambda(lambda x: adder(x[0],x[1]),name="LambdaLayer") ([inpAdder1,inpAdder2])
modelAdder = keras.Model([inpAdder1,inpAdder2],doAdd)
網路摘要看起來是正確的:
Model: "model_12"/span>
__________________________________________________________________________________________________
層(型別)輸出形狀引數#連接到。
==================================================================================================
Input1 (InputLayer) [(None, 1)] 0
__________________________________________________________________________________________________
Input2 (InputLayer) [(None, 1)] 0
__________________________________________________________________________________________________
LambdaLayer (Lambda) (None, 1) 0 Input1[0] [0]
Input2[0][0]
==================================================================================================
總引數。0] [0] 總引數:0
可訓練的引數。0] 可訓練的引數: 0
不可訓練的引數。0
但是,如果我試圖用相同的標度器張量呼叫一個簡單的預測,我得到一個錯誤,我不知道如何除錯:
modelAdder.predict([scaler1, scaler2])
錯誤回溯:
---------------------------------------------------------------------------
IndexError 回溯(最近的一次呼叫)。
<命令-4319124675560319> in <模塊>
16 print(adder(scaler1,scaler2)
17
--> 18 modelAdder.predict([scaler1, scaler2])
/databricks/python/lib/python3.8/site-packages/keras/engine/training.py in predict(self, x, batch_size, verbose, steps, callbacks, max_queue_size, workers, use_multiprocessing)
1718 ' 。考慮將其設定為AutoShardPolicy.DATA。')
1719
-> 1720 data_handler = data_adapter.get_data_handler(
1721 x=x,
1722 batch_size=batch_size。
/databricks/python/lib/python3.8/site-packages/keras/engine/data_adapter.py in get_data_handler(*args, **kwargs)
1381 if getattr(kwargs["model"]。"_cluster_coordinator", None)。)
1382 return _ClusterCoordinatorDataHandler(*args, **kwargs)
-> 1383 return DataHandler(*args, **kwargs)
1384
1385
/databricks/python/lib/python3.8/site-packages/keras/engine/data_adapter. py in __init__(self, x, y, sample_weight, batch_size, steps_per_epoch, initial_epoch, epochs, shuffle, class_weight, max_queue_size, workers, use_multiprocessing, model, steps_per_execution, distribute)
1136[/span
1137 adapter_cls = select_data_adapter(x, y)
-> 1138 self._adapter = adapter_cls(
1139 x,
1140 y,
/databricks/python/lib/python3.8/site-packages/keras/engine/data_adapter.py in __init__(self, x, y, sample_weights, sample_weight_modes, batch_size, epochs, steps, shuffle, **kwargs)
238 inputs = pack_x_y_sample_weight(x, y, sample_weights)
238 inputs = pack_x_y_sample_weight(x, y, sample_weights)
--> 240 num_samples = set(int(i. shape[0]) for i in tf.nest.flatten(inputs)).pop()
241 _check_data_cardinality(inputs)
242 _check_data_cardinality(inputs)
/databricks/python/lib/python3.8/site-packages/keras/engine/data_adapter.py in <genexpr>(.0)
238 inputs = pack_x_y_sample_weight(x, y, sample_weights)
238 inputs = pack_x_y_sample_weight(x, y, sample_weights)
--> 240 num_samples = set(int(i. shape[0]) for i in tf.nest.flatten(inputs)).pop()
241 _check_data_cardinality(inputs)
242 _check_data_cardinality(inputs)
/databricks/python/lib/python3.8/site-packages/tensorflow/python/framework/tensor_shape.py in __getitem__(self, key)
894 else:
895 if self._v2_behavior:
--> 896 return self._dims[key].value
897 else:
898 return self._dims[key] 。
IndexError: list index out of range
我有一種感覺,我在這里錯過了一些簡單的東西,但是我試著看了一下類似的問題(例如:。如何將兩個輸入放入 tensorflow lambda 層),但卻找不到我做錯的地方。
uj5u.com熱心網友回復:
經過進一步除錯,我已經解決了這個問題。這個問題是由于我在呼叫model.predict函式時沒有包含一個批處理維度。
將上面的predict行改為:
modelAdder.predict([tf.expand_dims(scaler1,0), tf.expand_dims(scaler2,0) ] )
通過為該批次的每個張量添加一個額外的維度來解決這個問題。上述命令產生的張量是:
Out[48]: array([33.1]], dtype=float32)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/328142.html
標籤:
上一篇:從Edit中獲取價值以處理區域
