Разработать библиотеку на python3

2 500 руб.за час
02 июня 2022, 18:35 • 9 откликов • 317 просмотров
Необходимо написать модуль на основе или по подобию библиотеки capturemock, который позволяет
записывать фикстуры и затем воспроизводить из фикстур вызовы Model.fit из библиотеки keras.
при этом нужно также записывать/воспроизводить обратные вызовы callbacks.
Пример использования модуля - capturemock_test.py (см ниже)

  • Результатом успешного выполнения задания будет работающий код теста в 2-х режимах по аналогии с capturemock, В режиме mode=RECORD происходит формирование файлов с фикстурами с учетом последовательности вызовов функций и callbacks. В режиме mode=REPLAY тест может работать без установленной библиотеки keras:
@capturemock("keras.models.Sequential.fit", mode=REPLAY)
def test_training():
....
@capturemock("keras.models.Sequential.fit", mode=RECORD)
def test_training():
...
  • Полезные ссылки
capture-replay mock
https://github.com/texttest/capturemock/tree/master/capturemock
Intercepting Python modules, attributes and functions
http://texttest.sourceforge.net/index.php?page=capturemock&n=python_basic



capturemock_test.py
import pytest
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.datasets import mnist
from tensorflow.keras import utils
from capturemock import capturemock, RECORD, REPLAY

fitback_logs

class FitCallback(tf.keras.callbacks.Callback):
def on_train_end(self, logs=None):
global fitback_logs
fitback_logs = logs

#@capturemock("keras.models.Sequential.fit", mode=REPLAY)
#@capturemock("keras.models.Sequential.fit", mode=RECORD)
def test_training():
global fitback_logs
CLASS_COUNT = 10
(x_train, y_train), (x_test, y_test) = mnist.load_data()

x_train = x_train.reshape(x_train.shape[0], -1)
x_train = x_train.astype('float32') / 255.
y_train = utils.to_categorical(y_train, CLASS_COUNT)

model = Sequential()
model.add(Dense(800, input_dim=x_train.shape[1], activation='relu'))
model.add(Dense(100, activation='relu'))
model.add(Dense(CLASS_COUNT, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
res = model.fit(x_train, y_train,
callbacks=[FitCallback()],
batch_size=128, epochs=15, verbose=1)
assert ['loss', 'accuracy']==list(res.history.keys())
assert [1, 15, 469]==list(res.params.values())
assert ['loss', 'accuracy']==list(fitback_logs.keys())