Toybrick

楼主: Hhhhlnlnlnh

3399pro来做语音识别,pb模型转rknn后效果非常不好

Hhhhlnlnlnh

注册会员

积分
79
11#
 楼主| 发表于 2019-5-21 13:48:34 | 显示全部楼层
本帖最后由 Hhhhlnlnlnh 于 2019-5-21 13:49 编辑
bobby_jiang 发表于 2019-5-21 10:30
你现在用的rknn-toolkit是什么版本?
另外,你把原始模型和rknn模型,还有代码都贴上来。 ...

rknn-toolkit版本是0.9.9
原始pb模型和rknn模型放在百度云盘里
链接:https://pan.baidu.com/s/1doU0uLZXVBMv9EZ6C_r4rA
提取码:rlsq


keras模型代码
  1. input_data = Input(name='the_input', shape=(320000, 1), dtype='float32')

  2. input_wavImage = Reshape((1600, 200, 1), name='Reshape')(input_data)

  3. layer_h1 = Conv2D(32, (3,3), use_bias=False, activation='relu', padding='same', kernel_initializer='he_normal')(input_wavImage) # 卷积层
  4. layer_h1 = Dropout(0.05)(layer_h1)
  5. layer_h2 = Conv2D(32, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h1) # 卷积层
  6. layer_h3 = MaxPooling2D(pool_size=2, strides=None, padding="valid")(layer_h2) # 池化层
  7. #layer_h3 = Dropout(0.2)(layer_h2) # 随机中断部分神经网络连接,防止过拟合
  8. layer_h3 = Dropout(0.05)(layer_h3)
  9. layer_h4 = Conv2D(64, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h3) # 卷积层
  10. layer_h4 = Dropout(0.1)(layer_h4)
  11. layer_h5 = Conv2D(64, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h4) # 卷积层
  12. layer_h6 = MaxPooling2D(pool_size=2, strides=None, padding="valid")(layer_h5) # 池化层

  13. layer_h6 = Dropout(0.1)(layer_h6)
  14. layer_h7 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h6) # 卷积层
  15. layer_h7 = Dropout(0.15)(layer_h7)
  16. layer_h8 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h7) # 卷积层
  17. layer_h9 = MaxPooling2D(pool_size=2, strides=None, padding="valid")(layer_h8) # 池化层

  18. layer_h9 = Dropout(0.15)(layer_h9)
  19. layer_h10 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h9) # 卷积层
  20. layer_h10 = Dropout(0.2)(layer_h10)
  21. layer_h11 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h10) # 卷积层
  22. layer_h12 = MaxPooling2D(pool_size=1, strides=None, padding="valid")(layer_h11) # 池化层

  23. layer_h12 = Dropout(0.2)(layer_h12)
  24. layer_h13 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h12) # 卷积层
  25. layer_h13 = Dropout(0.2)(layer_h13)
  26. layer_h14 = Conv2D(128, (3,3), use_bias=True, activation='relu', padding='same', kernel_initializer='he_normal')(layer_h13) # 卷积层
  27. layer_h15 = MaxPooling2D(pool_size=1, strides=None, padding="valid")(layer_h14) # 池化层

  28. #test=Model(inputs = input_data, outputs = layer_h12)
  29. #test.summary()

  30. layer_h16 = Reshape((200, 3200))(layer_h15) #Reshape层
  31. #layer_h5 = LSTM(256, activation='relu', use_bias=True, return_sequences=True)(layer_h4) # LSTM层
  32. #layer_h6 = Dropout(0.2)(layer_h5) # 随机中断部分神经网络连接,防止过拟合
  33. layer_h16 = Dropout(0.3)(layer_h16)
  34. layer_h17 = Dense(128, activation="relu", use_bias=True, kernel_initializer='he_normal')(layer_h16) # 全连接层
  35. layer_h17 = Dropout(0.3)(layer_h17)
  36. layer_h18 = Dense(1422, use_bias=True, kernel_initializer='he_normal')(layer_h17) # 全连接层
复制代码


rknn模型转换代码,且log中没有error或warning
  1. from rknn.api import RKNN

  2. rknn = RKNN(verbose=True, verbose_file='./build.log')
  3. rknn.config()

  4. print('--> Loading model')
  5. rknn.load_tensorflow(tf_pb='./model.pb',
  6.                      inputs=['the_input'],
  7.                      outputs=['Activation0/truediv'],
  8.                      input_size_list=[[320000, 1]])
  9. print('done')

  10. # Build Model
  11. print('--> Building model')
  12. rknn.build(do_quantization=False)
  13. print('done')

  14. rknn.export_rknn('./model.rknn')

  15. rknn.release()
复制代码


rknn模型inference代码
  1. rknn = RKNN()
  2. rknn.load_rknn('./model.rknn')
  3. ret = rknn.init_runtime(target='rk3399pro')
  4. if ret != 0:
  5.     print('Init runtime environment failed')
  6.     exit(ret)
  7. print('done')

  8. # x_in.size  = (1, 320000, 1)
  9. x_in, in_len = load_wav_input(filename)

  10. out = rknn.inference(inputs=[x_in], data_type='float32')
复制代码


同样的环境原来模型没用Reshape直接输入(1600,200,1)可以inference,但最后softmax后np.sum(out)应该=200,pb模型是这样,但rknn模型np.sum(out)是几千完全不对,因此想输入一维向量在模型中reshape,但出之前的错误
回复

使用道具 举报

Hhhhlnlnlnh

注册会员

积分
79
12#
 楼主| 发表于 2019-5-21 13:51:27 | 显示全部楼层
protossw512 发表于 2019-5-21 06:05
对,因为它转换的时候和inference的时候长宽两个维度的顺序反了,所以可以正产转换,但是没办法读取来做i ...

可是照你这样说的话模型中就不支持长宽不同的输入reshape操作了?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

产品中心 购买渠道 开源社区 Wiki教程 资料下载 关于Toybrick


快速回复 返回顶部 返回列表