Почему я продолжаю получать сообщение об ошибке "Максимальная глубина рекурсии превышена при вызове объекта Python" в Keras из Tensorflow 2.0?
Я пытаюсь обучить стековую архитектуру нейронных сетей с помощью CNN, GRU и CTC в редакции Keras от tenorflow 2.0. Я получаю сообщение об ошибке "RecursionError: максимальная глубина рекурсии превышена при вызове объекта Python".
Я попытался импортировать sys и установить предельное значение рекурсии очень высоким с помощью sys.setrecursionlimit(), но программа просто перестает работать.
import sys
import tensorflow as tf
from generator_tf2 import VideoGenerator
from network_model_GRU_tf2 import Decoder
from helpers import labels_to_text
from spell import Spell
from network_model_GRU_tf2 import Network_Model
from keras.callbacks import EarlyStopping, TensorBoard, CSVLogger, ModelCheckpoint
import numpy as np
import datetime
import os
import matplotlib.pyplot as plt
from tensorflow.compat.v1 import ConfigProto
from tensorflow.compat.v1 import InteractiveSession
config = ConfigProto()
config.gpu_options.allow_growth = True
session = InteractiveSession(config=config)
# strategy = tf.distribute.MirroredStrategy()
strategy = tf.distribute.MirroredStrategy(cross_device_ops=tf.distribute.HierarchicalCopyAllReduce())
print('Number of devices: {}'.format(strategy.num_replicas_in_sync))
PREDICT_GREEDY = False #Use of Greedy Search
PREDICT_BEAM_WIDTH = 200 #Set Beam search width
MAX_STRING_LENGTH = 114 #Maximum sentence length
MAX_VIDEO_LENGTH = 114 #Maximum number of video frames
start_epoch = 0
#Directories
PREDICT_DICTIONARY = os.path.join(r"F:\Lip Reading System\vsnet","LessFourSecondsSentences.txt") #Needed for Curriculum learning
INPUT_DIR = os.path.join(r"F:\Lip Reading System\vsnet","models_06082019") #Keras model directory
OUTPUT_DIR = os.path.join(r"F:\Lip Reading System\vsnet","models_08082019") #Keras model directory
#Generator for training
lip_gen_train = VideoGenerator("LessFourSeconds.txt","LessFourSeconds_videoframes_training","LessFourSeconds_subtitles_training", 30, absolute_max_video_len=MAX_VIDEO_LENGTH, absolute_max_string_len=MAX_STRING_LENGTH)
lip_gen_train.build_data_from_frames()
#Generator for testing
lip_gen_test = VideoGenerator("testing_videos.txt","testing_videoframes","testing_subtitles", 10, absolute_max_video_len=MAX_VIDEO_LENGTH, absolute_max_string_len=MAX_STRING_LENGTH)
lip_gen_test.build_data_from_frames()
#Set neural network conditions network
with strategy.scope():
network_model = Network_Model(img_c=1, img_w=100, img_h=50, frames_n=MAX_VIDEO_LENGTH, absolute_max_string_len=MAX_STRING_LENGTH, output_size=38)
network_model.summary()
adam = tf.keras.optimizers.Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
# load weight if necessary
if start_epoch > 0:
weight_file = os.path.join(INPUT_DIR, 'weights%02d.h5' % (start_epoch))
network_model.model.load_weights(weight_file)
# the loss calc occurs elsewhere, so use a dummy lambda func for the loss
network_model.model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer=adam, metrics=['accuracy'])
#Spelling and Decoder
spell = Spell(path=PREDICT_DICTIONARY)
decoder = Decoder(greedy=PREDICT_GREEDY, beam_width=PREDICT_BEAM_WIDTH,postprocessors=[labels_to_text, spell.sentence])
#Early stop and function to save weights
early_stop = tf.keras.callbacks.EarlyStopping(monitor='loss', min_delta=0.001, patience=4, mode='min', verbose=1)
checkpoint = tf.keras.callbacks.ModelCheckpoint(os.path.join(OUTPUT_DIR, "weights{epoch:02d}.h5"), monitor='val_loss', save_weights_only=True, mode='min', period=10)
#Generator
train_history = network_model.model.fit_generator(generator=lip_gen_train.get_batch(),
steps_per_epoch=lip_gen_train.video_dataset_steps,
epochs=1000,
validation_data=lip_gen_test.get_batch(),
validation_steps=lip_gen_test.video_dataset_steps)
Скрипт отлично работает при запуске в tenorflow 1.10.0 с keras 2.2.4 и не выдает ошибку, которую я продолжаю получать ниже:
Traceback (последний вызов был последним): файл "F:\Lip Reading System\vsnet\training_tf2.py", строка 71, в validation_steps=lip_gen_test.video_dataset_steps) ...... RecursionError: максимальная глубина рекурсии превышена при вызове Python объект
0 ответов
Включить model.compile() внутри strategy.scope()
#Set neural network conditions network
with strategy.scope():
network_model = Network_Model(img_c=1, img_w=100, img_h=50, frames_n=MAX_VIDEO_LENGTH, absolute_max_string_len=MAX_STRING_LENGTH, output_size=38)
network_model.summary()
adam = tf.keras.optimizers.Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=1e-08)
# load weight if necessary
if start_epoch > 0:
weight_file = os.path.join(INPUT_DIR, 'weights%02d.h5' % (start_epoch))
network_model.model.load_weights(weight_file)
# the loss calc occurs elsewhere, so use a dummy lambda func for the loss
network_model.model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer=adam, metrics=['accuracy'])