спасибо за внимание, я разрабатываю автоматическую 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.
Я ценю любую помощь, которую я могу получить, еще раз спасибо за ваше внимание.