silent2Sky 2019-03-27 19:56 采纳率: 33.3%
浏览 1296
已结题

使用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.网上说这种情况大概是过拟合了,希望高手指点一下。

  • 写回答

2条回答

  • threenewbee 2019-03-27 20:54
    关注

    你的数据量有多大,几千个汉字,就是几千的分类,你的样本太少就会学不动
    你可以先从英文字母或者数字识别试起

    评论

报告相同问题?

悬赏问题

  • ¥15 Stata 面板数据模型选择
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 请问这个是什么意思?
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用