tensorflow js загрузка модели gru

#javascript #tensorflow #tensorflow.js

#javascript #tensorflow #tensorflow.js

Вопрос:

У меня есть модель на основе GRU. Я преобразовал его для tensorflow js. При загрузке iin tfjs выдает ошибку

Необработанное отклонение (ошибка): GRUCell не поддерживает параметр reset_after, для которого установлено значение true.

Я прикрепил соответствующий json. Пожалуйста, посоветуйте

{«format»: «layers-model», «generatedBy»: «keras v2.4.0», «convertedBy»: «TensorFlow.js Конвертер v2.7.0», «modelTopology»: {«keras_version»: «2.4.0», «серверная часть»: «tensorflow», «model_config»: {«class_name»: «Последовательный», «config»: {«name»: «последовательный», «layers»: [{«class_name»: «InputLayer», «config»: {«batch_input_shape»: [null, 48, 64], «dtype»:»float32″, «sparse»: false, «ragged»: false, «name»: «input_1»}}, {«class_name»: «LayerNormalization», «config»: {«name»: «layer_normalization», «trainable»: true, «dtype»: «float32», «axis»: [2], «epsilon»: 0.001, «center»: true, «scale»: true, «beta_initializer»: {«class_name»: «Нули», «config»: {}}, «gamma_initializer»: {«class_name»: «Единицы», «config»: {}}, «beta_regularizer»: null, «gamma_regularizer»: null, «beta_constraint»: null, «gamma_constraint»: null}}, {«class_name»: «Conv1D», «config»: {«name»: «conv1d», «обучаемый»: true, «dtype»: «float32», «фильтры»: 32, «kernel_size»: [3], «шаги»: [1], «заполнение»: «допустимый», «data_format»: «channels_last», «dilation_rate»: [1], «группы»: 1, «активация»: «relu», «use_bias»: true, «kernel_initializer»: {«class_name»: «GlorotUniform», «config»: {«seed»: null}}, «bias_initializer»: {«class_name»: «Нули», «config»: {}}, «kernel_regularizer»: null, «bias_regularizer»: null, «activity_regularizer»: null, «kernel_constraint»: null, «bias_constraint»: null}}, {«class_name»: «BatchNormalization», «config»: {«name»: «batch_normalization», «обучаемый»: true, «dtype»: «float32», «axis»: [2], «momentum»: 0.99, «epsilon»: 0.001, «center»: true, «scale»: true, «beta_initializer»: {«имя_класса»: «Нули», «конфигурация»: {}}, «gamma_initializer»: {«имя_класса»: «Единицы», «конфигурация»: {}}, «moving_mean_initializer»: {«имя_класса»: «Нули», «конфигурация»: {}},»moving_variance_initializer»: {«class_name»: «Ones», «config»: {}}, «beta_regularizer»: null, «gamma_regularizer»: null, «beta_constraint»: null, «gamma_constraint»: null}}, {«class_name»: «MaxPooling1D», «config»:{«name»: «max_pooling1d», «обучаемый»: true, «dtype»: «float32», «strides»: [3], «pool_size»: [3], «padding»: «допустимый», «data_format»: «channels_last»}}, {«class_name»: «Conv1D», «config»: {«name»: «conv1d_1», «обучаемый»: true, «dtype»: «float32», «filters»: 32, «kernel_size»: [3], «strides»: [1], «padding»: «допустимые», «data_format»: «channels_last», «dilation_rate»: [1], «группы»: 1, «активация»: «relu», «use_bias»: true, «kernel_initializer»: {«class_name»: «GlorotUniform», «config»: {«seed»: null}}, «bias_initializer»: {«class_name»: «Нули», «config»: {}}, «kernel_regularizer»: null, «bias_regularizer»: null, «activity_regularizer»: null, «kernel_constraint»: null, «bias_constraint»: null}}, {«class_name»: «Выпадающий», «config»: {«name»: «выпадающий», «обучаемый»: true, «dtype»: «float32», «rate»: 0.25, «noise_shape»: null, «seed»: null}}, {«class_name»: «GRU», «config»: {«name»: «gru», «обучаемый»: true, «dtype»: «float32», «return_sequences»: true, «return_state»: false, «go_backwards»: false, «stateful»: false, «unroll»: false, «time_major»: false, «units»: 40, «activation»: «tanh», «recurrent_activation»: «сигмоид», «use_bias»: true, «kernel_initializer»: {«class_name»: «GlorotUniform», «config»: {«seed»: null}}, «recurrent_initializer»: {«class_name»: «Ортогональный», «config»: {«gain»: 1.0, «seed»: null}}, «bias_initializer»: {«class_name»: «Нули», «конфигурация»: {}}, «kernel_regularizer»: null, «recurrent_regularizer»: null, «bias_regularizer»: null, «activity_regularizer»: null, «kernel_constraint»: null, «recurrent_constraint»: null, «bias_constraint»: null, «выпадающий»:0.0, «recurrent_dropout»: 0.0, «реализация»: 2, «reset_after»: true}}, {«class_name»: «GRU», «config»: {«name»: «gru_1», «обучаемый»: true, «dtype»: «float32», «return_sequences»: false, «return_state»: false, «go_backwards»: false, «stateful»: false, «unroll»: false, «time_major»: false, «units»: 40, «activation»: «tanh», «recurrent_activation»: «сигмоид», «use_bias»: true, «kernel_initializer»:{«class_name»: «GlorotUniform», «config»: {«seed»: null}}, «recurrent_initializer»: {«class_name»: «Ортогональный», «config»: {«gain»: 1.0, «seed»: null}}, «bias_initializer»: {«имя_класса»: «Нули», «конфигурация»: {}}, «kernel_regularizer»: null, «recurrent_regularizer»: null, «bias_regularizer»: null, «activity_regularizer»: null, «kernel_constraint»: null, «recurrent_constraint»: null, «bias_constraint»: null, «выпадающий»: 0.0, «recurrent_dropout»: 0.0, «implementation»: 2, «reset_after»: true}}, {«class_name»: «Сгладить», «config»: {«name»: «сгладить», «обучаемый»: true, «dtype»: «float32», «data_format»: «channels_last»}}, {«имя_класса»: «Плотный», «конфигурация»: {«имя»: «плотный», «обучаемый»: true, «dtype»: «float32», «единицы измерения»: 100, «активация»: «relu», «use_bias»: true, «kernel_initializer»: {«class_name»: «GlorotUniform», «config»: {«seed»: null}}, «bias_initializer»: {«class_name»: «Нули», «config»: {}}, «kernel_regularizer»: null, «bias_regularizer»: null, «activity_regularizer»: null, «kernel_constraint»: null, «bias_constraint»: null}}, {«class_name»: «Dropout», «config»: {«name»: «dropout_1», «обучаемый»: true, «dtype»: «float32», «rate»: 0.25, «noise_shape»: null, «seed»: null}}, {«class_name»: «Dense», «config»: {«name»: «dense_1», «обучаемый»: true, «dtype»: «float32», «units»: 2, «активация»: «линейный», «use_bias»: true, «kernel_initializer»: {«class_name»: «GlorotUniform», «config»: {«seed»: null}}, «bias_initializer»: {«class_name»: «Нули», «config»: {}}, «kernel_regularizer»: null, «bias_regularizer»: null, «activity_regularizer»: null, «kernel_constraint»: null, «bias_constraint»: null}}]}}, «training_config»: {«потеря»: {«имя_класса»: «Разреженныйкатегорическийкросс-энтропия», «конфигурация»: {«сокращение»: «авто», «имя»: «разреженныйкатегорическийкросс-энтропия», «from_logits»: true}}, «metrics»: [«точность»], «weighted_metrics»: null, «loss_weights»: null, «optimizer_config»: {«class_name»: «Adam», «config»: {«name»: «Adam», «learning_rate»: 0.0010000000474974513, «decay»: 0.0, «beta_1»: 0.8999999761581421, «beta_2»: 0.9990000128746033, «epsilon»: 1e-07, «amsgrad»: false}}}}, «weightsManifest»: [{«пути»: [«group1-shard1of1.bin»], «веса»: [{«имя»: «batch_normalization / гамма», «shape»: [32], «dtype»: «float32»}, {«name»: «batch_normalization /beta», «shape»: [32], «dtype»: «float32»}, {«name»: «batch_normalization /moving_mean», «форма»: [32], «dtype»: «float32»}, {«name»: «batch_normalization / moving_variance», «shape»: [32], «dtype»: «float32»}, {«name»: «conv1d / kernel», «shape»: [3, 64, 32], «dtype»: «float32»}, {«name»: «conv1d/ bias», «shape»: [32], «dtype»: «float32»}, {«name»: «conv1d_1/kernel», «shape»: [3, 32, 32], «dtype»: «float32»}, {«name»: «conv1d_1/bias», «shape»: [32], «dtype»: «float32»}, {«name»: «dense / kernel», «shape»: [40, 100], «dtype»: «float32»}, {«name»: «плотный / смещенный», «shape»: [100], «dtype»: «float32»}, {«name»: «dense_1/kernel», «shape»: [100, 2], «dtype»: «float32»}, {«name»: «dense_1/bias», «shape»: [2], «dtype»: «float32»}, {«name»: «gru/ gru_cell/kernel», «shape»: [32, 120], «dtype»: «float32»}, {«name»: «gru/gru_cell/recurrent_kernel», «shape»: [40, 120], «dtype»: «float32»}, {«name»: «gru/gru_cell/bias», «shape»:[2, 120], «dtype»: «float32»}, {«name»: «gru_1/ gru_cell_1/kernel», «shape»: [40, 120], «dtype»: «float32»}, {«name»: «gru_1/gru_cell_1/recurrent_kernel», «shape»: [40, 120],»dtype»: «float32»}, {«name»: «gru_1/ gru_cell_1/bias», «shape»: [2, 120], «dtype»: «float32»}, {«name»: «layer_normalization / gamma», «shape»: [64],»dtype»: «float32»}, {«name»: «layer_normalization / beta», «shape»: [64], «dtype»: «float32»}]}]}

Комментарии:

1. Может быть, вы можете открыть проблему на github

2. Вы нашли какое-либо решение этой проблемы? В настоящее время у меня есть эта проблема, и я ничего не могу найти

3. @Macro, нет, я не получил решения. Но кое-где я обнаружил, что новая ячейка gru на основе python отличается от ячейки на основе js. Последние изменения пока недоступны в tfjs

Ответ №1:

У меня была такая же проблема. Я попытался сделать именно то, что предлагает исключение при обучении модели на python. Изменена инициализация ячейки с:

 memory_layer = tf.keras.layers.GRUCell(units=memory_size, name='memory')
 

Для

 memory_layer = tf.keras.layers.GRUCell(units=memory_size, reset_after=False, name='memory')
 

После повторного обучения модели с изменением и экспорта в tfjs я смог ее загрузить. Этот флаг изменяет внутреннюю архитектуру ячейки, но в моем случае это не повлияло на производительность модели.