Как использовать функции оценки и прогнозирования в реализации Sin cNet keras? - PullRequest
0 голосов
/ 10 июля 2020

спасибо за внимание, я разрабатываю автоматическую c систему распознавания динамиков с использованием Sin cNet.

Ravanelli, M., & Bengio, Y. (2018, декабрь) . Распознавание динамика по необработанной форме сигнала с помощью sin cnet. В 2018 году IEEE Speken Language Technology Workshop (SLT) (стр. 1021-1028). IEEE.

Поскольку сеть закодирована в Pytorch, я поискал и нашел здесь реализацию Keras https://github.com/grausof/keras-sincnet. Я адаптировал код train.py для обучения Sin cnet с моими собственными данными в Tensorflow 2.0 и работал нормально, я сохранил только веса моей обученной сети, мои обучающие данные имеют форму 128,3200,1 для входов и 128 для этикеток на партию

#Creates a Sincnet model with input_size=3200 (wlen), num_classes=40, fs=16000
redsinc = create_model(wlen,num_classes,fs)

#Saves only weights and stopearly callback
checkpointer = ModelCheckpoint(filepath='checkpoints/SincNetBiomex3.hdf5',verbose=1, 
save_best_only=True, monitor='val_accuracy',save_weights_only=True)
stopearly = EarlyStopping(monitor='val_accuracy',patience=3,verbose=1)
callbacks = [checkpointer,stopearly]

# optimizer = RMSprop(lr=learnrate, rho=0.9, epsilon=1e-8)
optimizer = Adam(learning_rate=learnrate)

# Creates generator of training batches
train_generator = batchGenerator(batch_size,train_inputs,train_labels,wlen)
validinputs, validlabels = create_batches_rnd(validation_labels.shape[0],
validation_inputs,validation_labels,wlen)

#Compiling model and train with function fit_generator
redsinc.compile(loss='sparse_categorical_crossentropy',  optimizer=optimizer, metrics=['accuracy'])

history = redsinc.fit_generator(train_generator, steps_per_epoch=N_batches, epochs = epochs, 
verbose = 1, callbacks=callbacks, validation_data=(validinputs,validlabels))

Проблема возникла, когда я попытался оценить сеть, я не использовал код из test.py, я загрузил только веса, которые я ранее сохранил, и использую функцию оценки мои тестовые данные имели форму 1200,3200,1 для входных данных и 1200 для меток.

# Create a Sincnet model and load previously saved weights
redsinc = create_model(wlen,num_clases,fs)
redsinc.load_weights('checkpoints/SincNetBiomex3.hdf5')

test_loss, test_accuracy = redsinc.evaluate(x=eval_in,y=eval_lab)

RuntimeError: You must compile your model before training/testing. Use `model.compile(optimizer, 
loss)`.

Затем я добавил тот же код компиляции, который использовал для обучения:

optimizer = Adam(learning_rate=0.001)
redsinc.compile(loss='sparse_categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])

Затем повторно запустите тестовый код и получите следующее:

 WARNING:tensorflow:From C:\Users\atenc\Anaconda3\envs\py3.7-tf2.0gpu\lib\site- 
 packages\tensorflow_core\python\ops\resource_variable_ops.py:1781: calling 
 BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is 
 deprecated and will be removed in a future version.

 Instructions for updating:
 If using Keras pass *_constraint arguments to layers.

 ValueError: A tf.Variable created inside your tf.function has been garbage-collected. Your code needs to keep Python references to variables created inside `tf.function`s.

A common way to raise this error is to create and return a variable only referenced inside your function:

@tf.function
def f():
  v = tf.Variable(1.0)
  return v

v = f()  # Crashes with this error message!

The reason this crashes is that @tf.function annotated function returns a **`tf.Tensor`** with the **value** of the variable when the function is called rather than the variable instance itself. As such there is no code holding a reference to the `v` created inside the function and Python garbage collects it.

The simplest way to fix this issue is to create variables outside the function and capture them:

v = tf.Variable(1.0)

@tf.function
def f():
  return v

f()  # <tf.Tensor: ... numpy=1.>
v.assign_add(1.)
f()  # <tf.Tensor: ... numpy=2.>

Я не понимаю ошибки, так как я оценивал другие сети с той же функцией и никогда не сталкивался с проблемами. Затем я решил использовать функцию прогнозирования, чтобы сопоставить предсказанные метки с правильными метками и получить все показатели с помощью моего собственного кода, но я получил еще одну ошибку.

# Create a Sincnet model and load previously saved weights
redsinc = create_model(wlen,num_clases,fs)
redsinc.load_weights('checkpoints/SincNetBiomex3.hdf5')
print('Model loaded')

#Predict labels with test data 
predict_labels = redsinc.predict(eval_in)

Error while reading resource variable _AnonymousVar212 from Container: localhost. This could mean that the variable was uninitialized. Not found: Resource localhost/_AnonymousVar212/class tensorflow::Var does not exist.
 [[node sinc_conv1d/concat_104/ReadVariableOp (defined at \Users\atenc\Anaconda3\envs\py3.7-tf2.0gpu\lib\site-packages\tensorflow_core\python\framework\ops.py:1751) ]] [Op:__inference_keras_scratch_graph_13649]

 Function call stack:
 keras_scratch_graph

Надеюсь, кто-нибудь сможет сказать мне, что означают эти ошибки и как Решите их, я искал решения для них, но большинство решений, которые я нашел, похоже, не связаны с моей проблемой, поэтому я не могу применить эти решения. Я предполагаю, что ошибки вызваны кодом слоя Sin cnet, потому что это слой с настраиваемым кодом. Код для слоя Sin cnet можно найти в репозитории github в файле sin cnet .py.

Я ценю любую помощь, которую я могу получить, еще раз спасибо за ваше внимание.

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