cnn模型训练报错:InvalidArgumentError: sequence_length(0) <= 129

CNN模型部分代码如下 :
#神经网络输入和输出X,Y的读入数据集特征
X_train = [features[i] for i in train_index]
Y_train = [texts[i] for i in train_index]
X_test = [features[i] for i in test_index]
Y_test = [texts[i] for i in test_index]

batch_size = 16#16

#定义训练批次的产生,一次训练16个
def batch_generator(x, y, batch_size=batch_size):
    offset = 0
    while True:
        offset += batch_size

        if offset == batch_size or offset >= len(x):
            data_index = np.arange(len(x))
            np.random.shuffle(data_index)
            x = [x[i] for i in data_index]
            y = [y[i] for i in data_index]
            offset = batch_size

        X_data = x[offset - batch_size: offset]
        Y_data = y[offset - batch_size: offset]

        X_maxlen = max([X_data[i].shape[0] for i in range(batch_size)])
        Y_maxlen = max([len(Y_data[i]) for i in range(batch_size)])

        X_batch = np.zeros([batch_size, X_maxlen,26])#3D
        Y_batch = np.ones([batch_size, Y_maxlen]) * len(char2id)
        X_length = np.zeros([batch_size, 1], dtype='int32')
        Y_length = np.zeros([batch_size, 1], dtype='int32')

        for i in range(batch_size):
            X_length[i, 0] = X_data[i].shape[0]
            X_batch[i, :X_length[i, 0],:] = X_data[i]#3D

            Y_length[i, 0] = len(Y_data[i])
            Y_batch[i, :Y_length[i, 0]] = [char2id[c] for c in Y_data[i]]

        inputs = {'X': X_batch, 'Y': Y_batch, 'X_length': X_length, 'Y_length': Y_length}
        outputs = {'ctc': np.zeros([batch_size])}

        yield (inputs, outputs)



#%%

epochs = 50
num_blocks = 3
filters = 128

X = Input(shape=(None,26), dtype='float32', name='X')
Y = Input(shape=(None,), dtype='float32', name='Y')
X_length = Input(shape=(1,), dtype='int32', name='X_length')
Y_length = Input(shape=(1,), dtype='int32', name='Y_length')

#卷积1层
def conv1d(inputs, filters, kernel_size, dilation_rate):
    return Conv1D(filters=filters, kernel_size=kernel_size, strides=1, padding='causal', activation=None,
                  dilation_rate=dilation_rate)(inputs)

#池化层(最大池化)
def max_average_pooling(inputs,pool_size):
    return MaxPooling1D(pool_size=pool_size, padding='valid')(inputs)

#标准化函数
def batchnorm(inputs):
    return BatchNormalization()(inputs)

#激活层函数
def activation(inputs, activation):
    return Activation(activation)(inputs)

#常规全连接层
def fullconnect(inputs):
    return Dense(units=len(char2id) + 1, activation='softmax')(inputs)

#搭建网络:(卷积+最大池化)*3+全连接*1
c1 = activation(batchnorm(conv1d(X, filters, 1, 1)), 'relu')#第一层卷积,激活函数relu
p1 = max_average_pooling(c1,2)#第一层池化层
c2 = activation(batchnorm(conv1d(p1, filters, 1, 1)), 'relu')#第二层卷积,激活函数relu
p2 = max_average_pooling(c2,2)#第二层池化层
c3 = activation(batchnorm(conv1d(p2, filters, 1, 1)), 'relu')#第三层卷积,激活函数relu
p3 = max_average_pooling(c3,2)#第三层池化层
#softmax损失函数输出结果
Y_pred = fullconnect(p3)#全连接层
#Y_pred = activation(batchnorm(conv1d(p3, len(char2id) + 1, 1, 1)), 'softmax')#卷积层代替全连接层
sub_model = Model(inputs=X, outputs=Y_pred)


#计算损失函数
def calc_ctc_loss(args):
    y, yp, ypl, yl = args
    return K.ctc_batch_cost(y, yp, ypl, yl)


ctc_loss = Lambda(calc_ctc_loss, output_shape=(1,), name='ctc')([Y, Y_pred, X_length, Y_length])
#加载模型训练
model = Model(inputs=[X, Y, X_length, Y_length], outputs=ctc_loss)
#建立优化器
optimizer = SGD(lr=0.02, momentum=0.9, nesterov=True, clipnorm=5)
#激活模型开始计算
model.compile(loss={'ctc': lambda ctc_true, ctc_pred: ctc_pred}, optimizer=optimizer)


checkpointer = ModelCheckpoint(filepath='c3p3fc1_fbank_relu.h5',verbose=0)
lr_decay = ReduceLROnPlateau(monitor='loss', factor=0.2, patience=1, min_lr=0.006)#Reduce learning rate when a metric has stopped improving


以上代码可运行,接着开始模型的训练

模型训练

代码如下:


#开始训练
history = model.fit_generator(
    generator=batch_generator(X_train, Y_train),
    steps_per_epoch=len(X_train) // batch_size,
    epochs=epochs,
    validation_data=batch_generator(X_test, Y_test),
    validation_steps=len(X_test) / batch_size,
    callbacks=[checkpointer,lr_decay])


这里开始报错:

InvalidArgumentError: sequence_length(0) <= 129
[[{{node ctc_12/CTCLoss}}]] [Op:__inference_keras_scratch_graph_118435]
完整报错:

Traceback (most recent call last):

  File "E:\BaiduNetdiskDownload\speak\train1_fbank.py", line 305, in <module>
    callbacks=[checkpointer,lr_decay])

  File "E:\Anacond\A\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper
    return func(*args, **kwargs)

  File "E:\Anacond\A\lib\site-packages\keras\engine\training.py", line 1732, in fit_generator
    initial_epoch=initial_epoch)

  File "E:\Anacond\A\lib\site-packages\keras\engine\training_generator.py", line 220, in fit_generator
    reset_metrics=False)

  File "E:\Anacond\A\lib\site-packages\keras\engine\training.py", line 1514, in train_on_batch
    outputs = self.train_function(ins)

  File "E:\Anacond\A\lib\site-packages\tensorflow\python\keras\backend.py", line 3217, in __call__
    outputs = self._graph_fn(*converted_inputs)

  File "E:\Anacond\A\lib\site-packages\tensorflow\python\eager\function.py", line 558, in __call__
    return self._call_flat(args)

  File "E:\Anacond\A\lib\site-packages\tensorflow\python\eager\function.py", line 627, in _call_flat
    outputs = self._inference_function.call(ctx, args)

  File "E:\Anacond\A\lib\site-packages\tensorflow\python\eager\function.py", line 415, in call
    ctx=ctx)

  File "E:\Anacond\A\lib\site-packages\tensorflow\python\eager\execute.py", line 66, in quick_execute
    six.raise_from(core._status_to_exception(e.code, message), None)

  File "<string>", line 3, in raise_from

InvalidArgumentError: sequence_length(0) <= 129
     [[{{node ctc_12/CTCLoss}}]] [Op:__inference_keras_scratch_graph_118435]

怎么破

https://blog.csdn.net/zkgoup/article/details/103443387

调整参数试试