我想用Tensorflow创建一个能够识别花卉的机器学习模型。我去自然界拍摄了4个不同种类的花的照片(每个种类大约600张,其中一个种类有700张)。
我使用Tensorflow的训练生成器加载这些图片:
train_datagen = ImageDataGenerator(rescale=1./255, shear_range=0.2, zoom_range=0.15, brightness_range=[0.7, 1.4], fill_mode='nearest', vertical_flip=True, horizontal_flip=True, rotation_range=15, width_shift_range=0.1, height_shift_range=0.1, validation_split=0.2) train_generator = train_datagen.flow_from_directory( pfad, target_size=(imageShape[0],imageShape[1]), batch_size=batchSize, class_mode='categorical', subset='training', seed=1, shuffle=False, #save_to_dir=r'G:\test' ) validation_generator = train_datagen.flow_from_directory( pfad, target_size=(imageShape[0],imageShape[1]), batch_size=batchSize, shuffle=False, seed=1, class_mode='categorical', subset='validation')
然后我创建了一个简单的模型,像这样:
model = tf.keras.Sequential([ keras.layers.Conv2D(128, (3,3), activation='relu', input_shape=(imageShape[0], imageShape[1],3)), keras.layers.MaxPooling2D(2,2), keras.layers.Dropout(0.5), keras.layers.Conv2D(256, (3,3), activation='relu'), keras.layers.MaxPooling2D(2,2), keras.layers.Conv2D(512, (3,3), activation='relu'), keras.layers.MaxPooling2D(2,2), keras.layers.Flatten(), keras.layers.Dense(280, activation='relu'), keras.layers.Dense(4, activation='softmax') ]) opt = tf.keras.optimizers.SGD(learning_rate=0.001,decay=1e-5) model.compile(loss='categorical_crossentropy', optimizer= opt, metrics=['accuracy'])
然后我想开始训练过程(CPU):
history=model.fit( train_generator, steps_per_epoch = train_generator.samples // batchSize, validation_data = validation_generator, validation_steps = validation_generator.samples // batchSize, epochs = 200,callbacks=[checkpoint,early,tensorboard],workers=-1)
结果应该是我的验证准确率有所提高,但它从0.3375开始并在整个训练过程中保持在这个水平。验证损失(1.3737)降低了0.001。准确率从0.15开始但有所增加。
为什么我的验证准确率停滞不前?我使用的损失函数正确吗?还是我的模型构建有问题?我的Tensorflow训练生成器是否对标签进行了独热编码?
谢谢
回答:
我通过使用没有参数的RMSprop()解决了这个问题。
所以我从:
opt = tf.keras.optimizers.SGD(learning_rate=0.001,decay=1e-5)model.compile(loss='categorical_crossentropy',optimizer= opt, metrics=['accuracy'])
改为:
opt = tf.keras.optimizers.RMSprop() model.compile(loss='categorical_crossentropy', optimizer= opt, metrics=['accuracy'])