我正在训练一个由6块CNN自定义块构成的卡拉斯模型。我正在使用tensorflow 2与keras和范畴交叉熵与亚当优化器。数据集由55000幅图像组成。我用20个时代来训练。
模型生成功能:
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/* )根位置的路径,其中*可以是由图像组成的任何类名文件夹:
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生成模型的函数是
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)
])训练模型的功能是
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所有函数和执行语句的调用如下
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期的训练,结果是
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希望这也能帮上忙
发布于 2020-11-18 01:39:19
为了帮助隔离问题的原因,我建议您使用已知有效的模型。我建议Mobilenet。如果移动网络模型训练得很好,那么问题就在你的模型中。如果训练不好,那么问题就在于数据或数据输入到模型的方式。使用Mobilenet的代码如下所示。Mobilenet需要的图像是224 x 224,所以在您的数据集中进行更改。
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') https://stackoverflow.com/questions/64878118
复制相似问题