работа с разреженными данными в TensorFlow 2.2.0 - PullRequest
0 голосов
/ 12 июля 2020

Я пытаюсь создать приложение для распознавания лиц с помощью insightface, я написал этот код на Tensorflow 2.1.0 и Keras 2.3.1, и он работал хорошо, но из-за некоторых проблем мне пришлось перейти на TensorFlow 2.2.0 и Keras 2.4.3, я так понимаю, что моя проблема в моем embeddings. они немногочисленные, но содержательные. Как я могу избежать изменения значимости моих вложений и данных о запчастях? Из-за ошибки я понимаю (Consider casting elements to a supported type.), что TensorFlow не может преобразовать мой np.array в тензор, потому что он разрежен.

то, что я пробовал

эти это не команды, но я написал их, чтобы вы имели представление о том, что я пробовал. np.array(data["embeddings"]).todense(), csr_matrix(data["embeddings"]), tf.convert_to_tensor(data["embeddings"]), а также пытался следовать за этим , но не смог добраться до model.fit_generator работы.

>>> print(type(embeddings))
<class 'numpy.ndarray'>
>>> print(embeddings.shape)
(49, 512)
>>> print(embeddings)
[[ 0.02751185  0.0143353   0.0324492  ... -0.00347222  0.0154978
  -0.01304669]
 [ 0.09154768 -0.04196533  0.01197386 ... -0.08363352  0.03335601
   0.01748604]
 [ 0.00182035 -0.00307933  0.00386595 ... -0.04442558  0.04434329
   0.06080627]
 ...
 [-0.01564891 -0.01510727  0.0345119  ... -0.01690779 -0.00816008
   0.08056415]
 [-0.00543963 -0.03811216 -0.01148985 ... -0.05366111  0.07108331
  -0.00186215]
 [ 0.00627459 -0.04221528  0.00426272 ...  0.02838095  0.02116473
   0.00491964]]

Это мой код:

class SoftMax():
    def __init__(self, input_shape, num_classes):
        self.input_shape = input_shape
        self.num_classes = num_classes

    def build(self):
        #create model
        model = Sequential()

        #add model layers
        model.add(Dense(1024, activation='relu', input_shape=self.input_shape))
        model.add(Dropout(0.5))
        model.add(Dense(1024, activation='relu'))
        model.add(Dropout(0.5))
        model.add(Dense(self.num_classes, activation='softmax'))
        
        # loss and optimizer
        optimizer=Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
        model.compile(loss=categorical_crossentropy,
                      optimizer=optimizer,
                      metrics=['accuracy'])
        return model


def make_model(args, classifier=SoftMax):

    # Load the face embeddings
    data = pickle.loads(open(args.embeddings, "rb").read())

    num_classes = len(np.unique(data["names"])) 
    ct = ColumnTransformer([('myٔName', OneHotEncoder(), [0])])
    labels = np.array(data["names"]).reshape(-1, 1)
    labels = ct.fit_transform(labels)

    embeddings = np.array(data["embeddings"])

    # Initialize Softmax training model arguments
    BATCH_SIZE = 32
    EPOCHS = 32
    input_shape = embeddings.shape[1]

    # Build classifier
    init_classifier = classifier(input_shape=(input_shape,), num_classes=num_classes)
    model = init_classifier.build()

    # Create KFold
    cv = KFold(n_splits = 5, random_state = None, shuffle=True)
    history = {'acc': [], 'val_acc': [], 'loss': [], 'val_loss': []}
    # Train
    for train_idx, valid_idx in cv.split(embeddings):
        X_train, X_val, y_train, y_val = embeddings[train_idx], embeddings[valid_idx], labels[train_idx], labels[valid_idx]
        his = model.fit(X_train, y_train, batch_size=BATCH_SIZE, epochs=EPOCHS, verbose=1, validation_data=(X_val, y_val))


    # write the face recognition model to output
    model.save(args.mymodel)
    f = open(args.le, "wb")
    f.write(pickle.dumps(LabelEncoder()))
    f.close()

Ошибка

    TypeError: Failed to convert object of type <class 'tensorflow.python.framework.sparse_tensor.SparseTensor'> to Tensor. Contents: SparseTensor(indices=Tensor("DeserializeSparse:0", shape=(None, 2), dtype=int64), values=Tensor("DeserializeSparse:1", shape=(None,), dtype=float32), dense_shape=Tensor("stack:0", shape=(2,), dtype=int64)). Consider casting elements to a supported type.
...