千家信息网

keras和tensorflow模型同时读取报错如何解决

发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,这篇文章主要介绍"keras和tensorflow模型同时读取报错如何解决"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"keras和tensorflow模型同
千家信息网最后更新 2024年12月12日keras和tensorflow模型同时读取报错如何解决

这篇文章主要介绍"keras和tensorflow模型同时读取报错如何解决"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"keras和tensorflow模型同时读取报错如何解决"文章能帮助大家解决问题。

在使用tensorflow与keras混用是model.save 是正常的但是在load_model的时候报错了在这里mark 一下

其中错误为:TypeError: tuple indices must be integers, not list

再一一番百度后无结果,上谷歌后找到了类似的问题。但是是一对鸟文不知道什么东西(翻译后发现是俄文)。后来谷歌翻译了一下找到了解决方法。故将原始问题文章贴上来警示一下

原训练代码

from tensorflow.python.keras.preprocessing.image import ImageDataGeneratorfrom tensorflow.python.keras.models import Sequentialfrom tensorflow.python.keras.layers import Conv2D, MaxPooling2D, BatchNormalizationfrom tensorflow.python.keras.layers import Activation, Dropout, Flatten, Dense #Каталог с данными для обученияtrain_dir = 'train'# Каталог с данными для проверкиval_dir = 'val'# Каталог с данными для тестированияtest_dir = 'val' # Размеры изображенияimg_width, img_height = 800, 800# Размерность тензора на основе изображения для входных данных в нейронную сеть# backend Tensorflow, channels_lastinput_shape = (img_width, img_height, 3)# Количество эпохepochs = 1# Размер мини-выборкиbatch_size = 4# Количество изображений для обученияnb_train_samples = 300# Количество изображений для проверкиnb_validation_samples = 25# Количество изображений для тестированияnb_test_samples = 25 model = Sequential() model.add(Conv2D(32, (7, 7), padding="same", input_shape=input_shape))model.add(BatchNormalization())model.add(Activation('tanh'))model.add(MaxPooling2D(pool_size=(10, 10))) model.add(Conv2D(64, (5, 5), padding="same"))model.add(BatchNormalization())model.add(Activation('tanh'))model.add(MaxPooling2D(pool_size=(10, 10))) model.add(Flatten())model.add(Dense(512))model.add(Activation('relu'))model.add(Dropout(0.5))model.add(Dense(10, activation='softmax')) model.compile(loss='categorical_crossentropy',              optimizer="Nadam",              metrics=['accuracy'])print(model.summary())datagen = ImageDataGenerator(rescale=1. / 255) train_generator = datagen.flow_from_directory(    train_dir,    target_size=(img_width, img_height),    batch_size=batch_size,    class_mode='categorical') val_generator = datagen.flow_from_directory(    val_dir,    target_size=(img_width, img_height),    batch_size=batch_size,    class_mode='categorical') test_generator = datagen.flow_from_directory(    test_dir,    target_size=(img_width, img_height),    batch_size=batch_size,    class_mode='categorical') model.fit_generator(    train_generator,    steps_per_epoch=nb_train_samples // batch_size,    epochs=epochs,    validation_data=val_generator,    validation_steps=nb_validation_samples // batch_size) print('Сохраняем сеть') model.save("grib.h6")print("Сохранение завершено!")

模型载入

from tensorflow.python.keras.preprocessing.image import ImageDataGeneratorfrom tensorflow.python.keras.models import Sequentialfrom tensorflow.python.keras.layers import Conv2D, MaxPooling2D, BatchNormalizationfrom tensorflow.python.keras.layers import Activation, Dropout, Flatten, Densefrom keras.models import load_model print("Загрузка сети")model = load_model("grib.h6")print("Загрузка завершена!")

报错

/usr/bin/python3.5 /home/disk2/py/neroset/do.py
/home/mama/.local/lib/python3.5/site-packages/h6py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
from ._conv import register_converters as _register_converters
Using TensorFlow backend.
Загрузка сети
Traceback (most recent call last):
File "/home/disk2/py/neroset/do.py", line 13, in
model = load_model("grib.h6")
File "/usr/local/lib/python3.5/dist-packages/keras/models.py", line 243, in load_model
model = model_from_config(model_config, custom_objects=custom_objects)
File "/usr/local/lib/python3.5/dist-packages/keras/models.py", line 317, in model_from_config
return layer_module.deserialize(config, custom_objects=custom_objects)
File "/usr/local/lib/python3.5/dist-packages/keras/layers/__init__.py", line 55, in deserialize
printable_module_name='layer')
File "/usr/local/lib/python3.5/dist-packages/keras/utils/generic_utils.py", line 144, in deserialize_keras_object
list(custom_objects.items())))
File "/usr/local/lib/python3.5/dist-packages/keras/models.py", line 1350, in from_config
model.add(layer)
File "/usr/local/lib/python3.5/dist-packages/keras/models.py", line 492, in add
output_tensor = layer(self.outputs[0])
File "/usr/local/lib/python3.5/dist-packages/keras/engine/topology.py", line 590, in __call__
self.build(input_shapes[0])
File "/usr/local/lib/python3.5/dist-packages/keras/layers/normalization.py", line 92, in build
dim = input_shape[self.axis]
TypeError: tuple indices must be integers or slices, not list

Process finished with exit code 1

战斗种族解释

убераю BatchNormalization всё работает хорошо. Не подскажите в чём ошибка?Выяснил что сохранение keras и нормализация tensorflow не работают вместе нужно просто изменить строку импорта.(译文:整理BatchNormalization一切正常。 不要告诉我错误是什么?我发现保存keras和规范化tensorflow不能一起工作;只需更改导入字符串即可。)

强调文本 强调文本

keras.preprocessing.image import ImageDataGeneratorkeras.models import Sequentialkeras.layers import Conv2D, MaxPooling2D, BatchNormalizationkeras.layers import Activation, Dropout, Flatten, Dense

##完美解决

补充:keras和tensorflow模型同时读取要慎重

项目中,先读取了一个keras模型获取模型输入size,再加载keras转tensorflow后的pb模型进行预测。

报错:

Attempting to use uninitialized value batch_normalization_14/moving_mean

逛论坛,有建议加上初始化:

sess.run(tf.global_variables_initializer())

但是这样的话,会导致模型参数全部变成初始化数据。无法使用预测模型参数。

最后发现,将keras模型的加载去掉即可。

猜测原因:keras模型和tensorflow模型同时读取有坑

import cv2import numpy as npfrom keras.models import load_modelfrom utils.datasets import get_labelsfrom utils.preprocessor import preprocess_inputimport timeimport osimport tensorflow as tffrom tensorflow.python.platform import gfile os.environ["CUDA_VISIBLE_DEVICES"] = "-1" emotion_labels = get_labels('fer2013')emotion_target_size = (64,64)#emotion_model_path = './models/emotion_model.hdf5'#emotion_classifier = load_model(emotion_model_path)#emotion_target_size = emotion_classifier.input_shape[1:3] path = '/mnt/nas/cv_data/emotion/test'filelist = os.listdir(path)total_num = len(filelist)timeall = 0n = 0 sess = tf.Session()#sess.run(tf.global_variables_initializer())with gfile.FastGFile("./trans_model/emotion_mode.pb", 'rb') as f:    graph_def = tf.GraphDef()    graph_def.ParseFromString(f.read())    sess.graph.as_default()    tf.import_graph_def(graph_def, name='')     pred = sess.graph.get_tensor_by_name("predictions/Softmax:0")     ######################img##########################    for item in filelist:        if (item == '.DS_Store') | (item == 'Thumbs.db'):            continue        src = os.path.join(os.path.abspath(path), item)        bgr_image = cv2.imread(src)        gray_image = cv2.cvtColor(bgr_image, cv2.COLOR_BGR2GRAY)        gray_face = gray_image        try:            gray_face = cv2.resize(gray_face, (emotion_target_size))        except:            continue         gray_face = preprocess_input(gray_face, True)        gray_face = np.expand_dims(gray_face, 0)        gray_face = np.expand_dims(gray_face, -1)         input = sess.graph.get_tensor_by_name('input_1:0')        res = sess.run(pred, {input: gray_face})        print("src:", src)         emotion_probability = np.max(res[0])        emotion_label_arg = np.argmax(res[0])        emotion_text = emotion_labels[emotion_label_arg]        print("predict:", res[0], ",prob:", emotion_probability, ",label:", emotion_label_arg, ",text:",emotion_text)

关于"keras和tensorflow模型同时读取报错如何解决"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

0