这是我读入训练数据的过程,数据集是根据txt文件生成的单个汉字的图像(shape为64*64)788种字符(包括数字和X字符),每张图片的开头命名为在txt字典中的位置,作为标签,
def read_train_image(self, name):
img = Image.open(name).convert('RGB')
return np.array(img)
def train(self):
train_img_list = []
train_label_list = []
for file in os.listdir('train'):
files_img_in_array = self.read_train_image(name='train/'+ file)
train_img_list.append(files_img_in_array) # Image list add up
train_label_list.append(int(file.split('_')[0])) # lable list addup
train_img_list = np.array(train_img_list)
train_label_list = np.array(train_label_list)
train_label_list = np_utils.to_categorical(train_label_list,
self.count)
train_img_list = train_img_list.astype('float32')
train_img_list /= 255
训练下来,虽然train_acc达到0.99,但是验证accuracy一直都等于0.
下面是网络结构:
model = Sequential()
#创建第一个卷积层。
model.add(Convolution2D(32, 3, 3, border_mode='valid', input_shape=(64,64,3),kernel_regularizer=l2(0.0001)))
model.add(BatchNormalization(axis=3))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
#创建第二个卷积层。
model.add(Convolution2D(64, 3, 3, border_mode='valid',kernel_regularizer=l2(0.0001)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
#创建第三个卷积层。
model.add(Convolution2D(128, 3, 3, border_mode='valid',kernel_regularizer=l2(0.0001)))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
# 创建全连接层。
model.add(Flatten())
model.add(Dense(128, init= 'he_normal'))
model.add(BatchNormalization())
model.add(Activation('relu'))
#创建输出层,使用 Softmax函数输出属于各个字符的概率值。
model.add(Dense(output_dim=self.count, init= 'he_normal'))
model.add(Activation('softmax'))
#设置神经网络中的损失函数和优化算法。
model.compile(loss='categorical_crossentropy', optimizer='adam',metrics=['accuracy'])
#开始训练,并设置批尺寸和训练的步数。
model.fit(
train_img_list,
train_label_list,
epochs=500,
batch_size=128,
validation_split=0.2,
verbose=1,
shuffle= False,
)
大概结构是这样,十几轮后训练集acc达到了0.99.验证集val_acc为0.网上说这种情况大概是过拟合了,希望高手指点一下。