【问题标题】:ValueError: Unknown initializer: GlorotUniform with TensorflowValueError:未知初始化程序:带有 Tensorflow 的 GlorotUniform
【发布时间】:2020-02-09 07:10:06
【问题描述】:

大家好,我一直在尝试调试这个问题 HOURS...我正在尝试使用 Tensorflow 的 API 构建模型来构建模型。我最终想在 Apache Spark(Pysparl) 上训练模型。我正在为 DDL 使用一个名为“Elephas”的库。

请帮帮我。

ma​​in.py

from train_elephas import TrainLSTMElephasModel
import pandas as pd
    def main():
    ''' 

    Run this program with 'spark-sumbit


    Example:
    spark-submit --driver-memory 1G stats_app_elephas.py

    '''
    csv = "../csv_test_files/stats.csv"
    timesteps = 30
    batch_size = 32
    epochs = 5

    print("No. of Progams Run Model \n")
    model_no_programs_run = TrainLSTMElephasModel(csv_path=csv, column_number=1, batch_size=batch_size, epochs=epochs, timesteps=timesteps)
main()

train_elephas.py

from pyspark import SparkContext, SparkConf
from pyspark.ml import Estimator

import numpy as np
import pandas as pd
from sklearn.preprocessing import MinMaxScaler

from typing import List

from elephas.spark_model import SparkModel
from elephas.utils.rdd_utils import to_simple_rdd

from tensorflow.keras.models import load_model
from tensorflow.keras import layers
from tensorflow import keras
import tensorflow as tf

class TrainLSTMElephasModel:
    '''
    This class is used for training a LSTM model by passing in either a CSV file or a JSON file.
    Only include EITHER a JSON file or a CSV file when you desire to train a LSTM Model.

    For CSV data:
        - If you know the column number that you widh to train you nodel on, specifiy it in the 'column_number'
        field, and don't include a 'column_name'
        - 'column_name_to_traverse' shouldn't be specified in a CSV file if the column desired is located in another table.
          It would be better to just pass in the table itself than to traverse through the tables.

    For JSON data:
        - When passing in JSON data, and you desire to predict the future value of a field that has a lexical depth > 1,
          you must specify the 'column_names_to_traverse' as a List of all the columns to get to the 'column_name' desired.
        - If the column name desired is has a lexical depth > 1, fill in the 'column_name' as the first column needed to traverse
          This needs to be done for columns that contain JSON data in their rows

          EXAMPLE: 
            - We want to grab the column 'procure_calls' which has a JSON depth > 1

            column_name = 'program_calls'
            column_names_to_traverse = ['program_names','prcoedure_calls']
    '''

    # Type aliases
    Vector = List[int]

    def __init__(self, csv_path : str = None, json_path: str = None,\
                 column_name: str = None, column_names_to_traverse: Vector = [], \
                 column_number : int = None, timesteps : int = 30, \
                 batch_size : int = 32, epochs : int = 5):
        self.csv_path = csv_path
        self.json_path = json_path
        self.column_name = column_name
        self.column_name_to_traverse = column_names_to_traverse
        self.column_number = column_number
        self.timesteps = timesteps
        self.batch_size = batch_size
        self.epochs = epochs
        self.train_LSTM_model()


    def train_LSTM_model(self) -> SparkModel:
        '''This method will return a trained LSTM model based on the CSV file path or JSON file path in for training'''



        train_data = None
        # Spark Session
        sc = SparkContext.getOrCreate(SparkConf().setMaster("local[*]"))

        # Checks if a CSV file or a JSON file is provided
        if self.csv_path is not None:
            train_data = self.handleCSVFile()
        elif self.json_path is not None:
            train_data = self.handleJSONFile()

        # Reshaping to a 2D array
        train_data = train_data.reshape(-1,1)
        print(train_data.dtype)
        print(type(train_data))
        print(train_data.shape) 

        # Feature Scaling
        scaler = MinMaxScaler(feature_range=(0, 1))
        scaled_train_data =scaler.fit_transform(train_data)

        # Initialzing each x_train and y_train datasets for each column
        X_train = []
        y_train = []

        # Appending scaled training data to each dataset
        for i in range(self.timesteps, len(train_data)):
            X_train.append(scaled_train_data[i - self.timesteps:i, 0])
            y_train.append(scaled_train_data[i, 0])

        # Numpy array creation, Keras requires numpy arrays for Inputs
        X_train, y_train = np.array(X_train, dtype=int), np.array(y_train)
        print(X_train.shape)
        print(X_train.dtype)

        # Reshaping to a 3D matrix (970, 30, 1)
        #X_train = np.reshape(X_train, (X_train[0], X_train[1], 1))
        print(X_train.shape)

        # Reshapes to input neuron
        inputs= layers.Input(shape = (X_train.shape[1], 1))
        #Training Layers
        x_1 = layers.LSTM(units=50, return_sequences=True)(inputs)
        x_1 = layers.Dropout(0.2)(x_1)
        x_1 = layers.LSTM(units = 50, return_sequences = True)(x_1)
        x_1 = layers.Dropout(0.2)(x_1)
        x_1 = layers.LSTM(units = 50, return_sequences = True)(x_1)
        x_1 = layers.Dropout(0.2)(x_1)
        x_1 = layers.LSTM(units = 50, return_sequences = True)(x_1)
        x_1 = layers.Dropout(0.2)(x_1)
        x_1 = layers.Flatten()(x_1)

        # 1 output neuron for each column prediction
        output = layers.Dense(units=1, activation = 'relu')(x_1)

        model = keras.Model(inputs=inputs, outputs=output, name = 'elephas_Model')
        print(model.summary())
        model.compile(optimizer = keras.optimizers.Adam(), loss = 'mean_squared_error', metrics=['accuracy'])
        model.save('../csv_test_files/tf_elephas_model.h5')
        del model
        # Reshapes to input neuron
        #input_train_model = Input(shape =  (X_train.shape[1], 1), name='input_train_model')

        #Training Layers
       # x_1 = LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], 1))(input_train_model)
       # x_1 = Dropout(0.2)(x_1)
       # x_1 = LSTM(units = 50, return_sequences = True)(x_1)
       # x_1 = Dropout(0.2)(x_1)
       # x_1 = LSTM(units = 50, return_sequences = True)(x_1)
       # x_1 = Dropout(0.2)(x_1)
        #x_1 = LSTM(units = 50, return_sequences = True)(x_1)
       # x_1 = Dropout(0.2)(x_1)
       # x_1 = Flatten()(x_1)

        # 1 ouptut neuron for each column prediction
       # output_train_data = Dense(units=1, name= 'ouput_train_data')(x_1)
       # model = Model(inputs=input_train_model, outputs=output_train_data)
        #model.compile(optimizer = 'adam', loss = 'mean_squared_error', metrics=['accuracy'])
        model = load_model('../csv_test_files/tf_elephas_model.h5')

        # Create and RDD from numpy arrays
        rdd = to_simple_rdd(sc, X_train, y_train)

        #rdd = sc.parallelize(X_train)
        # Fitting the keras model to a Spark Model
        spark_model = SparkModel(model, frequency='epoch', mode='asynchronous')
        spark_model.fit(rdd, self.epochs, self.batch_size, verbose=1, validation_split=0.25)
        #spark_model.save('../saved_lstm_models/elephas_stats_app')


        return spark_model


    def handleCSVFile(self) -> np.ndarray:
        with open(self.csv_path) as csv:

            dataframe = pd.read_csv(csv)

        if self.column_number is not None:
            return dataframe.iloc[:,self.column_number].values  
        return dataframe[self.column_name].values


    def handleJSONFile(self) -> np.ndarray:
        import json
        from pandas.io.json import json_normalize

        with open(self.json_path) as json:
            json_data = json.load(json)

        if not self.column_name_to_traverse:
            dataframe = json_normalize(data=json_data['program_calls'], 
                                 record_path=[name for name in self.column_name_to_traverse if name is not self.column_name_to_traverse[-1]]) 

            return dataframe[self.column_name_to_traverse[-1]].values
        else:
            dataframe = json_normalize(json_data)
            return dataframe[self.column_name].values

Jupyter Notebooks 中的错误:

    Using TensorFlow backend.
WARNING
No. of Progams Run Model 

int64
<class 'numpy.ndarray'>
(1000, 1)
(970, 30)
int64
(970, 30)
WARNING:tensorflow:From /Users/vnovelo/anaconda3/lib/python3.7/site-packages/tensorflow/python/ops/init_ops.py:1251: calling VarianceScaling.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
Instructions for updating:
Call initializer instance with the dtype argument instead of passing it to the constructor
Model: "elephas_Model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None, 30, 1)]           0         
_________________________________________________________________
lstm (LSTM)                  (None, 30, 50)            10400     
_________________________________________________________________
dropout (Dropout)            (None, 30, 50)            0         
_________________________________________________________________
lstm_1 (LSTM)                (None, 30, 50)            20200     
_________________________________________________________________
dropout_1 (Dropout)          (None, 30, 50)            0         
_________________________________________________________________
lstm_2 (LSTM)                (None, 30, 50)            20200     
_________________________________________________________________
dropout_2 (Dropout)          (None, 30, 50)            0         
_________________________________________________________________
lstm_3 (LSTM)                (None, 30, 50)            20200     
_________________________________________________________________
dropout_3 (Dropout)          (None, 30, 50)            0         
_________________________________________________________________
flatten (Flatten)            (None, 1500)              0         
_________________________________________________________________
dense (Dense)                (None, 1)                 1501      
=================================================================
Total params: 72,501
Trainable params: 72,501
Non-trainable params: 0
_________________________________________________________________
None
WARNING:tensorflow:From /Users/vnovelo/anaconda3/lib/python3.7/site-packages/tensorflow/python/ops/init_ops.py:97: calling GlorotUniform.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
Instructions for updating:
Call initializer instance with the dtype argument instead of passing it to the constructor
WARNING:tensorflow:From /Users/vnovelo/anaconda3/lib/python3.7/site-packages/tensorflow/python/ops/init_ops.py:97: calling Orthogonal.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
Instructions for updating:
Call initializer instance with the dtype argument instead of passing it to the constructor
WARNING:tensorflow:From /Users/vnovelo/anaconda3/lib/python3.7/site-packages/tensorflow/python/ops/init_ops.py:97: calling Zeros.__init__ (from tensorflow.python.ops.init_ops) with dtype is deprecated and will be removed in a future version.
Instructions for updating:
Call initializer instance with the dtype argument instead of passing it to the constructor
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-1-b09f3920ffe0> in <module>
     21     print("No. of Progams Run Model \n")
     22     model_no_programs_run = TrainLSTMElephasModel(csv_path=csv, column_number=1, batch_size=batch_size, epochs=epochs, timesteps=timesteps)
---> 23 main()

<ipython-input-1-b09f3920ffe0> in main()
     20 
     21     print("No. of Progams Run Model \n")
---> 22     model_no_programs_run = TrainLSTMElephasModel(csv_path=csv, column_number=1, batch_size=batch_size, epochs=epochs, timesteps=timesteps)
     23 main()

~/Documents/forecast_events/Forecast-Predictive-Analytics-API/docs/lstm_model/train_lstm_model/train_elephas.py in __init__(self, csv_path, json_path, column_name, column_names_to_traverse, column_number, timesteps, batch_size, epochs)
     56         self.batch_size = batch_size
     57         self.epochs = epochs
---> 58         self.train_LSTM_model()
     59 
     60 

~/Documents/forecast_events/Forecast-Predictive-Analytics-API/docs/lstm_model/train_lstm_model/train_elephas.py in train_LSTM_model(self)
    148         #rdd = sc.parallelize(X_train)
    149         # Fitting the keras model to a Spark Model
--> 150         spark_model = SparkModel(model, frequency='epoch', mode='asynchronous')
    151         spark_model.fit(rdd, self.epochs, self.batch_size, verbose=1, validation_split=0.25)
    152         #spark_model.save('../saved_lstm_models/elephas_stats_app')

~/anaconda3/lib/python3.7/site-packages/elephas/spark_model.py in __init__(self, model, mode, frequency, parameter_server_mode, num_workers, custom_objects, batch_size, port, *args, **kwargs)
     67             if self.parameter_server_mode == 'http':
     68                 self.parameter_server = HttpServer(
---> 69                     self.serialized_model, self.mode, self.port)
     70                 self.client = HttpClient(self.port)
     71             elif self.parameter_server_mode == 'socket':

~/anaconda3/lib/python3.7/site-packages/elephas/parameter/server.py in __init__(self, model, mode, port, debug, threaded, use_reloader)
     61         """
     62 
---> 63         self.master_network = dict_to_model(model)
     64         self.mode = mode
     65         self.master_url = None

~/anaconda3/lib/python3.7/site-packages/elephas/utils/serialization.py in dict_to_model(dict)
     18     :return: Keras model instantiated from dictionary
     19     """
---> 20     model = model_from_json(dict['model'])
     21     model.set_weights(dict['weights'])
     22     return model

~/anaconda3/lib/python3.7/site-packages/keras/engine/saving.py in model_from_json(json_string, custom_objects)
    659     config = json.loads(json_string)
    660     from ..layers import deserialize
--> 661     return deserialize(config, custom_objects=custom_objects)
    662 
    663 

~/anaconda3/lib/python3.7/site-packages/keras/layers/__init__.py in deserialize(config, custom_objects)
    166                                     module_objects=globs,
    167                                     custom_objects=custom_objects,
--> 168                                     printable_module_name='layer')

~/anaconda3/lib/python3.7/site-packages/keras/utils/generic_utils.py in deserialize_keras_object(identifier, module_objects, custom_objects, printable_module_name)
    145                     config['config'],
    146                     custom_objects=dict(list(_GLOBAL_CUSTOM_OBJECTS.items()) +
--> 147                                         list(custom_objects.items())))
    148             with CustomObjectScope(custom_objects):
    149                 return cls.from_config(config['config'])

~/anaconda3/lib/python3.7/site-packages/keras/engine/network.py in from_config(cls, config, custom_objects)
   1054         # First, we create all layers and enqueue nodes to be processed
   1055         for layer_data in config['layers']:
-> 1056             process_layer(layer_data)
   1057 
   1058         # Then we process nodes in order of layer depth.

~/anaconda3/lib/python3.7/site-packages/keras/engine/network.py in process_layer(layer_data)
   1040 
   1041             layer = deserialize_layer(layer_data,
-> 1042                                       custom_objects=custom_objects)
   1043             created_layers[layer_name] = layer
   1044 

~/anaconda3/lib/python3.7/site-packages/keras/layers/__init__.py in deserialize(config, custom_objects)
    166                                     module_objects=globs,
    167                                     custom_objects=custom_objects,
--> 168                                     printable_module_name='layer')

~/anaconda3/lib/python3.7/site-packages/keras/utils/generic_utils.py in deserialize_keras_object(identifier, module_objects, custom_objects, printable_module_name)
    147                                         list(custom_objects.items())))
    148             with CustomObjectScope(custom_objects):
--> 149                 return cls.from_config(config['config'])
    150         else:
    151             # Then `cls` may be a function returning a class.

~/anaconda3/lib/python3.7/site-packages/keras/layers/recurrent.py in from_config(cls, config)
   2344         if 'implementation' in config and config['implementation'] == 0:
   2345             config['implementation'] = 1
-> 2346         return cls(**config)
   2347 
   2348 

~/anaconda3/lib/python3.7/site-packages/keras/legacy/interfaces.py in wrapper(*args, **kwargs)
     89                 warnings.warn('Update your `' + object_name + '` call to the ' +
     90                               'Keras 2 API: ' + signature, stacklevel=2)
---> 91             return func(*args, **kwargs)
     92         wrapper._original_function = func
     93         return wrapper

~/anaconda3/lib/python3.7/site-packages/keras/layers/recurrent.py in __init__(self, units, activation, recurrent_activation, use_bias, kernel_initializer, recurrent_initializer, bias_initializer, unit_forget_bias, kernel_regularizer, recurrent_regularizer, bias_regularizer, activity_regularizer, kernel_constraint, recurrent_constraint, bias_constraint, dropout, recurrent_dropout, implementation, return_sequences, return_state, go_backwards, stateful, unroll, **kwargs)
   2224                         dropout=dropout,
   2225                         recurrent_dropout=recurrent_dropout,
-> 2226                         implementation=implementation)
   2227         super(LSTM, self).__init__(cell,
   2228                                    return_sequences=return_sequences,

~/anaconda3/lib/python3.7/site-packages/keras/layers/recurrent.py in __init__(self, units, activation, recurrent_activation, use_bias, kernel_initializer, recurrent_initializer, bias_initializer, unit_forget_bias, kernel_regularizer, recurrent_regularizer, bias_regularizer, kernel_constraint, recurrent_constraint, bias_constraint, dropout, recurrent_dropout, implementation, **kwargs)
   1876         self.use_bias = use_bias
   1877 
-> 1878         self.kernel_initializer = initializers.get(kernel_initializer)
   1879         self.recurrent_initializer = initializers.get(recurrent_initializer)
   1880         self.bias_initializer = initializers.get(bias_initializer)

~/anaconda3/lib/python3.7/site-packages/keras/initializers.py in get(identifier)
    513 def get(identifier):
    514     if isinstance(identifier, dict):
--> 515         return deserialize(identifier)
    516     elif isinstance(identifier, six.string_types):
    517         config = {'class_name': str(identifier), 'config': {}}

~/anaconda3/lib/python3.7/site-packages/keras/initializers.py in deserialize(config, custom_objects)
    508                                     module_objects=globals(),
    509                                     custom_objects=custom_objects,
--> 510                                     printable_module_name='initializer')
    511 
    512 

~/anaconda3/lib/python3.7/site-packages/keras/utils/generic_utils.py in deserialize_keras_object(identifier, module_objects, custom_objects, printable_module_name)
    138             if cls is None:
    139                 raise ValueError('Unknown ' + printable_module_name +
--> 140                                  ': ' + class_name)
    141         if hasattr(cls, 'from_config'):
    142             custom_objects = custom_objects or {}

ValueError: Unknown initializer: GlorotUniform

【问题讨论】:

  • This question 可能是相关的
  • @OverLordGoldDragon 我已经尝试过了,但后来我得到了其他一组错误。我只想坚持一个,无论是 tensorflow.keras 还是 keras,在这种情况下,我想让它与 tensorflow.keras 一起工作
  • 您是否尝试了kerastf.keras 列出的所有解决方案?例如,this one 看起来对两者都有希望。如果是这样,请分享您计划使用的(kerastf.keras),以及您对这些解决方案的错误 - 因为兼容性错误不容易诊断,尤其是模型中涉及的非 TF 包(例如pyspark)
  • 您正在使用 tf.keras 训练模型,然后使用 keras 加载,这是个坏主意,存在许多兼容性问题,您应该只使用其中一个框架。不要混合使用 tf.keras 和 keras
  • @MatiasValdenegro 这是有道理的。我让它工作,但现在有问题将 Keras 模型传递到 elephas 库中的“SparkModel()”函数。将不得不研究如何在两者之间进行转换。

标签: python apache-spark tensorflow keras jupyter-notebook


【解决方案1】:

您正在尝试使用glorot_uniform.h5文件写入器和读取器使用的库版本不一样,不兼容。

你执行了

from tensorflow import keras

@lintex 提供 advice 来代替:

import keras

显式使用from keras.initializers import glorot_uniform 作为亚历克斯开始suggests 将是获得类似结果的影响较小的方式。

【讨论】:

    【解决方案2】:

    在我的情况下,我有带有 json 权重的 h5,并且加载的模型给了我错误。对我有用的解决方案是编辑 json 文件并使用 GlorotUniform 类数组删除 kernel_initializer

    【讨论】:

      猜你喜欢
      • 2020-07-24
      • 2020-12-15
      • 2021-04-28
      • 2019-04-10
      • 2022-10-07
      • 2018-05-18
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多