40

使用keras搭建黑体汉字单个字符识别网络val_acc=0.0002

这是我读入训练数据的过程,数据集是根据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.网上说这种情况大概是过拟合了,希望高手指点一下。

查看全部
qq_41654741
qq_41654741
2019/03/27 19:56
  • 深度学习
  • 神经网络
  • 点赞
  • 收藏
  • 回答
    私信

2个回复