Keras版本错误

时间:2018-01-11 16:36:40

标签: python-3.x deep-learning keras

我正在研究Udacity自动驾驶汽车项目,它教一辆汽车自动运行(行为克隆)。

我收到一个奇怪的Unicode错误。

错误陈述如下:

  

(dl)Vidits-MacBook-Pro-2:BehavioralClonning-master ViditShah $ python drive.py model.h5   使用TensorFlow后端。   您正在使用Keras版本b'2.1.2',但该模型是使用b'1.2.1'构建的   Traceback(最近一次调用最后一次):     文件“drive.py”,第122行,in       model = load_model(args.model)     在load_model中输入文件“/Users/ViditShah/anaconda/envs/dl/lib/python3.6/site-packages/keras/models.py”,第240行       model = model_from_config(model_config,custom_objects = custom_objects)     在model_from_config中输入文件“/Users/ViditShah/anaconda/envs/dl/lib/python3.6/site-packages/keras/models.py”,第314行       return layer_module.deserialize(config,custom_objects = custom_objects)     文件“/Users/ViditShah/anaconda/envs/dl/lib/python3.6/site-packages/keras/layers/init.py”,第55行,反序列化       printable_module_name = '层')     文件“/Users/ViditShah/anaconda/envs/dl/lib/python3.6/site-packages/keras/utils/generic_utils.py”,第140行,在deserialize_keras_object中       列表(custom_objects.items())))     在from_config中输入文件“/Users/ViditShah/anaconda/envs/dl/lib/python3.6/site-packages/keras/models.py”,第1323行       layer = layer_module.deserialize(conf,custom_objects = custom_objects)     文件“/Users/ViditShah/anaconda/envs/dl/lib/python3.6/site-packages/keras/layers/init.py”,第55行,反序列化       printable_module_name = '层')     文件“/Users/ViditShah/anaconda/envs/dl/lib/python3.6/site-packages/keras/utils/generic_utils.py”,第140行,在deserialize_keras_object中       列表(custom_objects.items())))     在from_config中输入文件“/Users/ViditShah/anaconda/envs/dl/lib/python3.6/site-packages/keras/layers/core.py”,第699行       function = func_load(config ['function'],globs = globs)     文件“/Users/ViditShah/anaconda/envs/dl/lib/python3.6/site-packages/keras/utils/generic_utils.py”,第224行,在func_load中       raw_code = codecs.decode(code.encode('ascii'),'base64')   UnicodeEncodeError:'ascii'编解码器无法对位置0中的字符'\ xe3'进行编码:序数不在范围内(128)

我在我的anaconda环境dl。

文件drive.py如下所示。(此文件是在分配期间提供的,并且未建议进行编辑。)

import argparse
import base64
from datetime import datetime
import os
import shutil

import numpy as np
import socketio
import eventlet
import eventlet.wsgi
from PIL import Image
from flask import Flask
from io import BytesIO

from keras.models import load_model
import h5py
from keras import __version__ as keras_version

sio = socketio.Server()
app = Flask(__name__)
model = None
prev_image_array = None


class SimplePIController:
    def __init__(self, Kp, Ki):
        self.Kp = Kp
        self.Ki = Ki
        self.set_point = 0.
        self.error = 0.
        self.integral = 0.

    def set_desired(self, desired):
        self.set_point = desired

    def update(self, measurement):
        # proportional error
        self.error = self.set_point - measurement

        # integral error
        self.integral += self.error

        return self.Kp * self.error + self.Ki * self.integral


controller = SimplePIController(0.1, 0.002)
set_speed = 9
controller.set_desired(set_speed)


@sio.on('telemetry')
def telemetry(sid, data):
    if data:
        # The current steering angle of the car
        steering_angle = data["steering_angle"]
        # The current throttle of the car
        throttle = data["throttle"]
        # The current speed of the car
        speed = data["speed"]
        # The current image from the center camera of the car
        imgString = data["image"]
        image = Image.open(BytesIO(base64.b64decode(imgString)))
        image_array = np.asarray(image)
        steering_angle = float(model.predict(image_array[None, :, :, :], batch_size=1))

        throttle = controller.update(float(speed))

        print(steering_angle, throttle)
        send_control(steering_angle, throttle)

        # save frame
        if args.image_folder != '':
            timestamp = datetime.utcnow().strftime('%Y_%m_%d_%H_%M_%S_%f')[:-3]
            image_filename = os.path.join(args.image_folder, timestamp)
            image.save('{}.jpg'.format(image_filename))
    else:
        # NOTE: DON'T EDIT THIS.
        sio.emit('manual', data={}, skip_sid=True)


@sio.on('connect')
def connect(sid, environ):
    print("connect ", sid)
    send_control(0, 0)


def send_control(steering_angle, throttle):
    sio.emit(
        "steer",
        data={
            'steering_angle': steering_angle.__str__(),
            'throttle': throttle.__str__()
        },
        skip_sid=True)


if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Remote Driving')
    parser.add_argument(
        'model',
        type=str,
        help='Path to model h5 file. Model should be on the same path.'
    )
    parser.add_argument(
        'image_folder',
        type=str,
        nargs='?',
        default='',
        help='Path to image folder. This is where the images from the run will be saved.'
    )
    args = parser.parse_args()

    # check that model Keras version is same as local Keras version
    f = h5py.File(args.model, mode='r')
    model_version = f.attrs.get('keras_version')
    keras_version = str(keras_version).encode('utf8')

    if model_version != keras_version:
        print('You are using Keras version ', keras_version,
              ', but the model was built using ', model_version)

    model = load_model(args.model)

    if args.image_folder != '':
        print("Creating image folder at {}".format(args.image_folder))
        if not os.path.exists(args.image_folder):
            os.makedirs(args.image_folder)
        else:
            shutil.rmtree(args.image_folder)
            os.makedirs(args.image_folder)
        print("RECORDING THIS RUN ...")
    else:
        print("NOT RECORDING THIS RUN ...")

    # wrap Flask application with engineio's middleware
    app = socketio.Middleware(sio, app)

    # deploy as an eventlet WSGI server
    eventlet.wsgi.server(eventlet.listen(('', 4567)), app)

1 个答案:

答案 0 :(得分:1)

您收到此错误是因为您尝试加载的模型似乎已经过训练并保存在以前版本的Keras中而不是您正在使用的模型中,如下所示:

  

您使用的是Keras版本b' 2.1.2' ,但该模型是使用b' 1.2.1'回溯(最近一次调用最后一次):文件" drive.py",第122行,在model = load_model(args.model)

似乎解决方法可能是使用您计划使用的相同版本训练您的模型,因此您可以顺利加载它。另一种选择是使用版本1.2.1来加载该模型并使用它

这可能是由于Keras在版本之间保存模型的方式之间存在差异,因为某些市长应该在v.1.2.1和v.2.1.2之间进行更改。