首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CNN模型精度不超过10%

CNN模型精度不超过10%
EN

Stack Overflow用户
提问于 2020-11-17 15:22:13
回答 1查看 183关注 0票数 1

我正在训练一个由6块CNN自定义块构成的卡拉斯模型。我正在使用tensorflow 2与keras和范畴交叉熵与亚当优化器。数据集由55000幅图像组成。我用20个时代来训练。

模型生成功能:

代码语言:javascript
复制
def generateModel(class_count):
  return keras.Sequential([
    keras.layers.experimental.preprocessing.Rescaling(1./255),
 
    keras.layers.Conv2D(64,kernel_size=(3,3),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_1_a"),
    keras.layers.Conv2D(64,kernel_size=(3,3),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_1_b"),
    keras.layers.Conv2D(64,kernel_size=(3,3),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_1_c"),

 
    keras.layers.Conv2D(64,kernel_size=(3,3),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_2_a"),
    keras.layers.Conv2D(64,kernel_size=(3,3),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_2_b"),
    keras.layers.Conv2D(64,kernel_size=(3,3),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_2_c"),
    keras.layers.MaxPooling2D((1,1)),   
 
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_3_a"),
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_3_b"),
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_3_c"),

    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_4_a"),
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_4_b"),
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_4_c"),
    keras.layers.MaxPooling2D((1,1)),

    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_5_a"),
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_5_b"),
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_5_c"),
 
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_6_a"),
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_6_b"),
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_6_c"),
    keras.layers.MaxPooling2D((2,2)),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(512,activation=keras.activations.tanh),
    keras.layers.Dense(256,activation=keras.activations.tanh),
    keras.layers.Dense(128,activation=keras.activations.tanh),
    keras.layers.Dense(class_count,activation=keras.activations.softmax)
])

我的主要问题是,精度以0.09到0.1之间的值开始,并且以这个范围结束。模型的精度没有增加,你可以说它几乎稳定。我还试图减少过滤通道的数量,将它们设置为每个块中的32个,但仍然会发生同样的情况。我不知道发生了什么。

更新:

数据集链接

数据集加载函数。path变量接受存储图像(如/home/username/PLantDiseaseDataset/* )根位置的路径,其中*可以是由图像组成的任何类名文件夹:

代码语言:javascript
复制
def getDataset(path):
  dataset={}
  dataset['training']=keras.preprocessing.image_dataset_from_directory(dataset_location,label_mode='categorical',batch_size=32,image_size=(256,256),seed=1,validation_split=0.1,subset='training')
  dataset['validation']=keras.preprocessing.image_dataset_from_directory(dataset_location,label_mode='categorical',batch_size=32,image_size=(256,256),seed=1,validation_split=0.1,subset='validation')
  return dataset

生成模型的函数是

代码语言:javascript
复制
def generateModel(class_count):
  return keras.Sequential([
    keras.layers.experimental.preprocessing.Rescaling(1./255),
 
    keras.layers.Conv2D(64,kernel_size=(3,3),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_1_a"),
    keras.layers.Conv2D(64,kernel_size=(3,3),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_1_b"),
    keras.layers.Conv2D(64,kernel_size=(3,3),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_1_c"),

 
    keras.layers.Conv2D(64,kernel_size=(3,3),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_2_a"),
    keras.layers.Conv2D(64,kernel_size=(3,3),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_2_b"),
    keras.layers.Conv2D(64,kernel_size=(3,3),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_2_c"),
    keras.layers.MaxPooling2D((1,1)),   
 
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_3_a"),
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_3_b"),
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_3_c"),

    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_4_a"),
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_4_b"),
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_4_c"),
    keras.layers.MaxPooling2D((1,1)),

    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_5_a"),
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_5_b"),
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_5_c"),
 
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_6_a"),
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_6_b"),
    keras.layers.Conv2D(32,kernel_size=(2,2),strides=(1,1),padding='valid',activation=keras.activations.relu,name="Conv_6_c"),
    keras.layers.MaxPooling2D((2,2)),
    keras.layers.Flatten(),
    keras.layers.Dropout(0.3),
    keras.layers.Dense(512,activation=keras.activations.tanh),
    keras.layers.Dense(256,activation=keras.activations.tanh),
    keras.layers.Dense(128,activation=keras.activations.tanh),
    keras.layers.Dense(class_count,activation=keras.activations.softmax)
])

训练模型的功能是

代码语言:javascript
复制
def train_model(model,dataset):
  model.compile(loss='categorical_crossentropy',optimizer=keras.optimizers.Adam(learning_rate=0.001),metrics=['categorical_accuracy'])
  history=model.fit(dataset['validation'],epochs=10)
  return history

所有函数和执行语句的调用如下

代码语言:javascript
复制
dataset_location=<Root location of the images i.e. the path variable value>
dataset=getDataset(dataset_location)
model=generateModel(len(dataset['training'].class_names))
history=train_model(model,dataset)

我在10%的数据集上对模型进行了10期的训练,结果是

代码语言:javascript
复制
Epoch 1/10
  2/174 [..............................] - ETA: 2:37 - loss: 3.6052 - categorical_accuracy: 0.0625WARNING:tensorflow:Callbacks method `on_train_batch_end` is slow compared to the batch time (batch time: 0.2761s vs `on_train_batch_end` time: 0.7887s). Check your callbacks.
174/174 [==============================] - 180s 1s/step - loss: 3.4654 - categorical_accuracy: 0.0931
Epoch 2/10
174/174 [==============================] - 176s 1s/step - loss: 3.4134 - categorical_accuracy: 0.0979
Epoch 3/10
174/174 [==============================] - 177s 1s/step - loss: 3.4111 - categorical_accuracy: 0.0936
Epoch 4/10
174/174 [==============================] - 177s 1s/step - loss: 3.4097 - categorical_accuracy: 0.0974
Epoch 5/10
174/174 [==============================] - 176s 1s/step - loss: 3.4127 - categorical_accuracy: 0.0936
Epoch 6/10
174/174 [==============================] - 176s 1s/step - loss: 3.4091 - categorical_accuracy: 0.0925
Epoch 7/10
174/174 [==============================] - 176s 1s/step - loss: 3.4102 - categorical_accuracy: 0.0952
Epoch 8/10
174/174 [==============================] - 176s 1s/step - loss: 3.4084 - categorical_accuracy: 0.0913
Epoch 9/10
174/174 [==============================] - 176s 1s/step - loss: 3.4109 - categorical_accuracy: 0.0924
Epoch 10/10
174/174 [==============================] - 176s 1s/step - loss: 3.4107 - categorical_accuracy: 0.0940

希望这也能帮上忙

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-18 01:39:19

为了帮助隔离问题的原因,我建议您使用已知有效的模型。我建议Mobilenet。如果移动网络模型训练得很好,那么问题就在你的模型中。如果训练不好,那么问题就在于数据或数据输入到模型的方式。使用Mobilenet的代码如下所示。Mobilenet需要的图像是224 x 224,所以在您的数据集中进行更改。

代码语言:javascript
复制
img_shape=(224,224)
base_model=tf.keras.applications.mobilenet.MobileNet( include_top=False, input_shape=img_shape, pooling='max', weights='imagenet',dropout=.4) 
x=base_model.output
x = Dense(64, kernel_regularizer = regularizers.l2(l = 0.016),activity_regularizer=regularizers.l1(0.006),
                bias_regularizer=regularizers.l1(0.006) ,activation='relu')(x)
x=Dropout(rate=.3 seed=123)(x) 
output=Dense(class_count, activation='softmax',)(x)
model=Model(inputs=base_model.input, outputs=output)
model.compile(Adamax(lr=.001 ), loss='categorical_crossentropy', metrics='accuracy') 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64878118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档