Я создаю традиционную нейронную сеть для моделирования поведения 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.
Сообщение об ошибке, которое вы получаете, немного вводит в заблуждение: prune_low_magnitude
действительно может оптимизировать Sequential
модели. Эта ошибка, скорее всего, возникает из-за несовместимости версий между tensorflow и tfmot. Кроме того, установка keras сама по себе может решить вашу проблему (см. здесь).
Кроме того, выглядит немного запутанным то, что вы используете потери SparseCategoricalCrossentropy
в сокращенной модели. Обычно это используется для многоклассовой классификации, а не для регрессии.
Прежде чем приступить к «настоящей» обрезке, возможно, стоит попробовать уменьшить количество Dense
слоев с 5 до 4 или уменьшить количество фильтров в каждом слое.