【问题标题】:How to set filters for convoltional neural network如何为卷积神经网络设置过滤器
【发布时间】:2019-09-10 04:26:32
【问题描述】:

我正在尝试使用 keras cnn 构建多类图像分类器。我输入的图像大小是 (256,256) 像素。但我改用 (128,128),因为处理 (256,256) 像素图像需要很多时间。但是当我用测试集测试网络时,我几乎没有得到 50% 的准确率,尽管我在训练期间得到了 97% 的准确率。我认为过滤器或层数有问题。谁能解释如何提高我的基于 cnn 的分类器的效率。

我尝试改变 epoch 的数量,我使用的输入形状为 (64,64),但这些产生的效果很小。

...enter code here

from keras.models import Sequential
from keras.layers import Conv2D
from keras.layers import MaxPooling2D
from keras.layers import Dense
from keras.layers import Flatten
from keras.layers import Dropout
import os


classifier = Sequential()

classifier.add(Conv2D(64,(3,3), input_shape = (128,128,3), activation = "relu"))

classifier.add(Conv2D(64,(3,3), input_shape = (128,128,3), activation = "relu"))

classifier.add(Conv2D(32,(3,3), input_shape = (128,128,3), activation = "relu"))

classifier.add(Conv2D(32,(3,3), input_shape = (128,128,3), activation = "relu"))
classifier.add(MaxPooling2D(pool_size = (2,2)))



classifier.add(Flatten())
classifier.add(Dropout(0.5))
classifier.add(Dense(units= 64, activation = "relu"))

classifier.add(Dense(units= 6, activation = "softmax"))

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



from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale = 1./255)
training_set = train_datagen.flow_from_directory("/home/user/Documents/final_year_project/dataset/training",
target_size = (128,128),
batch_size = 50,
class_mode="categorical")

test_set = test_datagen.flow_from_directory(
"/home/user/Documents/final_year_project/dataset/testing/",
target_size = (128,128),
batch_size = 32,
class_mode="categorical")


from IPython.display import display
from PIL import Image

classifier.fit_generator(training_set, steps_per_epoch=98, epochs=18)

target_dir = '/home/user/Documents/model'
if not os.path.exists(target_dir):
os.mkdir(target_dir)
classifier.save('/home/user/Documents/model/model.h5')
classifier.save_weights('/home/user/Documents/model/weights.h5')

print("Training Completed!!")

【问题讨论】:

    标签: python tensorflow keras classification conv-neural-network


    【解决方案1】:

    您可以做一些明显的改进(对我来说):

    将批量大小更改为 2 ** n(即 2 的 5 次方:batch_size = 32)。

    input_shape 仅保留给您的输入层(第一个卷积层)。

    classifier = Sequential()
    
    # Add extraction layers.
    classifier.add(Conv2D(64,(3,3), input_shape = (128,128,3), 
                   activation="relu"))
    classifier.add(Conv2D(64,(3,3), activation="relu"))
    classifier.add(MaxPooling2D(pool_size = (2,2)))     # <= this may help as well
    classifier.add(Conv2D(32,(3,3), activation="relu"))
    classifier.add(Conv2D(32,(3,3), activation="relu"))
    classifier.add(MaxPooling2D(pool_size = (2,2)))
    
    # Add classifier layers.
    classifier.add(Flatten()) 
    classifier.add(Dropout(0.5))        # might be too big, can try 0.2
    classifier.add(Dense(units=64, activation="relu"))
    classifier.add(Dense(units=6, activation="softmax"))
    
    classifier.compile(optimizer="adam", loss="categorical_crossentropy", 
                       metrics = ['accuracy'])
    

    最重要的:将验证数据添加到您的训练中。训练:验证比例大约为 80:20。

    fit_generator(
        generator,              # *
        steps_per_epoch=None,   # **
        epochs=20,
        verbose=1,
        callbacks=None,
        validation_data=None,   # same format as training generator *
        validation_steps=None,  # same format as steps_per_epoch    **
        class_weight=None,
        max_queue_size=10,
        workers=1,
        use_multiprocessing=False,
        shuffle=True,
        initial_epoch=0
    )
    

    【讨论】:

    • 你能解释更多关于输入形状的信息吗?因为我的系统以高输入形状挂起。
    • 你能解释一下验证吗?我听不懂你说什么。
    猜你喜欢
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 2016-03-10
    • 2017-01-01
    • 1970-01-01
    • 2019-08-30
    相关资源
    最近更新 更多