-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmodel_v2.py
More file actions
86 lines (72 loc) · 3.36 KB
/
model_v2.py
File metadata and controls
86 lines (72 loc) · 3.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
from keras.layers import Conv2D, Dropout, MaxPooling2D, Dense, Flatten, BatchNormalization
from keras.layers.merge import Concatenate,concatenate
from keras.models import Sequential, Model, Input
from keras.optimizers import Adam
import numpy as np
import pickle
from h5utils import H5Recorder
def createModel(config):
height=config["cameraheight"]
width = config["camerawidth"]
# Create the model
inp = Input((height,width, 3),name="frontcamerainput")
sensors = Input((3,),name="sensors") # speed, accelleration, throttle
model = Sequential()
model.add(Conv2D(32,(3, 3), input_shape=(height,width, 3), padding='same', activation='relu'))
model.add(BatchNormalization())
model.add(Conv2D(32,(3, 3), padding='same', activation='relu'))
model.add(Conv2D(32,(3, 3), padding='same', activation='relu'))
model.add(Conv2D(32,(3, 3), padding='same', activation='relu'))
model.add(Dropout(0.2))
model.add(Conv2D(32,(3, 3), padding='same', activation='relu'))
model.add(Conv2D(32,(3, 3), padding='same', activation='relu'))
model.add(Conv2D(32,(3, 3), padding='same', activation='relu'))
model.add(Conv2D(32,(3, 3), padding='same', activation='relu'))
model.add(Dropout(0.2))
model.add(Conv2D(32,(3, 3), padding='same', activation='relu'))
model.add(Conv2D(32,(3, 3), padding='same', activation='relu'))
model.add(Conv2D(64,(3, 3), padding='same', activation='relu'))
model.add(Dropout(0.2))
model.add(Conv2D(64,(3, 3), padding='same', activation='relu'))
model.add(Conv2D(64,(3, 3), padding='same', activation='relu'))
model.add(Conv2D(64,(3, 3), padding='same', activation='relu'))
model.add(Dropout(0.2))
model.add(Flatten())
fullx=concatenate([model(inp),sensors])
x=Dense(32, activation='relu')(fullx)
steering_model=Dense(1, activation='linear',name="steering")(x)
x=Dense(4, activation='relu')(fullx)
throttle_model=Dense(1, activation='linear',name="throttle")(x)
combined_model=Model([inp,sensors],[steering_model,throttle_model])
# Compile models
opt = Adam(lr=0.00001)
combined_model.compile(loss='mean_squared_error', optimizer=opt)
return combined_model
scaled=np.array([0.001,0.001,0.00001])
#convert structure and normalize single observation+info to input to model
def convertX(observation,info):
X=[np.expand_dims(np.array(x),axis=0) for x in observation]
X[1]*=scaled
return X
#convert output of model to structure/units used by arobocar: single action
def converta(y):
return [y[0][0],y[1][0]]
#convert array of arobocar actions to model y: used for imitation learning
def converty(action):
return [action[:,0],action[:,1]]
#record any additional items
class recorder(H5Recorder):
def __init__(self,h5file,config=None,maxidx=10000):
super().__init__(h5file, config,maxidx)
if config: # only set for create
self.ec=h5file.create_dataset('ec', (maxidx, 3), 'f')
self.ec.attrs['cols']="speed,acceleration,odometer"
# record a single observation
def record(self, observation, reward, done, info):
idx=super().record(observation,reward,done,info)
self.ec[idx]=info['ec']
return idx
# get batch of X from h5file, change structure and scale for model
def getX(self,idx,cnt=1):
X=[self.images[idx:idx+cnt],self.sensors[idx:idx+cnt]*scaled]
return X