Как я могу сократить эту нейронную сеть, которую я создал на Python, с помощью TensorFlow?

Я создаю традиционную нейронную сеть для моделирования поведения PA на Python, используя TensorFlow. Модель принимает входные значения I и Q и прогнозирует выходной сигнал усилителя. Итак, это файл .csv с двумя столбцами. Одна из моих целей — сократить (или каким-либо образом оптимизировать) построенную мной модель. Оригинальная модель работает отлично. Однако я сталкиваюсь с проблемами при сокращении созданной, обученной и протестированной модели.

Ниже представлена ​​оригинальная модель:

import os

os.environ['TF_ENABLE_ONEDNN_OPTS'] = '0'

import keras
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.models import Model, load_model, save_model, clone_model, Sequential
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras.metrics import Accuracy
import tensorflow_model_optimization as tfmot
import time

# Load your data
data_input = pd.read_csv('Input_TimeAligned.csv',header = None)
data_input.columns = ['i','q']
data_input.describe()
data_input.head()

data_input_arr = data_input.to_numpy()
print('Input data as an array:',data_input_arr)
print(len(data_input_arr))
print()

data_output = pd.read_csv('Output_TimeAligned.csv',header = None)
data_output.columns = ['i','q']
data_output.describe()
data_output.head()

data_output_arr = data_output.to_numpy()
print('Output data as an array:',data_output_arr)
print(len(data_output_arr))
print()

data_input_tr = data_input_arr[0:122879,:]
data_output_tr = data_output_arr[0:122879,:]

data_input_test = data_input_arr[122880:491519,:]
data_output_test = data_output_arr[122880:491519,:]

X_train = data_input_tr
y_train = data_output_tr

X_test = data_input_test
y_test = data_output_test

# Define the model architecture.
start = time.time()
model = keras.Sequential([
  keras.layers.InputLayer(input_shape = (2,)),
  keras.layers.Dense(units = 128, activation = 'tanh', name = 'layer_1'),
  keras.layers.Dense(units = 256, activation = 'tanh', name = 'layer_2'),
  keras.layers.Dense(units = 512, activation = 'tanh', name = 'layer_3'),
  keras.layers.Dense(units = 256, activation = 'tanh', name = 'layer_4'),
  keras.layers.Dense(units = 128, activation = 'tanh', name = 'layer_5'),
  keras.layers.Dense(units = 2, activation = 'tanh', name = 'output_layer'),
])

model.compile(loss = 'mean_squared_error', optimizer = 'adam', metrics = ['Accuracy'])
end = time.time()
print('Time taken to compile the model is:', end - start)
print()

print(model.summary())
print()

start = time.time()
model.fit(X_train, y_train, epochs = 3, batch_size = 32)    
end = time.time()
print('Time taken to train the model is:', end - start)
print()

start = time.time()
y_hat = model.predict(X_test)
end = time.time()
print('Time taken to test the model is:', end - start)
print('The predicted output is:', y_hat)
print()

start = time.time()
model.evaluate(X_test, y_test)
end = time.time()
print('Time taken to evaluate the model is:', end - start)
print()

Я попробовал обрезку, как показано ниже:

prune_low_magnitude = tfmot.sparsity.keras.prune_low_magnitude

# Define model for pruning.
pruning_params = {
      'pruning_schedule': tfmot.sparsity.keras.PolynomialDecay(initial_sparsity=0.0,
                                                               final_sparsity=0.50,
                                                               begin_step=0,
                                                               end_step=1000)
}

model_for_pruning = prune_low_magnitude(model, **pruning_params)

# `prune_low_magnitude` requires a recompile.
model_for_pruning.compile(optimizer='adam',
              loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])

model_for_pruning.summary()

start = time.time()
model.compile(
    loss = "mse",
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.001)
)
end = time.time()
print('Time taken to compile the pruned model is:', end - start)
print()

print(model.summary())
print()

start = time.time()
model.fit(
    X_train, 
    y_train, 
    epochs=3, 
    batch_size=32, 
    # callbacks= pruning_callback, 
    # verbose=1
)
end = time.time()
print('Time taken to train the pruned model is:', end - start)

start = time.time()
y_hat = model.predict(X_test)
end = time.time()
print('Time taken to test the pruned model is:', end - start)
print('The predicted output is:', y_hat)
print()

start = time.time()
model.evaluate(X_test, y_test)
end = time.time()
print('Time taken to evaluate the pruned model is:', end - start)
print()

Это ошибка, которую я получаю:

ValueError: `prune_low_magnitude` can only prune an object of the following types: keras.models.Sequential, keras functional model, keras.layers.Layer, list of keras.layers.Layer. You passed an object of type: Sequential.

Что я здесь делаю не так? Я не настолько силен в программировании. Буду признателен за любую помощь!

Кроме того, лучше ли мне создавать свою модель в PyTorch? Есть ли там инструменты оптимизации лучше? Еще раз спасибо.

🤔 А знаете ли вы, что...
Python используется в научных вычислениях и обработке изображений с использованием библиотеки OpenCV.


1
50
1

Ответ:

Решено

Сообщение об ошибке, которое вы получаете, немного вводит в заблуждение: prune_low_magnitude действительно может оптимизировать Sequential модели. Эта ошибка, скорее всего, возникает из-за несовместимости версий между tensorflow и tfmot. Кроме того, установка keras сама по себе может решить вашу проблему (см. здесь).

Кроме того, выглядит немного запутанным то, что вы используете потери SparseCategoricalCrossentropy в сокращенной модели. Обычно это используется для многоклассовой классификации, а не для регрессии.

Прежде чем приступить к «настоящей» обрезке, возможно, стоит попробовать уменьшить количество Dense слоев с 5 до 4 или уменьшить количество фильтров в каждом слое.