[英]Tensorflow - I don't get the right shapes - `ValueError: Shapes (9, 1) and (8, 9) are incompatible`
我想用 Tensorflow 訓練一個序列神經網絡 (NN)。
import tensorflow as tf
bidding_nn = tf.keras.Sequential([
tf.keras.layers.Dense(
units=128, activation='elu', kernel_initializer='he_uniform'),
tf.keras.layers.Dense(
units=128, activation='elu', kernel_initializer='he_uniform'),
tf.keras.layers.Dense(
units=9, activation='softmax', kernel_initializer='he_uniform'),
])
opt = tf.keras.optimizers.Adam(lr=0.02, decay=0.01)
bidding_nn.compile(optimizer=opt,
loss=tf.keras.losses.CategoricalCrossentropy(),
metrics=["accuracy"])
bidding_nn.fit(train_dataset, epochs=10)
它應該告訴我我擁有的 9 個類別的概率。
So as input for the NN, I have 8 numpy arrays of lengths 32 (one-hot encoded) and as output 1 numpy array of lengths 9 (one-hot encoded).
(Pdb) train_dataset
<TensorSliceDataset shapes: ((8, 32), (9,)), types: (tf.float64, tf.float64)>
但是,在bidding_nn.fit(train_dataset, epochs=10)
我收到錯誤消息
ValueError:形狀 (9, 1) 和 (8, 9) 不兼容
output 應該是 (Batch_size,num_output)
更改您的數據集生成器以擴展維度,然后將 append 每個 label 一起
labels = []
for i in one_hot:
lbs.append(np.expand_dims(i,0))
labels = np.array(lbs)
print(labels.shape) # (8,9)
您的第一個問題是您創建的數據集僅吐出一個訓練實例。 嘗試:
print(train_dataset)
# <TensorSliceDataset shapes: ((8, 32), (9,)), types: (tf.float32, tf.float32)>
您的網絡需要((batch_size, 8, 32), (batch_size, 9))
的輸入。 要解決此問題,請將.batch()
添加到數據集的末尾。
train_dataset = train_dataset.batch(32)
print(train_dataset)
# <BatchDataset shapes: ((None, 8, 32), (None, 9)),
# types: (tf.float32, tf.float32)>
這應該可以解決您原來的問題。 您的下一個問題是您將 3D 輸入放入網絡,但您需要 2D output。 在創建 logits 之前,您需要一個Flatten()
層(或其他一些降維層)。
import tensorflow as tf
# fake X
X = tf.one_hot(tf.random.uniform(
[100, 8], minval=0, maxval=33, dtype=tf.int64), 32)
print(X.shape)
# (100, 8, 32)
# fake y
y = tf.one_hot(tf.random.uniform(
[100, ], minval=0, maxval=10, dtype=tf.int64), 9)
print(y.shape)
# (100, 9)
# network layers
bidding_nn = tf.keras.Sequential([
tf.keras.layers.Dense(
units=128, activation='elu', kernel_initializer='he_uniform'),
tf.keras.layers.Dense(
units=128, activation='elu', kernel_initializer='he_uniform'),
tf.keras.layers.Flatten(), # <= add this
tf.keras.layers.Dense(
units=9, activation='softmax', kernel_initializer='he_uniform'),
])
# compile model
bidding_nn.compile(optimizer=tf.keras.optimizers.Adam(lr=0.02, decay=0.01),
loss=tf.keras.losses.CategoricalCrossentropy(),
metrics=["accuracy"])
# create dataset
train_dataset = tf.data.Dataset.from_tensor_slices((X, y)).batch(32)
# train
bidding_nn.fit(train_dataset, epochs=10)
# Epoch 1/10
# 4/4 [========================] - 1s 3ms/step - loss: 2.2432 - accuracy: 0.0738
# Epoch 2/10
# 4/4 [========================] - 0s 2ms/step - loss: 0.1858 - accuracy: 0.8672
# ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.