我正在为我的字符识别系统构建一个训练模型。在每个周期中,我得到的准确率都是相同的,而且没有改善。目前我有4000张训练图像和77张验证图像。我的模型如下:
inputs = Input(shape=(32,32,3))x = Conv2D(filters = 64, kernel_size = 5, activation = 'relu')(inputs)x = MaxPooling2D()(x)x = Conv2D(filters = 32, kernel_size = 3, activation = 'relu')(x) x = MaxPooling2D()(x) x = Flatten()(x) x=Dense(256,activation='relu')(x)outputs = Dense(1, activation = 'softmax')(x) model = Model(inputs = inputs, outputs = outputs) model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) data_gen_train = ImageDataGenerator(rescale=1/255)data_gen_test=ImageDataGenerator(rescale=1/255)data_gen_valid = ImageDataGenerator(rescale=1/255)train_generator = data_gen_train.flow_from_directory(directory=r"./drive/My Drive/train_dataset", target_size=(32,32), batch_size=10, class_mode="binary")valid_generator = data_gen_valid.flow_from_directory(directory=r"./drive/My Drive/validation_dataset", target_size=(32,32), batch_size=2, class_mode="binary")test_generator = data_gen_test.flow_from_directory( directory=r"./drive/My Drive/test_dataset", target_size=(32, 32), batch_size=6, class_mode="binary")model.fit(train_generator,epochs =10, steps_per_epoch=400,validation_steps=37,validation_data=valid_generator)
结果如下:
Found 4000 images belonging to 2 classes.Found 77 images belonging to 2 classes.Found 6 images belonging to 2 classes.Epoch 1/10400/400 [==============================] - 14s 35ms/step - loss: 0.0000e+00 - accuracy: 0.5000 - val_loss: 0.0000e+00 - val_accuracy: 0.5811Epoch 2/10400/400 [==============================] - 13s 33ms/step - loss: 0.0000e+00 - accuracy: 0.5000 - val_loss: 0.0000e+00 - val_accuracy: 0.5811Epoch 3/10400/400 [==============================] - 13s 34ms/step - loss: 0.0000e+00 - accuracy: 0.5000 - val_loss: 0.0000e+00 - val_accuracy: 0.5676Epoch 4/10400/400 [==============================] - 13s 33ms/step - loss: 0.0000e+00 - accuracy: 0.5000 - val_loss: 0.0000e+00 - val_accuracy: 0.5676Epoch 5/10400/400 [==============================] - 18s 46ms/step - loss: 0.0000e+00 - accuracy: 0.5000 - val_loss: 0.0000e+00 - val_accuracy: 0.5541Epoch 6/10400/400 [==============================] - 13s 34ms/step - loss: 0.0000e+00 - accuracy: 0.5000 - val_loss: 0.0000e+00 - val_accuracy: 0.5676Epoch 7/10400/400 [==============================] - 13s 33ms/step - loss: 0.0000e+00 - accuracy: 0.5000 - val_loss: 0.0000e+00 - val_accuracy: 0.5676Epoch 8/10400/400 [==============================] - 13s 33ms/step - loss: 0.0000e+00 - accuracy: 0.5000 - val_loss: 0.0000e+00 - val_accuracy: 0.5946Epoch 9/10400/400 [==============================] - 13s 33ms/step - loss: 0.0000e+00 - accuracy: 0.5000 - val_loss: 0.0000e+00 - val_accuracy: 0.5811Epoch 10/10400/400 [==============================] - 13s 33ms/step - loss: 0.0000e+00 - accuracy: 0.5000 - val_loss: 0.0000e+00 - val_accuracy: 0.5811<tensorflow.python.keras.callbacks.History at 0x7fa3a5f4a8d0>
回答:
如果您试图识别两个类别的字符,您应该:
- 在
flow_from_directory
函数中使用class_mode="binary"
- 使用
binary_crossentropy
作为损失函数 - 最后一层必须有一个神经元,并使用
sigmoid
激活函数
如果有超过两个类别的情况:
- 不要在
flow_from_directory
函数中使用class_mode="binary"
- 使用
categorical_crossentropy
作为损失函数 - 最后一层必须有n个神经元,并使用
softmax
激活函数,其中n代表类别数量