分类船图像

数据挖掘 Python 深度学习 喀拉斯 美国有线电视新闻网 图像分类
2022-02-15 05:55:21

我试图通过探索这个 Kaggle 数据集来获得一些经验。

它由 1500 张船的图片组成,分为 9 类。数据如下:

#x_train consists of 1159 images, with 80% of images from each category

x_train.shape = (1159,200,200,3)

y_train contains the number-label for each boat

y_train.shape = (1159,)

我已经尝试了许多模型的变体,例如以下模型,但没有任何成功。

model = Sequential()

model.add( Conv2D(32, (3,3),  input_shape = x_train.shape[1:] , activation='relu') )
model.add(MaxPooling2D(pool_size=(3,3)))

model.add(Flatten())    
model.add(Dense(4, activation='relu'))

model.add(Dense(2, activation='softmax'))

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

h = model.fit(x_train, y_train, epochs=50,
              batch_size = 64, 
              validation_data = (x_val, y_val) )

你能给我一些关于如何获得一个像样的 test_accuracy 模型的建议吗?

3个回答

通过查看您的代码片段,我意识到您正在从头开始训练您的 CNN。

改用迁移学习。仅使用 1500 张图像训练一个新模型(模型架构的选择,即模型应该有多深,超参数等)即使不是不可能也非常困难。通过使用已经训练好的模型(又名迁移学习),您可以快速获得出色的结果。如果您对该主题不太熟悉,请阅读这篇文章从预训练模型中迁移学习,或使用迁移学习的第一步,使用 Keras 进行自定义图像分类包含有助于更快入门的代码。迁移学习的最新进展之一是高效网络,您可能想使用它!但我想即使使用早期的型号,船也会很容易。

除了上述很好的回复。我尝试了一种迁移学习方法,我使用预训练模型的 CNN 层进行特征提取,然后使用这些特征来训练 DNN 分类器。

但是我的代码仍然存在问题,因为在训练期间,无论历元数多少,我总是得到 0.0463 和 val_accuracy 0.0479 的准确度。显然有问题..但我找不到它。

如果有人能告诉我错误在哪里,我将不胜感激。

boat_categories = ['buoy','cruise ship','ferry boat','freight boat',
                  'gondola','inflatable boat','kayak','paper boat','sailboat']
labels = [0,1,2,3,4,5,6,7,8]
img_size = 224

def create_sets () :

    train = []
    val = []
    test = []

    for category, label in zip(boat_categories, labels) :

        path = os.path.join (data_dir, category) 
        data = []

        for img in os.listdir(path):     
            dir_for_image = os.path.join(path,img)
            img_array= cv2.imread(dir_for_image)
            #print(img_array.shape)
            img_array = cv2.resize( img_array , (img_size, img_size) )
            data.append([img_array,label])

        tr = data[:int(len(data)*0.8)]
        v = data[int(len(data)*0.8):int(len(data)*0.9)]
        te = data[int(len(data)*0.9):]

        for j in range(len(tr)):
            train.append(tr[j])
        for j in range(len(v)):
            val.append(v[j])
        for j in range(len(te)):
            test.append(te[j])

    return train, val, test

# create train, validation and test set
sets = create_sets()
train = sets[0]
val = sets[1]
test = sets[2]

# shuffle the data
random.shuffle(train)
random.shuffle(val)
random.shuffle(test)

#separate images from labels
x_train = []; y_train = []
for j in range(len(train)):
    x_train.append(train[j][0])
    y_train.append(train[j][1])

x_val = []; y_val = []
for j in range(len(val)):
    x_val.append(val[j][0])
    y_val.append(val[j][1])

x_test = []; y_test = []
for j in range(len(test)):
    x_test.append(test[j][0])
    y_test.append(test[j][1])

#normalize
max_value = max(np.max(x_train), np.max(x_val), np.max(x_test))
x_train = x_train/max_value
x_val = x_val/max_value
x_test = x_test/max_value
y_train = np.array(y_train)/10
y_val = np.array(y_val)/10
y_test = np.array(y_test)/10

# transfer learning
#convolutional layers + flatten 
resnet = ResNet50(include_top=False, weights='imagenet', 
                  input_shape=(224,224,3))
output = resnet.layers[-1].output
output = layers.Flatten()(output)
resnet_model = Model(resnet.input, output)

#get features
x_train_feat = resnet_model.predict(x_train, verbose=0)
x_val_feat = resnet_model.predict(x_val, verbose=0)

#the model
model = Sequential()
model.add(layers.Dense(256, activation='relu', 
                       input_dim=resnet_model.output_shape[1]))
model.add(layers.Dense(9, activation='softmax'))

model.compile(loss='sparse_categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
model.fit(x_train_feat, y_train,
         epochs = 10,
         validation_data = (x_val_feat, y_val))  

前几天我正在阅读使用这个数据集的图像分类指南。它涵盖了预处理、训练和建模。这是文章