【问题标题】:training VGG16 from scratch using keras function api. all test images gets predicted as one class使用 keras 函数 api 从头开始​​训练 VGG16。所有测试图像都被预测为一类
【发布时间】:2021-11-08 01:57:50
【问题描述】:

我正在使用函数式 API 训练基于 VGG16 架构的 CNN。 数据集有 2 个类别(汽车和飞机),每个类别有 500 个训练图像和 100 个验证图像。我没有得到好的结果。并且在预测时它将所有图像分类为一个类(如果我将给出汽车图像,它将o / p作为航空飞机) 请帮助我获得正确的输出。帮助我纠正我的概念

import keras
import numpy as np
import pandas as pd
import math
from keras.preprocessing.image import ImageDataGenerator
import matplotlib.pyplot as plt
from keras.applications.vgg16 import preprocess_input
from keras.layers import Input
from keras.layers import Dense, Conv2D, MaxPooling2D , Flatten
from keras.models import Model
from tensorflow.keras import optimizers
import matplotlib.pyplot as plt
import numpy as np
from google.colab import files
from keras.preprocessing import image

加载数据集

batch_size=32
trdata = ImageDataGenerator(zoom_range=0.3, rotation_range=50,rescale=1/255,
                                   width_shift_range=0.2, height_shift_range=0.2, #shear_range=0.2, 
                                   horizontal_flip=True, fill_mode='nearest')
traindata = trdata.flow_from_directory(directory="train",batch_size=batch_size,target_size=(224,224),class_mode='categorical')
tsdata = ImageDataGenerator(rescale=1/255)
validdata = tsdata.flow_from_directory(directory="validation",batch_size=batch_size, target_size=(224,224),class_mode='categorical')

定义架构

image_shape=(224,224,3)
l1=Input(shape=image_shape)
l2 = Conv2D(64, (3,3), padding='same', activation='relu')(l1)
l3 = Conv2D(64, (3,3), padding='same', activation='relu')(l2)
l4 = MaxPooling2D((2,2), strides=(2,2))(l3)
l5 = Conv2D(128, (3,3), padding='same', activation='relu')(l4)
l6 = Conv2D(128, (3,3), padding='same', activation='relu')(l5)
l7 = MaxPooling2D((2,2), strides=(2,2))(l6)
l8 = Conv2D(256, (3,3), padding='same', activation='relu')(l7)
l9 = Conv2D(256, (3,3), padding='same', activation='relu')(l8)
l10 = Conv2D(256, (3,3), padding='same', activation='relu')(l9)
l11 = MaxPooling2D((2,2), strides=(2,2))(l10)
l12 = Conv2D(512, (3,3), padding='same', activation='relu')(l11)
l13 = Conv2D(512, (3,3), padding='same', activation='relu')(l12)
l15 = Conv2D(512, (3,3), padding='same', activation='relu')(l13)
l16 = MaxPooling2D((2,2), strides=(2,2))(l15)
l17 = Conv2D(512, (3,3), padding='same', activation='relu')(l16)
l18 = Conv2D(512, (3,3), padding='same', activation='relu')(l17)
l19 = Conv2D(512, (3,3), padding='same', activation='relu')(l18)
l20 = MaxPooling2D((2,2), strides=(2,2))(l19)
fc1=keras.layers.Flatten()(l20)
fc11=Dense(4096, activation='relu')(fc1)
fc12=Dense(4096, activation='relu')(fc11)
fc13=Dense(2, activation='softmax')(fc12)
model1 = Model(inputs=l1, outputs=fc13)
model1.summary()

模型编译和训练

opt = optimizers.SGD(learning_rate=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model1.compile(loss='binary_crossentropy',
              optimizer=opt,
              metrics=['accuracy'])
history = model1.fit_generator(
      traindata,
      steps_per_epoch=math.ceil(traindata.samples//batch_size),
      epochs=5,
      verbose=1,
      validation_data = validdata,
      validation_steps=math.ceil(validdata.samples//batch_size))

预测

uploaded = files.upload()

for fn in uploaded.keys():
 
  # predicting images
  path = '/content/' + fn
  img = image.load_img(path, target_size=(224, 224))
  img = np.asarray(img)
  plt.imshow(img)
  img = np.expand_dims(img, axis=0)
  classes = model.predict(img/255)
  a=classes[0]
  pos=np.argmax(a)
  if pos==0:
    print("plane")
  elif pos==1:
    print("car")

准确度 失利

输出

我做错了什么?

【问题讨论】:

    标签: machine-learning keras neural-network conv-neural-network


    【解决方案1】:

    看看你的训练准确率曲线,它几乎是 50%。对于 2 类分类,即使是随机猜测也会显示 50% 的准确率。

    因此,您的模型根本没有学到任何东西。您的方法存在不止一个问题。

    1. 500 张图像用于训练!对于训练深度学习模型而言,这绝不是一个好的样本数量,因此请增加样本数量。

    2. 降低学习率。

    3. 对于 softmax 输出,您的损失应该是分类交叉熵。只需简单地在末尾添加 1 个神经元,使用 sigmoid 和二元交叉熵损失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-05
      • 1970-01-01
      • 2017-05-29
      • 2018-07-13
      • 2020-02-11
      • 2017-05-04
      相关资源
      最近更新 更多