Я пытаюсь обучить модель классификации распределенным способом.Я использую библиотеку TensorflowOnSpark, разработанную Yahoo.Пример, который я использую ссылка github
Я использую набор данных, отличный от mnist, который используется в примере, упомянутом в ссылке github.Этот набор данных, который я использую, имеет следующие размеры после предварительной обработки (260000,28047), а также классы (метки) варьируются от 0:13.
>>> import os
>>> import tensorflow as tf
>>> from tensorflow.python import keras
>>> from tensorflow.python.keras import backend as K
>>> from tensorflow.python.keras.models import Sequential, load_model, save_model
>>> from tensorflow.python.keras.layers import Dense, Dropout
>>> from tensorflow.python.keras.callbacks import LambdaCallback, TensorBoard
>>> from tensorflow.python.saved_model import builder as saved_model_builder
>>> from tensorflow.python.saved_model import tag_constants
>>> from tensorflow.python.saved_model.signature_def_utils_impl import predict_signature_def
>>> from tensorflowonspark import TFNode
>>> from pyspark.context import SparkContext
>>> from pyspark.conf import SparkConf
>>> from tensorflowonspark import TFCluster
>>> import numpy
>>>
>>>
...
>>>
>>> data = sc.textFile('ReducedFeatures.tsv')
>>>
>>> data = data.map(lambda l: l.encode("UTF8", "ignore").split('\t'))
>>>
>>> labels = data.map(lambda x: x[1])
>>> data = data.map(lambda x: x[19:28066])
>>>
>>> header = data.first()
>>> data = data.filter(lambda line: line != header)
>>> label_header = labels.first()
>>> labels = labels.filter(lambda line: line != label_header)
>>>
>>> #convert values to float
... convertToFloat = lambda data: [float(str(x)) for x in data]
>>> dataset = data.map(convertToFloat)
>>> labels = labels.map(lambda x:float(x))
>>>
>>>
>>> labels = labels.map(lambda x: keras.utils.to_categorical(x, num_classes=14))
>>>
>>>
>>> # zip the data as tuple
... dataRDD = dataset.zip(labels)
>>>
>>> sampledata = dataRDD.take(20)
>>>
>>> model = Sequential()
>>> model.add(Dense(512, activation='relu', input_shape=(28047,)))
>>> model.add(Dropout(0.2))
>>> model.add(Dense(512, activation='relu'))
>>> model.add(Dropout(0.2))
>>> model.add(Dense(14, activation='softmax'))
>>>
>>> model.summary()
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 512) 14360576
_________________________________________________________________
dropout (Dropout) (None, 512) 0
_________________________________________________________________
dense_1 (Dense) (None, 512) 262656
_________________________________________________________________
dropout_1 (Dropout) (None, 512) 0
_________________________________________________________________
dense_2 (Dense) (None, 14) 7182
=================================================================
Total params: 14,630,414
Trainable params: 14,630,414
Non-trainable params: 0
_________________________________________________________________
>>>
>>> model.compile(loss='sparse_categorical_crossentropy',
... optimizer=tf.train.RMSPropOptimizer(learning_rate=0.001),
... metrics=['accuracy'])
>>>
>>> print("model.inputs: {}".format(model.inputs))
model.inputs: [<tf.Tensor 'dense_input:0' shape=(?, 28047) dtype=float32>]
>>> print("model.outputs: {}".format(model.outputs))
model.outputs: [<tf.Tensor 'dense_2/Softmax:0' shape=(?, 14) dtype=float32>]
>>>
>>> def generate_rdd_data(dataRDD):
... while True:
... feature_vector = []
... lbls = []
... for item in dataRDD:
... #record = item[0]
... feature_vector.append(item[0])
... lbls.append(item[1])
... features = numpy.array(feature_vector).astype('float32')
... labels = numpy.stack(lbls).astype('float32')
... return (features, labels)
...
>>>
>>> feat, lbls = generate_rdd_data(sampledata)
>>> lbls
array([[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
[1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
[1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 0., 0., 0.],
[1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]],
dtype=float32)
>>>
>>>
>>> x_train = tf.placeholder(tf.float32, [None, 28047], name="x_train")
>>> y_train = tf.placeholder(tf.float32, [None, 14], name="y_train")
>>>
...
>>> model.fit_generator(generator=generate_rdd_data(sampledata),steps_per_epoch=200,epochs=5,verbose=1,validation_data=(x_train, y_train))
Также, пожалуйста, посмотрите на трассировку ниже, я сделал OneHotEncoding для меток, а также при добавлении выходных слоев это 14, как вы можете видеть в коде иКраткое изложение модели.
Но когда я начинаю тренироваться, используя метод вывода генератора.Я получаю следующие ошибки измерения для классов.Пожалуйста, помогите