繁体   English   中英

Tensorflow & Keras 层“顺序”需要 1 个输入,但它接收到 2 个输入张量

[英]Tensorflow & Keras Layer "sequential" expects 1 input(s), but it received 2 input tensors

我在尝试使用 Keras 创建 model 时遇到问题,如果我尝试运行它,它会抱怨顺序层输入太多。 这是错误:

ValueError: Layer "sequential" expects 1 input(s), but it received 2 input tensors.
Inputs received: [<tf.Tensor 'IteratorGetNext:0' shape=(1, 90, 60, 3) dtype=uint8>,
<tf.Tensor 'IteratorGetNext:1' shape=(1,) dtype=int32>]

我的输入是几个 60x90 像素(宽 x 高)的 RGB 图像。 这是我的 model:

network = models.Sequential()
network.add(layers.Conv2D(32, (3,3), activation = 'relu', input_shape = (90, 60, 3), name="conv_1"))
network.add(layers.MaxPooling2D((2,2), name="maxpool_1"))
network.add(layers.Conv2D(64, (3,3), activation = 'relu', name="conv_2"))
network.add(layers.MaxPooling2D((2,2), name = "maxpool_2"))
network.add(layers.Conv2D(128, (3,3), activation = 'relu', name="conv_3"))
network.add(layers.MaxPooling2D((2,2), name = "maxpool_3"))
network.add(layers.Conv2D(128, (3,3), activation = 'relu', name="conv_4"))
network.add(layers.MaxPooling2D((2,2), name = "maxpool_4"))

network.add(layers.Flatten())
network.add(layers.Dropout(0.2))
network.add(layers.Dense(512, activation = 'relu', name="dense_1"))
network.add(layers.Dense(6, activation = 'sigmoid', name="dense_2"))

这个 model 的目标是告诉图像中某物的位置,将图像分成 6 个部分,因此下面代码中的 _px 代表图像的像素数据,_loc 代表提供的图像的正确答案.

training_data_px = dataset_px[:training_images]
test_data_px = dataset_px[training_images:]

training_data_loc = dataset_loc[:training_images]
test_data_loc = dataset_loc[training_images:]

training_data = (numpy.asarray(training_data_px), numpy.asarray(training_data_loc))
test_data = (numpy.asarray(test_data_px), numpy.asarray(test_data_loc))

这是training_data[0]training_data[1]的形状:

(30, 90, 60, 3)
(30,)

这是网络的编译和适配function:

network.compile(optimizer = optimizers.Adam(learning_rate=1e-4),
               loss = 'categorical_crossentropy',
               metrics = ['accuracy'])

history = network.fit(training_data,
                        steps_per_epoch = 50,
                        epochs=50,
                        validation_data = test_data,
                        validation_steps=50
                        )

错误是什么意思以及如何解决?

这里的问题是您如何将参数传递给fit方法,特别是在您的情况下正确的方法是:

history = network.fit(
                        training_data[0],
                        training_data[1],
                        steps_per_epoch = 50,
                        epochs=50,
                        validation_data = test_data,
                        validation_steps=50
                        )

换句话说,前2个参数通常是x (输入,第一个)和y (目标,第二个),但是如果没有目标,则可以省略第二个(参见例如siamese NN)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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