【问题标题】:Different model performance in MLP and CNNMLP 和 CNN 中不同的模型性能
【发布时间】:2018-08-07 00:07:24
【问题描述】:

我正在尝试几何形状分类。我的数据集是正方形、圆形和三角形的 100x100 像素阈值黑白图像,每个形状总共 3000 和 1000。它们看起来像这样:

但我将它们作为 csv 文件获取,其中每一行是图像的一维表示,最后一列是标签。

我使用 sklearn 的 MLP 来制作分类器。它表现得很好。几乎 99%。

df = pd.read_csv("img_data.csv", sep=";")
df = df.sample(frac=1)  # shuffling the whole dataset
X = df.drop('label', axis=1) # Because 'label' is the column of label  
y = df['label']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)

clf = MLPClassifier(solver='adam', activation="relu",alpha=1e-  5,hidden_layer_sizes=(1000,), random_state=1, verbose=True)
clf.fit(X_train, y_train)

y_pred = clf.predict(X_test)

print('accuracy',accuracy_score(y_test, y_pred))

然后我想试试 CNN。为此,我使用了带有 tensorflow 后端的 keras。但是即使在 20 个 epoch 之后,这里的准确率也不能超过 92%。这是我的代码:

df = pd.read_csv("img_data.csv", sep=";")
df = df.sample(frac=1)  # shuffling the whole dataset
X = df.drop('label', axis=1) # Because 'label' is the column of label  
y = df['label']

X=X.as_matrix()
X = np.reshape(X, (-1, 100, 100, 1)) #made 1d to 2d

a = list(y)
label_binarizer = sklearn.preprocessing.LabelBinarizer()
label_binarizer.fit(range(max(a)))
y = label_binarizer.transform(a) # encoding one hot for labels
X_train, X_test, y_train, y_test = train_test_split(all_images, y, test_size=0.20)


model = Sequential()
model.add(Conv2D(32, 3, activation='relu', input_shape=[100, 100, 1])) 
model.add(MaxPool2D())
model.add(BatchNormalization())
model.add(Conv2D(64, 3, activation='relu'))
model.add(MaxPool2D())
model.add(BatchNormalization())
model.add(Conv2D(128, 3, activation='relu'))
model.add(MaxPool2D())
model.add(BatchNormalization())
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dense(3, activation='softmax'))

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

epochs = 20
model.fit(X_train, y_train, 
      validation_data=(X_test, y_test),
      epochs=epochs, batch_size=64, verbose=1)

【问题讨论】:

    标签: python image-processing tensorflow keras conv-neural-network


    【解决方案1】:

    这似乎是一个非常简单的问题。数据内部的结构非常少,所以我认为您可以尝试通过移除最后两个卷积层和最大池化层来减少神经网络的深度。而是增加全连接层的节点数,如下所示:

    model = Sequential()
    model.add(Conv2D(32, 3, activation='relu', input_shape=[100, 100, 1])) 
    model.add(MaxPool2D())
    model.add(BatchNormalization())
    model.add(Conv2D(64, 3, activation='relu'))
    model.add(MaxPool2D())
    model.add(BatchNormalization())
    model.add(Flatten())
    model.add(Dense(1000, activation='relu'))
    model.add(Dense(3, activation='softmax'))
    

    您还可以尝试使用一些图像增强技术(例如移动和旋转)来增加数据集。然后我希望 convnet 的性能优于标准 mlp。

    最好的

    【讨论】:

    • 感谢您的回答。尝试您的模型架构没有任何改进。我现在将尝试图像增强。
    猜你喜欢
    • 2021-06-06
    • 2020-12-18
    • 2020-05-12
    • 2017-01-30
    • 1970-01-01
    • 2018-05-26
    • 1970-01-01
    • 2018-09-16
    • 2020-03-09
    相关资源
    最近更新 更多