我有一个包含超过4000张图片和3个类别的数据集,我正在重用一个原本用于10个类别的胶囊神经网络代码,但将其修改为3个类别。当我运行模型时,在第一个epoch的最后一个点(44/45)出现了以下错误:
Epoch 1/16 44/45 [============================>.] - ETA: 28s - loss: 0.2304 - capsnet_loss: 0.2303 - decoder_loss: 0.2104 - capsnet_accuracy: 0.6598 - decoder_accuracy: 0.5781 InvalidArgumentError: 不兼容的形状: [15,3] 与 [100,3] [[node gradient_tape/margin_loss/mul/Mul (defined at <ipython-input-22-9d913bd0e1fd>:11) ]] [Op:__inference_train_function_6157]Function call stack:train_function
训练代码如下:
m = 100epochs = 16# 使用EarlyStopping,当val_accuracy连续10次未提升时结束训练early_stopping = keras.callbacks.EarlyStopping(monitor='val_capsnet_accuracy',mode='max', patience=2,restore_best_weights=True)# 使用ReduceLROnPlateau,当val_accuracy连续5次未提升时,将学习率减半lr_scheduler = keras.callbacks.ReduceLROnPlateau(monitor='val_capsnet_accuracy',mode='max',factor=0.5,patience=4)train_model.compile(optimizer=keras.optimizers.Adam(lr=0.001),loss=[margin_loss,'mse'],loss_weights = [1. ,0.0005],metrics=['accuracy'])train_model.fit([x_train, y_train],[y_train,x_train], batch_size = m, epochs = epochs, validation_data = ([x_test, y_test],[y_test,x_test]),callbacks=[early_stopping,lr_scheduler])
模型结构如下:
Model: "model"__________________________________________________________________________________________________Layer (type) Output Shape Param # Connected to ==================================================================================================input_1 (InputLayer) [(100, 28, 28, 1)] 0 __________________________________________________________________________________________________conv2d (Conv2D) (100, 27, 27, 256) 1280 input_1[0][0] __________________________________________________________________________________________________max_pooling2d (MaxPooling2D) (100, 27, 27, 256) 0 conv2d[0][0] __________________________________________________________________________________________________conv2d_1 (Conv2D) (100, 19, 19, 128) 2654336 max_pooling2d[0][0] __________________________________________________________________________________________________conv2d_2 (Conv2D) (100, 6, 6, 128) 1327232 conv2d_1[0][0] __________________________________________________________________________________________________reshape (Reshape) (100, 576, 8) 0 conv2d_2[0][0] __________________________________________________________________________________________________lambda (Lambda) (100, 576, 8) 0 reshape[0][0] __________________________________________________________________________________________________digitcaps (CapsuleLayer) (100, 3, 16) 221184 lambda[0][0] __________________________________________________________________________________________________input_2 (InputLayer) [(None, 3)] 0 __________________________________________________________________________________________________mask (Mask) (100, 48) 0 digitcaps[0][0] input_2[0][0] __________________________________________________________________________________________________capsnet (Length) (100, 3) 0 digitcaps[0][0] __________________________________________________________________________________________________decoder (Sequential) (None, 28, 28, 1) 1354000 mask[0][0] ==================================================================================================Total params: 5,558,032Trainable params: 5,558,032Non-trainable params: 0
输入层、卷积层和初级胶囊层
img_shape=(28,28,1)inp=L.Input(img_shape,100)# 添加第一个卷积层conv1=L.Conv2D(filters=256,kernel_size=(2,2),activation='relu',padding='valid')(inp)# 添加最大池化层maxpool1=L.MaxPooling2D(pool_size=(1,1))(conv1)# 添加第二个卷积层conv2=L.Conv2D(filters=128,kernel_size=(9,9),activation='relu',padding='valid')(maxpool1)# 添加初级胶囊层conv2=L.Conv2D(filters=8*16,kernel_size=(9,9),strides=2,padding='valid',activation=None)(conv2)# 添加squash激活函数reshape2=L.Reshape([-1,8])(conv2)squashed_output=L.Lambda(squash)(reshape2)
代码来源
x_train.shape –> (4415, 28, 28, 1)
y_train.shape –> (4415, 3)
x_test.shape –> (1104, 28, 28, 1)
y_test.shape –> (1104, 3)
我的代码在这里
回答:
尝试调整X数据集,使得批次大小能完美适应数据,我认为在适应所有数据后,批次大小的剩余值是15
例如:将其设为100的倍数