我正在研究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)
答案 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之间进行更改。