我從 Tensorflow 開始并嘗試為簡單的分類問題創建模型,但我無法正確匹配輸入和輸出形狀,并且當我這樣做時,我無法在 Keras 模型上呼叫“預測”。
假設我想根據虛構的尺寸/測量來識別人。
問題似乎是我無法正確匹配輸入和輸出形狀,當我這樣做時,我無法在 Keras 模型上呼叫“預測”。這是我到目前為止所擁有的:
#!python
import tensorflow as tf
print("TensorFlow version:", tf.__version__)
TensorFlow 版本:2.6.0
這是我想用來訓練模型的有限資料集(我知道它需要更大,但首先讓我們編譯它)”
# The names of people I want to identify
names = sorted({"Jack", "John", "Peter", "X"})
# The fictive sizes for each:
sizes = [
[0.0, 0.5, 0.6, 0.7, 0.8, 0.3], # Jack's sizes
[0.2, 0.6, 0.7, 0.8, 0.5, 0.2], # John's sizes
[0.0, 0.1, 0.1, 0.4, 0.8, 0.9], # Peter's sizes
[0.3, 0.9, 0.2, 0.1, 0.0, 0.8] # X's sizes
]
然后我創建了一個 Keras Sequential 模型,它有 6 個輸入,每個大小一個,4 個輸出,每個名稱的概率一個。中間層可能會更好,但我正在嘗試消除這里可能出錯的所有內容:
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(name="inputs", units=len(sizes[0]), activation='relu'),
tf.keras.layers.Dense(name="outputs", units=len(names), activation='relu')
])
據我了解,這被稱為“one-hot”,其中每個輸出都會為該分類(名稱)生成一個概率,其中一個將是“hot”,意思是更接近 1.0。所以這是我用來編譯模型的:
model.compile(
optimizer='adam',
loss=tf.keras.losses.CategoricalCrossentropy(), # one-hot
metrics=['accuracy']
)
接下來是訓練模型。據我了解,model.fit()可以使用兩個陣列 X 和 Y,其中 X 包含輸入張量,Y 包含預期的輸出張量(因此 X[0] 應該產生 Y[0] 等)。這似乎是最簡單的設定,所以我做了:
x = [tf.constant(s) for s in sizes] # Stack size Tensors for all names
y = [tf.constant(i) for i in [ # Stack categorization probabilities for each x -> y
[1.0, 0.0, 0.0, 0.0], # Jack's index
[0.0, 1.0, 0.0, 0.0], # John's index
[0.0, 0.0, 1.0, 0.0], # Peter's index
[0.0, 0.0, 0.0, 1.0] # X's index
]]
當我打電話
model.fit(x, y, epochs=5)
我收到以下錯誤:
ValueError: Data cardinality is ambiguous:
x sizes: 6, 6, 6, 6
y sizes: 4, 4, 4, 4
Make sure all arrays contain the same number of samples.
這很奇怪,因為我的 X 和 Y 資料集大小完全相同,并且 X 中的每個 Tensor 包含模型的 6 個輸入的 6 個值,而 Y 中的每個 Tensor 包含模型中的輸出的 4 個值。
請幫助我理解我在這里做錯了什么。我希望能夠訓練模型,然后呼叫model.predict([0.0, 0.5, 0.6, 0.7, 0.8, 0.3])它,然后回傳概率,表明這可能是 Jack 的測量值。
uj5u.com熱心網友回復:
問題在于您提供輸入的方式model.fit。如果 x 或 y 是張量/陣列的串列,則串列的每個元素都被解釋為“單獨的輸入”,即對不同變數的觀察。在您的情況下,模型有 4 個不同的變數,每個變數有 6 個觀測值,forx和 4 個不同的變數,每個變數有 4 個觀測值,for y,導致不匹配。
解決方案是簡單地提供x和y作為張量或陣列,而不是張量串列:
x = np.array(sizes)(或者tf.constant也可以)。
同樣的事情y。然后,Keras 會將輸入解釋為 6 個變數的x4 個觀測值,以及 4 個變數的 4 個觀測值y。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/524101.html
