我正在尝试使用 Keras(TensorFlow 后端,版本 1.14.0)运行一个相对简单的 CNN。以下是提供上下文的代码。
from keras.layers import Dense, Conv2D, MaxPooling2D, BatchNormalization, GlobalAveragePooling2Dfrom tensorflow.python.keras.callbacks import EarlyStopping, ModelCheckpointfrom keras import modelsfrom keras.applications.vgg16 import preprocess_inputfrom keras.preprocessing.image import ImageDataGeneratorimport matplotlib.pyplot as pltfrom keras.models import load_modelimport numpy as np# 起始点my_model = models.Sequential()# 添加第一个卷积块my_model.add(Conv2D(16, (3, 3), activation='relu', padding='same', input_shape=(224, 224, 3)))my_model.add(MaxPooling2D((2, 2), padding='same'))# 第二个块my_model.add(Conv2D(32, (3, 3), activation='relu', padding='same'))my_model.add(MaxPooling2D((2, 2), padding='same'))# 第三个块my_model.add(Conv2D(64, (3, 3), activation='relu', padding='same'))my_model.add(MaxPooling2D((2, 2), padding='same'))# 第四个块my_model.add(Conv2D(128, (3, 3), activation='relu', padding='same'))my_model.add(MaxPooling2D((2, 2), padding='same'))# 全局平均池化my_model.add(GlobalAveragePooling2D())# 全连接层my_model.add(Dense(64, activation='relu'))my_model.add(BatchNormalization())# 进行预测my_model.add(Dense(2, activation='sigmoid'))# 显示模型摘要。检查可训练参数的数量my_model.summary()# 使用早期停止来通过回调最佳地终止训练es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=5)# 自动保存最佳模型mc = ModelCheckpoint("C:/Users/ab123/Desktop/vgg16_1.h5", monitor='val_acc', verbose=1, save_best_only=True, save_weights_only=False, mode='auto', period=1)cb_list = [mc, es]# 编译模型my_model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])# 设置数据生成器data_generator = ImageDataGenerator(preprocessing_function=preprocess_input)# 从目录获取训练图像批次train_generator = data_generator.flow_from_directory( 'D:/Project2020/Step2a/train', target_size=(224, 224), batch_size=10, class_mode='categorical')# 从目录获取验证图像批次validation_generator = data_generator.flow_from_directory( 'D:/Project2020/Step2a/val', target_size=(224, 224), batch_size=10, class_mode='categorical')history = my_model.fit_generator( train_generator, epochs=1, steps_per_epoch=2000, validation_data=validation_generator, validation_steps=1000, callbacks=cb_list)plt.plot(history.history['acc'])plt.plot(history.history['val_acc'])plt.ylim([.5,1.1])plt.ylabel('Accuracy')plt.xlabel('Epoch')plt.legend(['Train', 'Validation'], loc='upper left')plt.savefig("C:/Users/ab123/Desktop/11-16-19model.png", dpi=300)# 加载保存的模型import ossaved_model = load_model('C:/Users/ab123/Desktop/11-16-19model.h5')# 为测试图像集生成数据test_generator = data_generator.flow_from_directory( 'C:/Users/aeshon/Downloads/birds', target_size=(224, 224), batch_size=1, class_mode='categorical', shuffle=False)# 获取最后一个全连接层的预测激活值test_generator.reset()pred = saved_model.predict_generator(test_generator, verbose=1, steps=100)# 确定每个样本的最大激活值predicted_class_indices=np.argmax(pred,axis=1)# 为每个预测值标记正确性别labels = (test_generator.class_indices)labels = dict((v,k) for k,v in labels.items())predictions = [labels[k] for k in predicted_class_indices]# 将文件名格式化为简单的男性或女性filenames=test_generator.filenamesfilenz=[0]for i in range(0,len(filenames)): filenz.append(filenames[i].split('\\')[0])filenz=filenz[1:]# 确定测试集的准确性match=[]for i in range(0,len(filenames)): match.append(filenz[i]==predictions[i])match.count(True)/100
模型在早期停止功能触发或训练完成之前运行得很好。在那之后,它会抛出这个错误(带有回溯)。
Traceback (most recent call last): File "D:/Invasive Species Detector/11-16-19 model.py", line 77, in <module> validation_steps=1000, callbacks=cb_list) File "C:\ProgramData\Anaconda3\envs\tensorflow_test\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper return func(*args, **kwargs) File "C:\ProgramData\Anaconda3\envs\tensorflow_test\lib\site-packages\keras\engine\training.py", line 1418, in fit_generator initial_epoch=initial_epoch) File "C:\ProgramData\Anaconda3\envs\tensorflow_test\lib\site-packages\keras\engine\training_generator.py", line 264, in fit_generator callbacks.on_train_end() File "C:\ProgramData\Anaconda3\envs\tensorflow_test\lib\site-packages\keras\callbacks.py", line 142, in on_train_end callback.on_train_end(logs) File "C:\ProgramData\Anaconda3\envs\tensorflow_test\lib\site-packages\tensorflow\python\keras\callbacks.py", line 940, in on_train_end if self.model._ckpt_saved_epoch is not None:AttributeError: 'Sequential' object has no attribute '_ckpt_saved_epoch'
自然地,我首先查看是否有人之前遇到过相同的错误。除了一个使用 KerasTPU 对象的人之外,没有人遇到过,但在 Stack Overflow 上没有人回答他的问题,所以我不知道如何解决这个问题。我希望有人能对这个问题提供一些见解,请在评论中问我任何其他信息,如版本等。
回答:
在你的导入中,你混合了 keras
和 tf.keras
包的导入,这是不支持的,会产生像你遇到的那样的奇怪错误。解决方案很简单,选择一个包并从中进行所有相关导入。