InvalidArgumentError:要重塑的输入是一个有50个值的张量,但请求的形状有1个值

2024-06-16 12:30:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Keras functional API for CNN,模型是这样的:输入是一个大小为50x50x1的图像,有2个输出层,一个有3个标签,第二个有7个标签,隐藏层包含:卷积层>;最大池层>;平坦层>;完全连接层,128个单元。你知道吗

在第一个时期,我得到了一个错误:

InvalidArgumentError: Input to reshape is a tensor with 50 values, but the requested shape has 0 [[{{node training_4/Adam/gradients/loss_4/outc_loss/Mean_grad/Reshape}}]]

错误消息中的值50取决于它随批大小而更改的批大小,但请求形状值会不断更改(0、1、10653216等)

我无法理解问题是什么,我也读过类似的问题,但没有一个对我有帮助。我是新手。 提前感谢您的帮助:)

我的代码是:

layer_inp = keras.Input(shape=(50,50,1))

layer_int = Conv2D(32, (3,3), activation='relu')(layer_inp)
layer_int = MaxPooling2D(pool_size=(2,2))(layer_int)
layer_int = Flatten()(layer_int)

layer_int = Dense(128, activation='sigmoid')(layer_int)

layer_color_out = Dense(3, activation='softmax', name='outc')(layer_int)
layer_piece_out = Dense(7, activation='softmax', name='outp')(layer_int)

classifier = keras.Model(inputs=layer_inp, outputs=[layer_color_out, layer_piece_out])

losses = {'outc':'categorical_crossentropy', 'outp':'categorical_crossentropy'}
weights = {'outc':1.0, 'outp':1.0}
metrices = {'outc':'accuracy', 'outp':'accuracy'}

classifier.compile(optimizer='adam', loss=losses, loss_weights=weights, metrics=metrices)

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale=1./255,
                                  zoom_range=0.2,
                                  vertical_flip=True,
                                  horizontal_flip=True)

def batch_generator(generator):
    while True:
        X_temp, y_temp = next(generator)
        yield X_temp, [y_temp[:,:3], y_temp[:,3:]]

# X_train.shape is (3000,50,50,1), y_train.shape is (3000,10)
train_datagen.fit(X_train)
train_set = train_datagen.flow(X_train, y_train, batch_size=50)

classifier.fit_generator(batch_generator(train_set),
                        steps_per_epoch=500,
                        epochs=25,)

错误回溯是:

Epoch 1/25
Traceback (most recent call last):

  File "<ipython-input-8-7de0904e0d57>", line 3, in <module>
    epochs=25,)

  File "C:\Users\AMIT\Anaconda3\envs\venv-der\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)

  File "C:\Users\AMIT\Anaconda3\envs\venv-der\lib\site-packages\keras\engine\training.py", line 1418, in fit_generator
    initial_epoch=initial_epoch)

  File "C:\Users\AMIT\Anaconda3\envs\venv-der\lib\site-packages\keras\engine\training_generator.py", line 217, in fit_generator
    class_weight=class_weight)

  File "C:\Users\AMIT\Anaconda3\envs\venv-der\lib\site-packages\keras\engine\training.py", line 1217, in train_on_batch
    outputs = self.train_function(ins)

  File "C:\Users\AMIT\Anaconda3\envs\venv-der\lib\site-packages\keras\backend\tensorflow_backend.py", line 2715, in __call__
    return self._call(inputs)

  File "C:\Users\AMIT\Anaconda3\envs\venv-der\lib\site-packages\keras\backend\tensorflow_backend.py", line 2675, in _call
    fetched = self._callable_fn(*array_vals)

  File "C:\Users\AMIT\Anaconda3\envs\venv-der\lib\site-packages\tensorflow\python\client\session.py", line 1439, in __call__
    run_metadata_ptr)

  File "C:\Users\AMIT\Anaconda3\envs\venv-der\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 528, in __exit__
    c_api.TF_GetCode(self.status.status))

InvalidArgumentError: Input to reshape is a tensor with 50 values, but the requested shape has 0
     [[{{node training/Adam/gradients/loss/outc_loss/Sum_1_grad/Reshape}}]]

Tags: inlayervenvliblinetraingeneratorusers