Количество ненулевых элементов numpy - PullRequest
0 голосов
/ 11 января 2020

Я пытаюсь реализовать гипотезу «Лотерейный билет», и для этого я обучил нейронную сеть, использующую следующую архитектуру, используя TensorFlow 2.0:

def create_nn():
    """
    Function to create NN model for MNIST
    classification using 300 100 architecture
    """
    model = Sequential()
    model.add(l.InputLayer(input_shape = (784, )))
    model.add(Flatten())
    model.add(Dense(units = 300, activation='relu', kernel_initializer = tf.initializers.GlorotUniform()))
    # model.add(l.Dropout(0.2))
    model.add(Dense(units = 100, activation='relu', kernel_initializer = tf.initializers.GlorotUniform()))
    # model.add(l.Dropout(0.1))
    model.add(Dense(units = num_classes, activation='softmax'))

    # Compile designed NN-
    model.compile(
        loss = tf.keras.losses.categorical_crossentropy,
        # optimizer = 'adam',
        optimizer = tf.keras.optimizers.Adam(lr = 0.001),
        metrics = ['accuracy'])

    return model

# Insantiate a new NN model instance-
orig_model = create_nn()

# Load original weights from when designed model was initialized-
orig_model.load_weights("Lottery_Ticket_Hypothesis_300_100_MNIST.h5")

type(orig_model.trainable_weights), len(orig_model.trainable_weights)
# (list, 6)


# Insantiate a new NN model instance-
pruned_model = create_nn()

# Load pruned weights AFTER pruning algorithm was applied to prune NN-
pruned_model.load_weights("Lottery_Ticket_Hypothesis_300_100_Pruned_Model.h5")

Здесь я создаю 2 экземпляра orig_model с исходными весами NN и 'pruned_model' с обрезанными весами ПОСЛЕ выполнения обрезки.

Затем сравниваются два веса из двух моделей, и для весов, отличных от нуля в 'pruned_model', используются исходные веса из 'orig_model'.

Чтобы выполнить sh, я закодировал-

# List to store extracted weights-
weight_extracted = []

for orig_wts, pruned_wts in zip(orig_model.trainable_weights, pruned_model.trainable_weights):
    c = np.where(pruned_wts == 0, pruned_wts, orig_wts)
    weight_extracted.append(c)
    del c


len(weight_extracted)
# 6

Теперь, если я попытаюсь подсчитать число, отличное от нуля параметры, использующие список weight_extracted, как показано ниже: *

pruned_sum_params = 0

for layer in weight_extracted:
    print(tf.math.count_nonzero(layer, axis = None).numpy())
    pruned_sum_params += tf.math.count_nonzero(layer, axis = None).numpy()

. Выдает error- ValueError: Не удалось преобразовать массив NumPy в Tensor (неподдерживаемый тип объекта ResourceVariable).

И если я изменю код на -

for layer in weight_extracted:
    print(np.count_nonzero(layer, axis = None))
    pruned_sum_params += np.count_nonzero(layer, axis = None)

Это выдаст мне ошибку:

ValueError: Истинное значение массива с более чем одним элементом - ambigu ОЕ. Используйте a.any () или a.all ()

Что не так?

Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...