【问题标题】:Tensorflow-keras : CNN predictions are very close to 1 or 0Tensorflow-keras:CNN 预测非常接近 1 或 0
【发布时间】:2019-01-09 19:08:11
【问题描述】:

我在 96x96 的细菌图像上训练了一个 CNN。我有 3 个类:“细菌”、“絮状物”和“无”。

然后,为了检测 1920x1080 图像上的细菌,我使用 96x96 窗口扫描图像,并针对所有扫描的窗口运行 CNN。

但我的预测总是 [0,1,0] 之类的。我从来没有,例如。 [0.1, 0.8, 0.1]

这是我的模型:

batch_size = 32
nb_epochs = 10
taille_image = (96,96)

model = Sequential()
model.add(Conv2D(16, (3, 3), input_shape=(96, 96, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(MaxPooling2D(pool_size=(2, 2)))

model.add(Flatten())
model.add(Dense(3))
model.add(Activation('softmax'))




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


def Entrainer():

        train_datagen = ImageDataGenerator(
                rescale=1./255,
                horizontal_flip=True,
                vertical_flip=True,
                validation_split=0.2)
        

        train_generator = train_datagen.flow_from_directory(
                "Images_traitees/Vignettes_squared",
                target_size = taille_image,
                batch_size=batch_size,
                class_mode="categorical",
                shuffle=True,
                save_to_dir="augmented_data",
                save_prefix="augmented_",
                save_format="jpeg",
                subset="training"
        )
        validation_generator = train_datagen.flow_from_directory(
                "Images_traitees/Vignettes_squared",
                target_size = taille_image,
                batch_size=batch_size,
                class_mode="categorical",
                subset="validation"
        )

        tbCallback = keras.callbacks.TensorBoard(log_dir='./Graph', histogram_freq=0, write_graph=True, write_images=True)
        history = model.fit_generator(
                train_generator,
                steps_per_epoch=train_generator.samples // batch_size,
                validation_data = validation_generator,
                validation_steps = validation_generator.samples // batch_size,
                epochs=nb_epochs,
                callbacks = [tbCallback]
        )

        plt.plot(history.history['acc'])
        plt.title('model accuracy')
        plt.ylabel('accuracy')
        plt.xlabel('epoch')
        plt.show()

        plt.plot(history.history['loss'])
        plt.title('model loss')
        plt.ylabel('loss')
        plt.xlabel('epoch')
        plt.show()

        model.save("my_model.h5")


if __name__ == "__main__":
        model.summary()
        Entrainer()

tensorboard results

这是调用我的模型并为检测到的类着色的代码。

model = load_model("my_model.h5")

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


def Predire(img, vignettes, pos):
    image = Image.open(img)
    draw = ImageDraw.Draw(image, mode='RGBA')

    for vignette in vignettes:
        x = img_to_array(vignette)
        x = np.expand_dims(x, axis=0)
        y = model.predict(x)

        if y[0][1] > max (y[0][0],y[0][2]):
            draw.rectangle(pos[nb], outline='red', fill=(255,0,0,125))
            proto +=1
        if y[0][0] > max (y[0][1],y[0][2]):
            draw.rectangle(pos[nb], outline='blue', fill=(0,0,255,125))
            floc +=1
        if y[0][2] > max(y[0][1],y[0][0]):
            draw.rectangle(pos[nb], outline='black')
                    
        print (y)
       

 
    return image

当我打印 y 时,它会返回:

[[0. 0. 1.]]
[[0. 0. 1.]]
[[0. 0. 1.]]
[[0. 0. 1.]]
[[1. 0. 0.]]
[[1. 0. 0.]]
[[1. 0. 0.]]
[[1. 0. 0.]]
[[1. 0. 0.]]
[[1. 0. 0.]]
[[1. 0. 0.]]
[[1.0000000e+00 1.7819082e-33 0.0000000e+00]]
[[1. 0. 0.]]
...

每一行代表整个图像的 96x96 滑动窗口的 CNN 预测。

我认为它过度拟合,但我只尝试了 735 个可训练参数,但我仍然有相同的 pb。

【问题讨论】:

    标签: tensorflow keras deep-learning


    【解决方案1】:

    您的模型可能严重过度拟合数据。检查你的模型在你的训练和你的测试集上的准确性,看看它们是否合理。

    更新:原来图像数据的预处理是问题所在。始终确保对训练、验证和测试集应用相同的预处理。

    【讨论】:

    • 是的,这就是我的想法,但我尝试了很少的参数,我仍然有相同的 pb
    • 有时模型只需要“几个”参数就可以过拟合,所以这不一定是一个好的指标。您的训练和测试准确度如何?
    • 有 2900 个可训练参数(比我的实际模型少):acc:0.94,val_acc:0.87
    • 是否有可能一旦您从 96x96 图像切换到 1920x1080 图像的预处理会发生变化,即您是否也使用 1./255 重新缩放?我确实在模型中遇到了类似的结果,结果发现这些结果是由于模型的输入与我最初训练它们的不同(预处理)。
    • 谢谢,它解决了我的 pb,我仍然有奇怪的预测......我使用平方图像,然后我使用 keras image_data_generator 的 rescale = 1./255 参数。您认为添加空白填充以将我所有的图像填充到 96x96 的大小更好还是重新缩放没有问题?
    猜你喜欢
    • 2019-03-17
    • 2016-03-14
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多