首页 > 解决方案 > Keras 错误:var 和 grad 的形状不同

问题描述

以下代码的最后一行导致错误

InvalidArgumentError:  var and grad do not have the same shape[64,1] [64,18]
     [[node Adam/Adam/update_12/ResourceApplyAdam (defined at /usr/local/lib/python3.7/dist-packages/keras/engine/training.py:774) ]] [Op:__inference_train_function_27034]

Errors may have originated from an input operation.
Input Source operations connected to node Adam/Adam/update_12/ResourceApplyAdam:
 sequential_7/dense_9/MatMul/ReadVariableOp/resource (defined at /usr/local/lib/python3.7/dist-packages/keras/layers/core.py:1222)

Function call stack:
train_function 

我不知道从哪里开始解决这个问题。我不知道 var 和 grad 的形状是在哪里定义的

#start 
my_model = models.Sequential() 

#first convolutional block 
my_model.add(Conv2D(16, (3, 3), input_shape = (178, 218, 3), activation="relu", padding="same"))

my_model.add(MaxPooling2D((2, 2), padding="same")) 

#second block 
my_model.add(Conv2D(32, (3, 3), activation="relu", padding="same"))

my_model.add(MaxPooling2D((2, 2), padding="same")) 

#third block 
my_model.add(Conv2D(64, (3, 3), activation="relu", padding="same"))

my_model.add(MaxPooling2D((2, 2), padding="same")) 

#fourth block 
my_model.add(Conv2D(128, (3, 3), activation="relu", padding="same"))

my_model.add(MaxPooling2D((2, 2), padding="same")) 

#global average pooling 
my_model.add(GlobalAveragePooling2D())

#fully connected layer 
my_model.add(Dense(64, activation='relu'))
my_model.add(BatchNormalization())

#make predictions 
my_model.add(Dense(1, activation="softmax")) 

my_model.summary() 

from tensorflow.python.keras.callbacks import EarlyStopping, ModelCheckpoint 
es = EarlyStopping(monitor="val_loss", mode="min",verbose=1, patience=5) 

mc = ModelCheckpoint('/content/model.h5', monitor="val_loss", mode="min", verbose=1, save_best_only=True) 

cb_list=[es,mc] 

# compile model 
my_model.compile(optimizer="adam",loss="categorical_crossentropy", metrics=["accuracy"]) 

from tensorflow.python.keras.applications.vgg16 import preprocess_input
from tensorflow.python.keras.preprocessing.image import ImageDataGenerator 

#set up data generator 
data_generator = ImageDataGenerator(preprocessing_function=preprocess_input) 

#get batches of training images from the directory 
train_generator = data_generator.flow_from_directory(
        '/content/output2/train',
        target_size=(224, 224),
        batch_size=32,
        class_mode='categorical')

validation_generator = data_generator.flow_from_directory(
        '/content/output2/val',
        target_size=(224, 224),
        batch_size=32,
        class_mode='categorical') 

history = my_model.fit_generator(train_generator, epochs = 11, steps_per_epoch=61, validation_data = validation_generator, validation_steps = 667, callbacks = cb_list) 

标签: pythonmachine-learningkerasconv-neural-networkgoogle-colaboratory

解决方案


在这一行:

my_model.add(Dense(1, activation="softmax")

将 1 更改为您拥有的类数,例如,如果有 4 个类(标签)将其重写为:

my_model.add(Dense(4, activation="softmax")

推荐阅读