[英]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.