tenorflow. python .framework.errors_impl.InvalidArgumentError: sequence_length (0) <= 1 - PullRequest
0 голосов
/ 23 января 2020

Я действительно не уверен, в чем проблема с моим кодом. Я пытаюсь реализовать модель LSTM-CT C. Но каждый раз он показывает следующую ошибку:

tenorflow. python .framework.errors_impl.InvalidArgumentError: sequence_length (0) <= 1 [[node ctc / CTCLoss (определено в C: \ Users \ Apon \ Desktop \ Test \ venv \ lib \ site-packages \ tenorsflow_core \ python \ framework \ ops.py: 1751)]] [Op: __inference_keras_scratch_graph_1828] </p>

Стек вызовов функций: keras_scratch_graph

import glob
import itertools
from keras.layers import Activation
from keras_preprocessing import sequence
from keras import layers, Model
from keras.layers import LSTM
from keras.layers import Dense, Lambda
from keras import backend as K
from keras.optimizers import SGD
import numpy as np
from keras.utils import np_utils
#tf.config.experimental.set_visible_devices([], 'GPU')

train_audio_path = sorted(glob.glob('data/train/*.wav'))
train_label_path = sorted(glob.glob('data/train/*.txt'))

nb_labels = 3
channel = 2


def ctc_lambda_func(args):
    y_pred, labels, input_length, label_length = args
    print(y_pred.shape)
    print(labels.shape)
    print(input_length)
    print(label_length)
    y_pred = y_pred[:, 2:, :]
    return K.ctc_batch_cost(labels, y_pred, input_length, label_length)


def decode_batch(test_func, word_batch):
    out = test_func([word_batch])[0]
    ret = []
    for j in range(out.shape[0]):
        out_best = list(np.argmax(out[j, 2:], 1))
        out_best = [k for k, g in itertools.groupby(out_best)]
        outstr = out_best
        ret.append(outstr)
    return ret


input = layers.Input(shape=(None, 1))
lstm = LSTM(8, return_sequences=True, name='encoder')(input)
inner = Dense(4)(lstm)
y_pred = Activation('softmax', name='softmax')(inner)
model = Model(input, y_pred)
model.summary()
labels = layers.Input(name='the_labels', shape=[nb_labels], dtype='float32')
input_length = layers.Input(name='input_length', shape=[1], dtype='int64')
label_length = layers.Input(name='label_length', shape=[1], dtype='int64')
loss_out = Lambda(ctc_lambda_func, output_shape=(1,), name='ctc')([y_pred, labels, input_length, label_length])
model = Model(inputs=[input, labels, input_length, label_length], outputs=loss_out)

sgd = SGD(lr=0.02, decay=1e-6, momentum=0.9, nesterov=True)

model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer=sgd)
model.summary()

x = np.array([[0, 0, 0], [0, 0, 1], [0, 0, 0], [0, 1, 0], [0, 0, 0]], dtype=np.float32)
y = np.array([[0], [1], [0], [2], [0]], dtype=np.int64)
nb_train = len(x)
x_pad = sequence.pad_sequences(x, value=float(5), dtype='float32', padding="post", truncating='post')
y_pad = sequence.pad_sequences(y, value=float(3), dtype='float32', padding="post")
x_len = np.asarray([len(x[i]) for i in range(nb_train)])
y_len = np.asarray([len(y[i]) for i in range(nb_train)])
x_pad = x_pad.reshape(5, 3, 1)
y_pad = y_pad.reshape(-1, 1)
y_pad = np_utils.to_categorical(y_pad, num_classes=3)
model.fit([x_pad, y_pad, x_len, y_len], np.zeros(nb_train), epochs=1, batch_size=1)
...