首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >验证精度卡住,精度低

验证精度卡住,精度低
EN

Stack Overflow用户
提问于 2020-08-12 08:45:50
回答 4查看 1.4K关注 0票数 3

我想用Tensorflow创建一个机器学习模型,它可以检测花。我走进大自然,拍摄了4种不同的物种(每班600种,一班700种)。

我用Tensorflow列车生成器加载这些图像:

代码语言:javascript
复制
 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')

然后我创建了一个简单的模型,如下所示:

代码语言:javascript
复制
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):

代码语言:javascript
复制
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列车生成器是否热编码标签?

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-08-12 16:58:12

我使用没有任何参数的RMSprop()解决了这个问题。

所以我改变了:

代码语言:javascript
复制
opt = tf.keras.optimizers.SGD(learning_rate=0.001,decay=1e-5)
model.compile(loss='categorical_crossentropy',optimizer= opt, metrics=['accuracy'])

至:

代码语言:javascript
复制
    opt = tf.keras.optimizers.RMSprop()
    model.compile(loss='categorical_crossentropy',
                  optimizer= opt,
                  metrics=['accuracy'])
票数 2
EN

Stack Overflow用户

发布于 2020-08-12 15:00:02

这是一个类似的例子,除了对于4个分类类,下面是二进制。您可能需要将损失更改为分类交叉熵,将class_mode从二进制更改为测试生成器中的分类,并将最终的密集层激活为softmax。我仍然能够使用model.fit_generator()

代码语言:javascript
复制
image_dataGen = ImageDataGenerator(rotation_range=20,
                                width_shift_range=0.2,height_shift_range=0.2,shear_range=0.1,
                                zoom_range=0.1,fill_mode='nearest',horizontal_flip=True,
                                vertical_flip=True,rescale=1/255)

train_images = image_dataGen.flow_from_directory(train_path,target_size = image_shape[:2],
                                                color_mode = 'rgb',class_mode = 'binary')
                                            
test_images = image_dataGen.flow_from_directory(test_path,target_size = image_shape[:2],
                                               color_mode = 'rgb',class_mode = 'binary',
                                               shuffle = False)
model = Sequential()

model.add(Conv2D(filters = 32, kernel_size = (3,3),input_shape = image_shape,activation = 'relu'))
model.add(MaxPool2D(pool_size = (2,2)))

model.add(Conv2D(filters = 48, kernel_size = (3,3),input_shape = image_shape,activation = 'relu'))
model.add(MaxPool2D(pool_size = (2,2)))

model.add(Flatten())
model.add(Dense(units = 128,activation = 'relu'))
model.add(Dropout(0.5))

model.add(Dense(units = 1, activation = 'sigmoid'))

model.compile(loss = 'binary_crossentropy',metrics = ['accuracy'], optimizer = 'adam')

results = model.fit_generator(train_images, epochs = 10, callbacks = [early_stop],
                             validation_data = test_images)
票数 1
EN

Stack Overflow用户

发布于 2020-08-12 18:05:16

也许你的学习率太高了。

使用学习速率= 0.000001,如果这不起作用,那么尝试另一个优化器,比如Adam。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63372983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档