我是TensorFlow和ML的新手,我正在尝试创建一个GAN,它将生成一个3维数组(输出形状为100,3)。
我有以下鉴别器模型:
def make_discriminator_model():
model = tf.keras.Sequential()
model.add(layers.LeakyReLU(input_shape=(100, 3), name="Input"))
model.add(layers.Flatten(name="Flatten"))
model.add(layers.Dense(1, name="Output"))
return model
当使用这种模型时,它工作正常:
if __name__ == "__main__":
# generate fake data to test the discriminator with
noise = tf.random.normal([1, 100])
generator = make_generator_model()
fake_data = generator(noise, training=False)
# create the discriminator
discriminator = make_discriminator_model()
# test with fake data
decision = discriminator(fake_data)
print(decision)
输出:tf.Tensor([[0.0120331]], shape=(1, 1), dtype=float32)
然而,当使用model.fit
进行训练时,我得到的是ValueError: Input 0 of layer "sequential_1" is incompatible with the layer: expected shape=(None, 100, 3), found shape=(100, 3)
。
if __name__ == "__main__":
generator = make_generator_model()
discriminator = make_discriminator_model()
# constants
seed = tf.random.normal([1, 100])
epochs = 5
# generate fake data
fake_data = generator(seed, training=False)
# load dataset
dataset = all_data(max_size=10_000)
# split dataset into training (80%) and testing (20%)
training_dataset = dataset[:8000]
test_dataset = dataset[8000:]
# use optimizer and loss function
discriminator.compile(
loss=losses.Hinge(),
optimizer="adam",
metrics=tf.metrics.BinaryAccuracy(threshold=0.0)
)
discriminator.summary()
# convert training data into a Dataset
input_dataset = tf.data.Dataset.from_tensor_slices(training_dataset[:6000])
input_validation = tf.data.Dataset.from_tensor_slices(training_dataset[6000:])
# train discriminator
discriminator.fit(input_dataset, epochs=epochs, validation_data=input_validation)
我知道它需要None, 100, 3
的形状,并得到100, 3
的形状,但我不明白为什么它在使用model.fit
时要在形状的前面添加None
。
1条答案
按热度按时间h9vpoimq1#
前导
None
代表批次维度。透过指定input_shape=(100, 3)
,您是在告诉模型,它应该预期一个未知样品数目的批次,其中每个样品的形体都是(100,3)
。然而,您输入给它的是
(100,3)
形状的Tensor,它将其解释为“一批100个形状为(3,)
的样本“并发出抱怨。如果100实际上是一批样本中的样本数,则您需要指定input_shape=(3,)
。否则,如果(100,3)
是样本形状,并且批中确实只有一个样本,你需要在第一维展开Tensor,使之成为(1,100,3)
。