首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keras CNN的准确率和损失是恒定的

Keras CNN的准确率和损失是恒定的
EN

Stack Overflow用户
提问于 2017-12-14 01:18:08
回答 2查看 1.1K关注 0票数 0

我正在使用ResNet50构建一个使用迁移学习的keras CNN模型。由于某些原因,我的准确率和损失在每个时代都是完全相同的。奇怪的是,我在类似的代码中看到了同样的行为,但在VGG19中却是如此。这让我相信问题不在于实际的模型代码,而在于预处理过程中的某个地方。我尝试了调整学习率,改变优化器,图像分辨率,冻结图层等,但分数没有变化。我查看了我的图像目录,检查我的两个不同的类是否混合在一起,而它们没有。问题出在哪里?我只想提前说声谢谢。

附言:我正在对大约2000张图片进行培训,有两个课程。

代码语言:javascript
复制
import numpy as np
import pandas as pd

import tensorflow as tf
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import ModelCheckpoint, ReduceLROnPlateau
from keras.models import Sequential, Model, load_model
from keras.layers import Conv2D, GlobalAveragePooling2D
from keras.layers import Activation, Dropout, Flatten, Dense
from keras import applications
from keras import optimizers

img_height, img_width, img_channel = 400, 400, 3 #change chanel to 1 instead of three since it is black and white

base_model = applications.ResNet50(weights='imagenet', include_top=False, input_shape=(img_height, img_width, img_channel))

# add a global spatial average pooling layer
x = base_model.output
x = GlobalAveragePooling2D()(x)
# let's add a fully-connected layer
x = Dense(512, activation='relu',name='fc-1')(x)
#x = Dropout(0.5)(x)
x = Dense(256, activation='relu',name='fc-2')(x)
#x = Dropout(0.5)(x)
# and a logistic layer -- let's say we have 2 classes
predictions = Dense(1, activation='softmax', name='output_layer')(x)

model = Model(inputs=base_model.input, outputs=predictions)
model.compile(loss='binary_crossentropy', optimizer=optimizers.SGD(lr=0.1),
              metrics=['accuracy'])

model.summary()

from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import ModelCheckpoint

batch_size = 6

# prepare data augmentation configuration
train_datagen = ImageDataGenerator(
        rescale=1./255,
        rotation_range=20,
        width_shift_range=0.1,
        height_shift_range=0.1,
        shear_range=0.1,
        zoom_range=0.1,
        horizontal_flip=True,
        vertical_flip=True)


test_datagen = ImageDataGenerator(rescale=1./255)

#possibely resize the image
train_generator = train_datagen.flow_from_directory(
        "../Train/",
        target_size=(img_height, img_width),
        batch_size=batch_size,
        class_mode='binary',
        shuffle=True
)

validation_generator = test_datagen.flow_from_directory(
        "../Test/",
        target_size=(img_height, img_width),
        batch_size=batch_size,
        class_mode='binary',
        shuffle=True)

epochs = 10

history = model.fit_generator(
        train_generator,
        steps_per_epoch=2046 // batch_size,
        epochs=epochs,
        validation_data=validation_generator,
        validation_steps=512 // batch_size,
        callbacks=[ModelCheckpoint('snapshots/ResNet50-transferlearning.model', monitor='val_acc', save_best_only=True)])

这是keras给出的输出:

代码语言:javascript
复制
Epoch 1/10
341/341 [==============================] - 59s 172ms/step - loss: 7.0517 - acc: 0.5577 - val_loss: 7.0334 - val_acc: 0.5588
Epoch 2/10
341/341 [==============================] - 57s 168ms/step - loss: 7.0517 - acc: 0.5577 - val_loss: 7.0334 - val_acc: 0.5588
Epoch 3/10
341/341 [==============================] - 56s 165ms/step - loss: 7.0517 - acc: 0.5577 - val_loss: 7.0334 - val_acc: 0.5588
Epoch 4/10
341/341 [==============================] - 57s 168ms/step - loss: 7.0517 - acc: 0.5577 - val_loss: 7.0334 - val_acc: 0.5588
Epoch 5/10
341/341 [==============================] - 57s 167ms/step - loss: 7.0517 - acc: 0.5577 - val_loss: 7.0334 - val_acc: 0.5588
EN

回答 2

Stack Overflow用户

发布于 2017-12-14 02:58:45

最后一层应该有一个'sigmoid‘激活,而不是softmax,因为它是二进制分类。

票数 1
EN

Stack Overflow用户

发布于 2018-01-04 13:28:13

代码语言:javascript
复制
predictions = Dense(1, activation='softmax', name='output_layer')(x)

密集层表示您想要分类的不同类的数量,因此对于二进制分类,您将需要2,其中您已经编写了1。

因此,将该行更改为。

代码语言:javascript
复制
 predictions = Dense(2, activation='softmax', name='output_layer')(x)

只需注意,始终尝试保留一个变量来处理类的数量,例如

代码语言:javascript
复制
predictions = Dense(num_classes, activation='softmax', name='output_layer')(x)

然后在代码的开头定义num_classes,以获得更好的灵活性和可读性。

您可以在此处查看关于密集层的文档:https://faroit.github.io/keras-docs/2.0.0/layers/core/

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

https://stackoverflow.com/questions/47798854

复制
相关文章

相似问题

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