我有两个numpy数组(X,Y(,我想将它们转换为tensorflow数据集。根据文件,应该可以运行
train_dataset = tf.data.Dataset.from_tensor_slices((X, Y))
model.fit(train_dataset)
然而,当这样做时,我会得到错误:ValueError: Shapes (15, 1) and (768, 15) are incompatible
如果numpy数组的形状与预期的输入/输出不兼容,这将是有意义的。但是,如果我使用model.fit(X,Y)
用numpy数组运行它,它运行起来不会有任何问题,所以形状似乎还可以。
在下一步中,我检查了输出大小:
>>> train_dataset.batch(4)
<BatchDataset shapes: ((None, 768), (None, 15)), types: (tf.int64, tf.uint8)>
神经网络的输入层预期(无,无(和输出(无,15(。所以这似乎也很匹配。
我的数据集相当大,所以很难共享,但这里有一个最小的可复制示例来说明问题。这是同样的错误,只使用numpy数组进行拟合就可以了。
import tensorflow as tf
from tensorflow.keras.layers import *
from tensorflow.keras import Model
import numpy as np
a = np.random.randint(10,size=(10,20,1))
b = np.random.rand(10,15)
train_dataset = tf.data.Dataset.from_tensor_slices((a,b))
inp = Input(shape=(None,), dtype="int32")
embedding = Embedding(12, 300, trainable=False, mask_zero=True)(inp)
gru = Bidirectional(GRU(128, recurrent_dropout=0.5))(embedding)
out = Dense(64, activation=tf.nn.relu)(gru)
out = Dropout(0.5)(out)
out = Dense(15, activation='sigmoid')(out)
m = Model(inputs=inp, outputs = out)
m.compile("adam", 'categorical_crossentropy')
m.fit(a,b)
m.fit(train_dataset)
有人能为我指出如何解决这个问题的正确方向吗?
Tensorflow版本为2.3.1。
如果您批量处理数据集,它将起作用:
train_dataset = tf.data.Dataset.from_tensor_slices((a,b)).batch(4)