【发布时间】:2019-06-25 18:41:04
【问题描述】:
我是 CNN 的新手,但对 ML 和神经网络有基本的了解。
我想创建自己的 CNN,用于 Cats and Dogs 数据集。我对数据进行了预处理并构建了我的网络,但是当我用数据拟合模型时,我无法获得超过 55% 的准确率,这意味着模型没有学习任何东西。
谁能解释我在这里做错了什么?
已经尝试了不同的学习率,甚至是 dropout,但都是徒劳的
数据处理部分:
train_directory = r'C:\Users\atjayade\Downloads\P14-Convolutional-Neural-Networks\Convolutional_Neural_Networks\dataset\training_set'
test_directory = r'C:\Users\atjayade\Downloads\P14-Convolutional-Neural-Networks\Convolutional_Neural_Networks\dataset\test_set'
def label_image(img):
label = img.split('.')[-3]
if label == 'cat':
return [1,0]
if label == 'dog':
return [0,1]
training=[]
for item1 in os.listdir(train_directory):
path1 = os.path.join(train_directory, item1)
for item in tqdm.tqdm(os.listdir(path1)):
lab = label_image(item)
img_path = os.path.join(path1, item)
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (50,50))
training.append([np.array(img), lab])
testing=[]
for item1 in os.listdir(test_directory):
path1 = os.path.join(test_directory, item1)
for item in tqdm.tqdm(os.listdir(path1)):
lab = label_image(item)
img_path = os.path.join(path1, item)
img = cv2.imread(img_path, cv2.IMREAD_GRAYSCALE)
img = cv2.resize(img, (50,50))
testing.append([np.array(img), lab])
test_x = np.array([i[0] for i in testing]).reshape(-1,50,50,1)
test_y = [i[1] for i in testing]
X = np.array([i[0] for i in training]).reshape(-1,50,50,1)
Y = [i[1] for i in training]
还有CNN模型和优化器部分:
model = Sequential()
model.add(Conv2D(filters=32, kernel_size=(3,3),padding='SAME', input_shape=X[0].shape))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2), dim_ordering='th'))
model.add(Conv2D(filters=64, kernel_size=(3,3), padding='SAME'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2), dim_ordering='th'))
model.add(Dropout(rate=0.4))
model.add(Conv2D(filters=128, kernel_size=(3,3), padding='SAME'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2), dim_ordering='th'))
model.add(Dropout(rate=0.35))
#model.add(Conv2D(filters=64, kernel_size=(3,3), padding='SAME'))
#model.add(Activation('relu'))
#model.add(MaxPooling2D(pool_size=(2,2), dim_ordering='th'))
model.add(Flatten())
model.add(Dense(1024))
model.add(Activation('relu'))
model.add(Dropout(rate=0.3))
model.add(Dense(2))
model.add(Activation('softmax'))
opt = keras.optimizers.SGD(lr=0.0001, decay=0.0)
model.compile(optimizer=opt, loss='binary_crossentropy', metrics['accuracy'])
print(model.summary())
model.fit(X, np.array(Y), validation_data=(test_x, np.array(test_y)), epochs=30, verbose=2)
上述模型在运行时,准确率不超过 50%。尝试了不同的 CNN 构建变体、不同的优化器,但都是徒劳的。
有什么我没看到的吗?
【问题讨论】:
-
例如,你的损失应该是'categorical_crossentropy'。
-
只有两个类。猫和狗。 binary_crossentropy 应该可以正常工作,对吧?
-
我相信这个数据集在:coursera.org/learn/convolutional-neural-networks-tensorflow/… 中讨论过。您可以考虑免费试用。
-
我确实在网上看到了那个试验。但我想知道为什么这个 CNN 不起作用。
-
您选择了“softmax”激活。这应该与 categorical_cross 熵一起使用。或者,如果您希望允许图像没有任何类别或两者都有的可能性,则使用“二元”损失的“sigmoid”激活。
标签: python-3.x tensorflow keras deep-learning conv-neural-network