甚至在调整了密集,激活和层数之后,仍会丢失损耗,并且精度仍低于0.01

时间:2019-06-14 10:52:13

标签: python machine-learning keras jupyter-notebook

如标题中所述,我不知道如何建立犬种识别的最佳模型。

我尝试了各种方法,例如删除图层,更改密实值,增加学习率,增加衰减率,甚至更改优化程序,但无济于事

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Dropout,Activation, Flatten, Conv2D, MaxPooling2D

#print(X)
# print(y)
model = Sequential()

# METHOD TWO(Works but not accurate, built by self)
model.add(Conv2D(128,(3,3),input_shape=X.shape[1:]))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Activation("relu"))

model.add(Conv2D(128,(3,3)))
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Activation("relu"))

model.add(Flatten())
model.add(Activation("relu"))
model.add(Dense(2048))
model.add(Dropout(0.5))

model.add(Activation("relu"))
model.add(Dense(2048))
model.add(Dropout(0.5))

model.add(Activation("relu"))
model.add(Dense(2048))
model.add(Dropout(0.5))

model.add(Activation("softmax"))
model.add(Dense(120))

opt = tf.keras.optimizers.Adam()
model.compile(optimizer = opt,
             loss='sparse_categorical_crossentropy',
             metrics=['accuracy'])

# from tfkeras.utils import to_categorical
# y_binary = tf.keras.utils.to_categorical(y)
# y_binary = to_categorical(y)

model.fit(X, y,epochs=2)

Epoch 1/2
20580/20580 [==============================] - 311s 15ms/sample - loss: 4.8735 - acc: 0.0084

Epoch 2/2
12448/20580 [=================>............] - ETA: 2:02 - loss: 4.7875 - acc: 0.0071

1 个答案:

答案 0 :(得分:4)

这里有些错误的地方:

  • 在最大程度地共享它们之前,首先激活conv2d层! ->
model.add(Conv2D(128, (3, 3), input_shape=X.shape[1:], activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(128,(3,3),input_shape=X.shape[1:]))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2,2)))
  • 第二,您需要在最后一层之后而不是在最后一层之前进行softmax激活! Softmax用于计算最后一层的每个神经元的概率,您需要这样做:
model.add(Dense(120))
model.add(Activation("softmax"))
  • 第三,就像Matias所说的那样,仅仅2个纪元是不够的,请尝试增加这个数字!
  • 这种分类的第4个2转换层根本不够,请增加它,并更改滤镜的数量以捕获图像上的不同特征
    常见的卷积Bloc体系结构可能如下所示:
model.add(Conv2D(64, (3, 3) , padding='SAME'))
model.add(Activation("relu"))
model.add(Conv2D(64, (3, 3) , padding='SAME'))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

您可以根据需要操纵此类块,尝试使用具有不同数量过滤器的多个块,等等

  • 第五,完全连接的网络中神经元过多,无法解决问题,请尝试使用更简单的体系结构以在更短的时间内获得更好的结果:
model.add(Flatten())
model.add(Dense(256))
model.add(Activation('relu')
model.add(Dense(128)(x)
model.add(Activation('relu'))
model.add(Dense(120))
model.add(Activation('softmax'))

在评论中告诉我此更改为您带来的结果!