#神经网络输入和输出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
调整参数试试