MLP和CNN中的不同模型性能

时间:2018-02-27 10:59:59

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

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

enter image description here enter image description here enter image description here

但我把它们作为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。为此,我使用了具有张量流后端的keras。但即使在20个时代之后,这里的准确率也不能超过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)

1 个答案:

答案 0 :(得分: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'))

您还可以尝试使用一些图像增强技术,如移动和旋转,以增加数据集。然后我预计该网站的性能将超过标准的mlp。

最佳