python - 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)
解决方案
在这一行:
my_model.add(Dense(1, activation="softmax")
将 1 更改为您拥有的类数,例如,如果有 4 个类(标签)将其重写为:
my_model.add(Dense(4, activation="softmax")
推荐阅读
- mysql - 外键约束'foreign_key'中的引用列'column'和引用列'Id'不兼容
- codeigniter-4 - Codeigniter 4 将上传的文件发送到 FTP 服务器
- c# - ASP.NET Core 中的 SQLite 每次调用都会使用越来越多的 RAM
- python - 计算列表中大于其邻居的数字
- gnuplot - 为多维数据绘制缺少数据点的线
- laravel - Laravel 分页标识
- paypal - 我可以在 Ionic 3 中使用 Paypal 进行递归付款或订阅吗?
- css - 为什么动画只适用于第一张幻灯片而不适用于其他幻灯片?
- java - 使用 HIbernate 将 String 列读取为 Map
- vue.js - 将承诺绑定到 Vue 中的组件