繁体   English   中英

Tensorflow - 我没有得到正确的形状 - `ValueError:形状 (9, 1) 和 (8, 9) 不兼容`

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM