【发布时间】: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