keras 输入层传递一个二维张量,而它的形状是一维的

keras Input layer passes a 2 dimensional tensors while its shape is 1 dimensional

我正在使用 tensorflow 和 keras 迈出第一步,我创建了一个包含元组的数据集,其中嵌入了来自 VGG16 模型的图像作为数据和二进制多标签标签。例如,这是我数据集中一个元素的打印:

(<tf.Tensor: shape=(4096,), dtype=float32, numpy=
array([0.32185513, 0.14869851, 0.4276036 , ..., 0.        , 0.        ,
       1.7438936 ], dtype=float32)>, <tf.Tensor: shape=(12,), dtype=int32, numpy=array([0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0])>)

我构建了以下模型:

inputs = Input(shape = (4096,), name = 'input_1')
dense_1 = Dense(units = 2048, name = "dense_1", activation = 'sigmoid')(inputs)
dense_2 = Dense(units = 2048, name = "dense_2", activation = 'sigmoid')(dense_1)
output = Dense(units = 12, name = "output", activation = 'sigmoid')(dense_2)
model = Model(inputs = inputs, outputs = output)
model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = 'accuracy')
model.summary()
model.fit(train_ds, validation_data = val_ds)

当我尝试拟合模型时出现以下错误

ValueError: Input 0 of layer dense_1 is incompatible with the layer: expected axis -1 of input shape to have value 4096 but received input with shape [4096, 1]

根据我的理解,模型需要一个一维张量作为输入但得到一个二维张量,数据集中的数组是一维的,因此我不明白为什么它们从输入层作为二维张量传递. 对找出导致此错误的原因以及如何修复它有帮助吗?

编辑: 创建数据集的代码是:

embed_train = np.load("Desktop/DL projects/pawpularity/petfinder-pawpularity-score/VGG16_embed.npy")
print(embed_train.shape)
>>>(9912, 4096)
print(train_labels.shape)
>>>(9912, 12)
train_ds = tf.data.Dataset.from_tensor_slices((embed_train, train_labels))
train_ds = train_ds.shuffle(10000)
test_ds = train_ds.take(1000)
train_ds = train_ds.skip(1000)
val_ds = train_ds.take(2000)
train_ds = train_ds.skip(2000)

embed_traintrain_labels都是numpy数组,你可以看到我一共有9912个样本,每个样本包含4096个特征,需要为每个标签(总共12个标签)独立分类。

我能够通过 而不是 使用 Dataset 让你的代码工作,而是直接传递训练数据和标签。

import tensorflow as tf
import numpy as np
from tensorflow.keras import Input
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Model

# random data in your shape - you can split for validation/validation labels if you want. 
# You would use your own embed_train and labels here
embed_train = np.random.rand(9912, 4096) 
train_labels= np.random.randint(0, 12, [9912, 12])

inputs = Input(shape=(4096,), name ='input_1')
dense_1 = Dense(units = 2048, name = "dense_1", activation = 'sigmoid', input_shape=(4096,1))(inputs)
dense_2 = Dense(units = 2048, name = "dense_2", activation = 'sigmoid')(dense_1)
output = Dense(units = 12, name = "output", activation = 'sigmoid')(dense_2)
model = Model(inputs = inputs, outputs = output)
model.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = 'accuracy')
model.summary()
model.fit(embed_train , train_labels)

如果你想打乱数据,你可以使用来自 another post 的答案:

indices = tf.range(start=0, limit=tf.shape(embed_train)[0], dtype=tf.int32)
idx = tf.random.shuffle(indices)

x_data = tf.gather(embed_train, idx)
y_data = tf.gather(train_labels, idx)

model.fit(x_data, y_data)

编辑: 对于数据集,我相信您需要指定批量大小:

train_ds = train_ds.batch(32)

model.fit(train_ds)

这适用于我的电脑。