Python keras 模块,models() 实例源码
我们从Python开源项目中,提取了以下50个代码示例,用于说明如何使用keras.models()。
def main(argv):
parser = argparse.ArgumentParser()
parser.add_argument('--phase', default='train', help='Phase: Can be train or predict, the default value is train.')
parser.add_argument('--model_file', default='./models/arci.config', help='Model_file: MatchZoo model file for the chosen model.')
args = parser.parse_args()
model_file = args.model_file
with open(model_file, 'r') as f:
config = json.load(f)
phase = args.phase
if args.phase == 'train':
train(config)
elif args.phase == 'predict':
predict(config)
else:
print('Phase Error.', end='\n')
return
def main(argv):
parser = argparse.ArgumentParser()
parser.add_argument('--phase', default='train', help='Phase: Can be train or predict, the default value is train.')
parser.add_argument('--model_file', default='./models/arci.config', help='Model_file: MatchZoo model file for the chosen model.')
args = parser.parse_args()
model_file = args.model_file
with open(model_file, 'r') as f:
config = json.load(f)
phase = args.phase
if args.phase == 'train':
train(config)
elif args.phase == 'predict':
predict(config)
else:
print('Phase Error.', end='\n')
return
def loadModel(self, modelPath):
import h5py
import json
from neuralnets.keraslayers.ChainCRF import create_custom_objects
model = keras.models.load_model(modelPath, custom_objects=create_custom_objects())
with h5py.File(modelPath, 'r') as f:
mappings = json.loads(f.attrs['mappings'])
if 'additionalFeatures' in f.attrs:
self.additionalFeatures = json.loads(f.attrs['additionalFeatures'])
if 'maxCharLen' in f.attrs:
self.maxCharLen = int(f.attrs['maxCharLen'])
self.model = model
self.setMappings(None, mappings)
def train(model, X_train, y_train, X_test, y_test):
sys.stdout.write('Training model\n\n')
sys.stdout.flush()
# train each iteration individually to back up current state
# safety measure against potential crashes
epoch_count = 0
while epoch_count < epoch:
epoch_count += 1
sys.stdout.write('Epoch count: ' + str(epoch_count) + '\n')
sys.stdout.flush()
model.fit(X_train, y_train, batch_size=batch_size,
nb_epoch=1, validation_data=(X_test, y_test))
sys.stdout.write('Epoch {} done, saving model to file\n\n'.format(epoch_count))
sys.stdout.flush()
model.save_weights('./models/convnet_weights.h5')
return model
def train(model, X_train, y_train, X_test, y_test):
sys.stdout.write('Training model with data augmentation\n\n')
sys.stdout.flush()
datagen = image_generator()
datagen.fit(X_train)
# train each iteration individually to back up current state
# safety measure against potential crashes
epoch_count = 0
while epoch_count < epoch:
epoch_count += 1
sys.stdout.write('Epoch count: ' + str(epoch_count) + '\n')
sys.stdout.flush()
model.fit_generator(datagen.flow(X_train, y_train, batch_size=batch_size),
steps_per_epoch=len(X_train) // batch_size,
epochs=1,
validation_data=(X_test, y_test))
sys.stdout.write('Epoch {} done, saving model to file\n\n'.format(epoch_count))
sys.stdout.flush()
model.save_weights('./models/convnet_improved_weights.h5')
return model
def train_process(self):
client = GAClient.Client()
for model in self.population.values():
# if getattr(model, 'parent', None) is not None:
# has parents means muatetion and weight change, so need to save weights
keras.models.save_model(model.model, model.config.model_path)
model.graph.save_params(model.config.output_path+'/graph.json')
kwargs = dict(
name=model.config.name,
epochs=model.config.epochs,
verbose=model.config.verbose,
limit_data=model.config.limit_data,
dataset_type=model.config.dataset_type
)
if parallel:
client.run_self(kwargs)
else:
name, score = GAClient.run(**kwargs)
setattr(self.population[name], 'score', score)
if parallel:
client.wait()
for name, score in client.scores.items():
setattr(self.population[name], 'score', score)
def load_keras_model(weights, yaml=None, json=None,
normalise_conv_for_one_hot_encoded_input=False,
axis_of_normalisation=None,
name_of_conv_layer_to_normalise=None):
if (normalise_conv_for_one_hot_encoded_input):
assert axis_of_normalisation is not None,\
"specify axis of normalisation for normalising one-hot encoded input"
assert yaml is not None or json is not None,\
"either yaml or json must be specified"
assert yaml is None or json is None,\
"only one of yaml or json must be specified"
if (yaml is not None):
from keras.models import model_from_yaml
model = model_from_yaml(open(yaml).read())
else:
from keras.models import model_from_json
model = model_from_json(open(json).read())
model.load_weights(weights)
if (normalise_conv_for_one_hot_encoded_input):
mean_normalise_first_conv_layer_weights(
model,
axis_of_normalisation=axis_of_normalisation,
name_of_conv_layer_to_normalise=name_of_conv_layer_to_normalise)
return model
def test_initial_state_GRU(self):
data = np.random.rand(1, 1, 2)
model = keras.models.Sequential()
model.add(keras.layers.GRU(5, input_shape=(1, 2), batch_input_shape=[1, 1, 2], stateful=True))
model.get_layer(index=1).reset_states()
coreml_model = keras_converter.convert(model=model, input_names='data', output_names='output')
keras_output_1 = model.predict(data)
coreml_full_output_1 = coreml_model.predict({'data': data})
coreml_output_1 = coreml_full_output_1['output']
coreml_output_1 = np.expand_dims(coreml_output_1, 1)
np.testing.assert_array_almost_equal(coreml_output_1.T, keras_output_1)
hidden_state = (np.random.rand(1, 5))
model.get_layer(index=1).reset_states(states=hidden_state)
coreml_model = keras_converter.convert(model=model, input_names='data', output_names='output')
spec = coreml_model.get_spec()
keras_output_2 = model.predict(data)
coreml_full_output_2 = coreml_model.predict({'data': data, spec.description.input[1].name: hidden_state[0]})
coreml_output_2 = coreml_full_output_2['output']
coreml_output_2 = np.expand_dims(coreml_output_2, 1)
np.testing.assert_array_almost_equal(coreml_output_2.T, keras_output_2)
def test_initial_state_SimpleRNN(self):
data = np.random.rand(1, 1, 2)
model = keras.models.Sequential()
model.add(keras.layers.SimpleRNN(5, input_shape=(1, 2), batch_input_shape=[1, 1, 2], stateful=True))
model.get_layer(index=1).reset_states()
coreml_model = keras_converter.convert(model=model, input_names='data', output_names='output')
keras_output_1 = model.predict(data)
coreml_full_output_1 = coreml_model.predict({'data': data})
coreml_output_1 = coreml_full_output_1['output']
coreml_output_1 = np.expand_dims(coreml_output_1, 1)
np.testing.assert_array_almost_equal(coreml_output_1.T, keras_output_1)
hidden_state = np.random.rand(1, 5)
model.get_layer(index=1).reset_states(states=hidden_state)
coreml_model = keras_converter.convert(model=model, input_names='data', output_names='output')
spec = coreml_model.get_spec()
keras_output_2 = model.predict(data)
coreml_full_output_2 = coreml_model.predict({'data': data, spec.description.input[1].name: hidden_state[0]})
coreml_output_2 = coreml_full_output_2['output']
coreml_output_2 = np.expand_dims(coreml_output_2, 1)
np.testing.assert_array_almost_equal(coreml_output_2.T, keras_output_2)
def pred():
tag_index = pickle.loads(open('tag_index.pkl', 'rb').read())
index_tag = { index:tag for tag, index in tag_index.items() }
name_img150 = []
for name in filter(lambda x: '.jpg' in x, sys.argv):
img = Image.open('{name}'.format(name=name))
img = img.convert('RGB')
img150 = np.array(img.resize((150, 150)))
name_img150.append( (name, img150) )
model = load_model(sorted(glob.glob('models/*.model'))[-1])
for name, img150 in name_img150:
result = model.predict(np.array([img150]) )
result = result.tolist()[0]
result = { i:w for i,w in enumerate(result)}
for i,w in sorted(result.items(), key=lambda x:x[1]*-1)[:30]:
print("{name} tag={tag} prob={prob}".format(name=name, tag=index_tag[i], prob=w) )
def train():
for i in range(500):
print('now iter {} load pickled dataset...'.format(i))
Xs = []
ys = []
names = [name for idx, name in enumerate( glob.glob('../dataset/*.pkl') )]
random.shuffle( names )
for idx, name in enumerate(names):
try:
X,y = pickle.loads(open(name,'rb').read() )
except EOFError as e:
continue
if idx%100 == 0:
print('now scan iter', idx)
if idx >= 15000:
break
Xs.append( X )
ys.append( y )
Xs = np.array( Xs )
ys = np.array( ys )
model.fit(Xs, ys, epochs=1 )
print('now iter {} '.format(i))
model.save_weights('models/{:09d}.h5'.format(i))
def pred():
"""
tag_index = pickle.loads(open('tag_index.pkl', 'rb').read())
index_tag = { index:tag for tag, index in tag_index.items() }
name_img150 = []
for name in filter(lambda x: '.jpg' in x, sys.argv):
img = Image.open('{name}'.format(name=name))
img = img.convert('RGB')
img150 = np.array(img.resize((150, 150)))
name_img150.append( (name, img150) )
"""
model.load_weights(sorted(glob.glob('models/*.h5'))[-1])
tag_index = pickle.loads( open('make_datapair/tag_index.pkl', 'rb').read() )
index_tag = { index:tag for tag,index in tag_index.items() }
for name in glob.glob('./make_datapair/dataset/*'):
X, y = pickle.loads( open(name,'rb').read() )
result = model.predict(np.array([X]) )
result = result.tolist()[0]
result = { i:w for i,w in enumerate(result)}
for i,w in sorted(result.items(), key=lambda x:x[1]*-1)[:30]:
print("{name} tag={tag} prob={prob}".format(name=name, tag=index_tag[i], prob=w) )
def compile(self, optimizer = None, loss_func = None):
"""Setup all of the TF graph variables/ops.
This is inspired by the compile method on the
keras.models.Model class.
This is the place to create the target network, setup
loss function and any placeholders.
"""
if loss_func is None:
loss_func = mean_huber_loss
# loss_func = 'mse'
if optimizer is None:
optimizer = Adam(lr = self.learning_rate)
# optimizer = RMSprop(lr=0.00025)
with tf.variable_scope("Loss"):
state = Input(shape = (self.frame_height, self.frame_width, self.num_frames) , name = "states")
action_mask = Input(shape = (self.num_actions,), name = "actions")
qa_value = self.q_network(state)
qa_value = merge([qa_value, action_mask], mode = 'mul', name = "multiply")
qa_value = Lambda(lambda x: tf.reduce_sum(x, axis=1, keep_dims = True), name = "sum")(qa_value)
self.final_model = Model(inputs = [state, action_mask], outputs = qa_value)
self.final_model.compile(loss=loss_func, optimizer=optimizer)
def load_model(model_spec_file, model_weights_file):
from json import dumps, load
params = load(open(model_spec_file, "r"))
model = keras.models.model_from_json(dumps(params['model']))
binary = params['binary']
optimizer = params['optimizer']
model.load_weights(model_weights_file)
if binary:
model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=["accuracy"])
else:
model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=["accuracy"])
lc = LanguageClassifier(model)
lc.binary = binary
return lc
def resnet(repetition=2, k=1):
'''Wide Residual Network (with a slight modification)
depth == repetition*6 + 2
'''
from keras.models import Model
from keras.layers import Input, Dense, Flatten, AveragePooling2D
from keras.regularizers import l2
input_shape = (1, _img_len, _img_len)
output_dim = len(_columns)
x = Input(shape=input_shape)
z = conv2d(nb_filter=8, k_size=5, downsample=True)(x) # out_shape == 8, _img_len/ 2, _img_len/ 2
z = bn_lrelu(0.01)(z)
z = residual_block(nb_filter=k*16, repetition=repetition)(z) # out_shape == k*16, _img_len/ 4, _img_len/ 4
z = residual_block(nb_filter=k*32, repetition=repetition)(z) # out_shape == k*32, _img_len/ 8, _img_len/ 8
z = residual_block(nb_filter=k*64, repetition=repetition)(z) # out_shape == k*64, _img_len/16, _img_len/16
z = AveragePooling2D((_img_len/16, _img_len/16))(z)
z = Flatten()(z)
z = Dense(output_dim=output_dim, activation='sigmoid', W_regularizer=l2(_Wreg_l2), init='zero')(z)
return Model(input=x, output=z)
def loadModel(self,filename):
#import h5py
#f = h5py.File(filename, 'r+')
#del f['optimizer_weights']
from keras.models import load_model
self.keras_model=load_model(filename, custom_objects=global_loss_list)
self.optimizer=self.keras_model.optimizer
self.compiled=True
def define_model(weights_path):
'''
Define model structure with weights.
'''
from resnet50 import ResNet50
from keras.models import Model
from keras.layers import Dense, GlobalAveragePooling2D
resnet50_model = ResNet50()
fc1000 = resnet50_model.get_layer('fc1000').output
final_softmax = Dense(output_dim=2, activation='softmax')(fc1000)
resnet50_finetune_1skip = Model(input=resnet50_model.input, output=final_softmax)
resnet50_finetune_1skip.load_weights(weights_path)
resnet50_finetune_1skip.compile(loss="categorical_crossentropy",
optimizer='nadam',
metrics=['accuracy'])
return resnet50_finetune_1skip
def get_residual_model(is_mnist=True, img_channels=1, img_rows=28, img_cols=28):
model = keras.models.Sequential()
first_layer_channel = 128
if is_mnist: # size to be changed to 32,32
model.add(ZeroPadding2D((2,2), input_shape=(img_channels, img_rows, img_cols))) # resize (28,28)-->(32,32)
# the first conv
model.add(Convolution2D(first_layer_channel, 3, 3, border_mode='same'))
else:
model.add(Convolution2D(first_layer_channel, 3, 3, border_mode='same', input_shape=(img_channels, img_rows, img_cols)))
model.add(Activation('relu'))
# [residual-based Conv layers]
residual_blocks = design_for_residual_blocks(num_channel_input=first_layer_channel)
model.add(residual_blocks)
model.add(BatchNormalization(axis=1))
model.add(Activation('relu'))
# [Classifier]
model.add(Flatten())
model.add(Dense(nb_classes))
model.add(Activation('softmax'))
# [END]
return model
def fprop(self, x):
"""
Exposes all the layers of the model returned by get_layer_names.
:param x: A symbolic representation of the network input
:return: A dictionary mapping layer names to the symbolic
representation of their output.
"""
from keras.models import Model as KerasModel
if self.keras_model is None:
# Get the input layer
new_input = self.model.get_input_at(0)
# Make a new model that returns each of the layers as output
out_layers = [x_layer.output for x_layer in self.model.layers]
self.keras_model = KerasModel(new_input, out_layers)
# and get the outputs for that model on the input x
outputs = self.keras_model(x)
# Keras only returns a list for outputs of length >= 1, if the model
# is only one layer, wrap a list
if len(self.model.layers) == 1:
outputs = [outputs]
# compute the dict to return
fprop_dict = dict(zip(self.get_layer_names(), outputs))
return fprop_dict
def Model(input, output, **kwargs):
if int(keras.__version__.split('.')[0]) >= 2:
return keras.models.Model(inputs=input, outputs=output, **kwargs)
else:
return keras.models.Model(input=input, output=output, **kwargs)
def __init__(self, experiment_dir, db_yml=None):
super(SpeakerEmbedding, self).__init__(
experiment_dir, db_yml=db_yml)
# architecture
if 'architecture' in self.config_:
architecture_name = self.config_['architecture']['name']
models = __import__('pyannote.audio.embedding.models',
fromlist=[architecture_name])
Architecture = getattr(models, architecture_name)
self.architecture_ = Architecture(
**self.config_['architecture'].get('params', {}))
# approach
if 'approach' in self.config_:
approach_name = self.config_['approach']['name']
approaches = __import__('pyannote.audio.embedding.approaches',
fromlist=[approach_name])
Approach = getattr(approaches, approach_name)
self.approach_ = Approach(
**self.config_['approach'].get('params', {}))
# (5, None, None, False) ==> '5'
# (5, 1, None, False) ==> '1-5'
# (5, None, 2, False) ==> '5+2'
# (5, 1, 2, False) ==> '1-5+2'
# (5, None, None, True) ==> '5x'
def skipgram_model(vocab_size, embedding_dim=100, paradigm='Functional'):
# Sequential paradigm
if paradigm == 'Sequential':
target = Sequential()
target.add(Embedding(vocab_size, embedding_dim, input_length=1))
context = Sequential()
context.add(Embedding(vocab_size, embedding_dim, input_length=1))
# merge the pivot and context models
model = Sequential()
model.add(Merge([target, context], mode='dot'))
model.add(Reshape((1,), input_shape=(1,1)))
model.add(Activation('sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy')
return model
# Functional paradigm
elif paradigm == 'Functional':
target = Input(shape=(1,), name='target')
context = Input(shape=(1,), name='context')
#print target.shape, context.shape
shared_embedding = Embedding(vocab_size, embedding_dim, input_length=1, name='shared_embedding')
embedding_target = shared_embedding(target)
embedding_context = shared_embedding(context)
#print embedding_target.shape, embedding_context.shape
merged_vector = dot([embedding_target, embedding_context], axes=-1)
reshaped_vector = Reshape((1,), input_shape=(1,1))(merged_vector)
#print merged_vector.shape
prediction = Dense(1, input_shape=(1,), activation='sigmoid')(reshaped_vector)
#print prediction.shape
model = Model(inputs=[target, context], outputs=prediction)
model.compile(optimizer='adam', loss='binary_crossentropy')
return model
else:
print('paradigm error')
return None
def cbow_base_model(dict_size, emb_size=100, context_window_size=4):
model = keras.models.Sequential()
model.add(Embedding(dict_size, emb_size,
input_length=context_window_size,
embeddings_initializer=keras.initializers.TruncatedNormal(mean=0.0, stddev=0.2),
))
model.add(Lambda(lambda x: K.mean(x, axis=1), output_shape=(emb_size,)))
model.add(Dense(dict_size))
model.add(Activation('softmax')) # TODO: use nce
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
model.compile(optimizer=sgd,
loss='categorical_crossentropy',)
return model
def train_cbow_base_model():
min_word_freq = 5
word_dict = process.get_movie_name_id_dict(min_word_freq=min_word_freq)
dict_size = len(word_dict)
emb_size = 100
context_window_size = 4
epochs = 20
batch_size = 128
model = cbow_base_model(dict_size, emb_size, context_window_size)
for epoch_id in xrange(epochs):
# train by batch
batch_id = 0
x_batch = []
y_batch = []
for movie_ids in process.shuffle(process.reader_creator(word_dict, ngram=context_window_size+1), 10000)():
batch_id += 1
if batch_id % (batch_size*50) == 0:
# Print evaluate log
score = model.evaluate(np.array(x_batch),
keras.utils.to_categorical(y_batch, num_classes=dict_size))
logger.info('[epoch #%d] batch #%d, train loss:%s' % (epoch_id, batch_id, score))
if batch_id % batch_size == 0:
# Convert labels to categorical one-hot encoding
model.train_on_batch(np.array(x_batch),
keras.utils.to_categorical(y_batch, num_classes=dict_size))
x_batch = []
y_batch = []
x = np.array(movie_ids[:context_window_size])
y = movie_ids[-1]
x_batch.append(x)
y_batch.append(y)
logger.info('model train done')
# store word embedding
with open('./models/keras_0804_09_cbow', 'w') as fwrite:
for idx, vec in enumerate(model.layers[0].get_weights()[0].tolist()):
fwrite.write('%d %s\n' % (idx, ' '.join([str(_) for _ in vec])))
def make_init_model(self):
models = []
input_data = Input(shape=self.gl_config.input_shape)
import random
init_model_index = random.randint(1, 4)
init_model_index = 1
if init_model_index == 1: # one conv layer with kernel num = 64
stem_conv_1 = Conv2D(128, 3, padding='same', name='conv2d1' )(input_data)
stem_conv_1 = PReLU()(stem_conv_1)
elif init_model_index == 2: # two conv layers with kernel num = 64
stem_conv_0 = Conv2D(128, 3, padding='same', name='conv2d1')(input_data)
stem_conv_0 = PReLU()(stem_conv_0)
stem_conv_1 = Conv2D(128, 3, padding='same', name='conv2d2')(stem_conv_0)
stem_conv_1 = PReLU()(stem_conv_1)
elif init_model_index == 3: # one conv layer with a wider kernel num = 128
stem_conv_1 = Conv2D(256, 3, padding='same', name='conv2d1')(input_data)
stem_conv_1 = PReLU()(stem_conv_1)
elif init_model_index == 4: # two conv layers with a wider kernel_num = 128
stem_conv_0 = Conv2D(256, 3, padding='same', name='conv2d1')(input_data)
stem_conv_0 = PReLU()(stem_conv_0)
stem_conv_1 = Conv2D(256, 3, padding='same', name='conv2d2')(stem_conv_0)
stem_conv_1 = PReLU()(stem_conv_1)
import keras
stem_conv_1 = keras.layers.MaxPooling2D(name='maxpooling2d1')(stem_conv_1)
stem_conv_1 = Conv2D(self.gl_config.nb_class, 3, padding='same', name='conv2d3')(stem_conv_1)
stem_global_pooling_1 = GlobalMaxPooling2D(name='globalmaxpooling2d1')(stem_conv_1)
stem_softmax_1 = Activation('softmax', name='activation1')(stem_global_pooling_1)
model = Model(inputs=input_data, outputs=stem_softmax_1)
return model
def copy_model(self, model, config):
from keras.utils.generic_utils import get_custom_objects
from Model import IdentityConv, GroupIdentityConv
get_custom_objects()['IdentityConv'] = IdentityConv
get_custom_objects()['GroupIdentityConv'] = GroupIdentityConv
new_model = MyModel(config, model.graph.copy(), keras.models.load_model(model.config.model_path))
keras.models.save_model(new_model.model, new_model.config.model_path)
return new_model
def load(self, model_path):
self.model = keras.models.load_model(model_path)
def default_categorical():
from keras.layers import Input, Dense, merge
from keras.models import Model
from keras.layers import Convolution2D, MaxPooling2D, Reshape, BatchNormalization
from keras.layers import Activation, Dropout, Flatten, Dense
img_in = Input(shape=(120, 160, 3), name='img_in') # First layer, input layer, Shape comes from camera.py resolution, RGB
x = img_in
x = Convolution2D(24, (5,5), strides=(2,2), activation='relu')(x) # 24 features, 5 pixel x 5 pixel kernel (convolution, feauture) window, 2wx2h stride, relu activation
x = Convolution2D(32, (5,5), strides=(2,2), activation='relu')(x) # 32 features, 5px5p kernel window, 2wx2h stride, relu activatiion
x = Convolution2D(64, (5,5), strides=(2,2), activation='relu')(x) # 64 features, 5px5p kernal window, 2wx2h stride, relu
x = Convolution2D(64, (3,3), strides=(2,2), activation='relu')(x) # 64 features, 3px3p kernal window, 2wx2h stride, relu
x = Convolution2D(64, (3,3), strides=(1,1), activation='relu')(x) # 64 features, 3px3p kernal window, 1wx1h stride, relu
# Possibly add MaxPooling (will make it less sensitive to position in image). Camera angle fixed, so may not to be needed
x = Flatten(name='flattened')(x) # Flatten to 1D (Fully connected)
x = Dense(100, activation='relu')(x) # Classify the data into 100 features, make all negatives 0
x = Dropout(.1)(x) # Randomly drop out (turn off) 10% of the neurons (Prevent overfitting)
x = Dense(50, activation='relu')(x) # Classify the data into 50 features, make all negatives 0
x = Dropout(.1)(x) # Randomly drop out 10% of the neurons (Prevent overfitting)
#categorical output of the angle
angle_out = Dense(15, activation='softmax', name='angle_out')(x) # Connect every input with every output and output 15 hidden units. Use Softmax to give percentage. 15 categories and find best one based off percentage 0.0-1.0
#continous output of throttle
throttle_out = Dense(1, activation='relu', name='throttle_out')(x) # Reduce to 1 number, Positive number only
model = Model(inputs=[img_in], outputs=[angle_out, throttle_out])
model.compile(optimizer='adam',
loss={'angle_out': 'categorical_crossentropy',
'throttle_out': 'mean_absolute_error'},
loss_weights={'angle_out': 0.9, 'throttle_out': .001})
return model
def default_linear():
from keras.layers import Input, Dense, merge
from keras.models import Model
from keras.layers import Convolution2D, MaxPooling2D, Reshape, BatchNormalization
from keras.layers import Activation, Dropout, Flatten, Dense
img_in = Input(shape=(120,160,3), name='img_in')
x = img_in
x = Convolution2D(24, (5,5), strides=(2,2), activation='relu')(x)
x = Convolution2D(32, (5,5), strides=(2,2), activation='relu')(x)
x = Convolution2D(64, (5,5), strides=(2,2), activation='relu')(x)
x = Convolution2D(64, (3,3), strides=(2,2), activation='relu')(x)
x = Convolution2D(64, (3,3), strides=(1,1), activation='relu')(x)
x = Flatten(name='flattened')(x)
x = Dense(100, activation='linear')(x)
x = Dropout(.1)(x)
x = Dense(50, activation='linear')(x)
x = Dropout(.1)(x)
#categorical output of the angle
angle_out = Dense(1, activation='linear', name='angle_out')(x)
#continous output of throttle
throttle_out = Dense(1, activation='linear', name='throttle_out')(x)
model = Model(inputs=[img_in], outputs=[angle_out, throttle_out])
model.compile(optimizer='adam',
loss={'angle_out': 'mean_squared_error',
'throttle_out': 'mean_squared_error'},
loss_weights={'angle_out': 0.5, 'throttle_out': .5})
return model
def default_n_linear(num_outputs):
from keras.layers import Input, Dense, merge
from keras.models import Model
from keras.layers import Convolution2D, MaxPooling2D, Reshape, BatchNormalization
from keras.layers import Activation, Dropout, Flatten, Cropping2D, Lambda
img_in = Input(shape=(120,160,3), name='img_in')
x = img_in
x = Cropping2D(cropping=((60,0), (0,0)))(x) #trim 60 pixels off top
x = Lambda(lambda x: x/127.5 - 1.)(x) # normalize and re-center
x = Convolution2D(24, (5,5), strides=(2,2), activation='relu')(x)
x = Convolution2D(32, (5,5), strides=(2,2), activation='relu')(x)
x = Convolution2D(64, (5,5), strides=(1,1), activation='relu')(x)
x = Convolution2D(64, (3,3), strides=(1,1), activation='relu')(x)
x = Convolution2D(64, (3,3), strides=(1,1), activation='relu')(x)
x = Flatten(name='flattened')(x)
x = Dense(100, activation='relu')(x)
x = Dropout(.1)(x)
x = Dense(50, activation='relu')(x)
x = Dropout(.1)(x)
outputs = []
for i in range(num_outputs):
outputs.append(Dense(1, activation='linear', name='n_outputs' + str(i))(x))
model = Model(inputs=[img_in], outputs=outputs)
model.compile(optimizer='adam',
loss='mse')
return model
def default_imu(num_outputs, num_imu_inputs):
'''
Notes: this model depends on concatenate which failed on keras < 2.0.8
'''
from keras.layers import Input, Dense
from keras.models import Model
from keras.layers import Convolution2D, MaxPooling2D, Reshape, BatchNormalization
from keras.layers import Activation, Dropout, Flatten, Cropping2D, Lambda
from keras.layers.merge import concatenate
img_in = Input(shape=(120,160,3), name='img_in')
imu_in = Input(shape=(num_imu_inputs,), name="imu_in")
x = img_in
x = Cropping2D(cropping=((60,0), (0,0)))(x) #trim 60 pixels off top
#x = Lambda(lambda x: x/127.5 - 1.)(x) # normalize and re-center
x = Convolution2D(24, (5,5), strides=(2,2), activation='relu')(x)
x = Convolution2D(32, (5,5), strides=(2,2), activation='relu')(x)
x = Convolution2D(64, (3,3), strides=(2,2), activation='relu')(x)
x = Convolution2D(64, (3,3), strides=(1,1), activation='relu')(x)
x = Convolution2D(64, (3,3), strides=(1,1), activation='relu')(x)
x = Flatten(name='flattened')(x)
x = Dense(100, activation='relu')(x)
x = Dropout(.1)(x)
y = imu_in
y = Dense(14, activation='relu')(y)
y = Dense(14, activation='relu')(y)
y = Dense(14, activation='relu')(y)
z = concatenate([x, y])
z = Dense(50, activation='relu')(z)
z = Dropout(.1)(z)
z = Dense(50, activation='relu')(z)
z = Dropout(.1)(z)
outputs = []
for i in range(num_outputs):
outputs.append(Dense(1, activation='linear', name='out_' + str(i))(z))
model = Model(inputs=[img_in, imu_in], outputs=outputs)
model.compile(optimizer='adam',
loss='mse')
return model
def load_model(filename=None, json_str=None, weights_file=None, custom_objects={}):
"""Loads model architecture from JSON and instantiates the model.
filename: path to JSON file specifying model architecture
json_str: (or) a json string specifying the model architecture
weights_file: path to HDF5 file containing model weights
custom_objects: A Dictionary of custom classes used in the model keyed by name"""
import_keras()
from keras.models import model_from_json
if filename != None:
with open( filename ) as arch_f:
json_str = arch_f.readline()
model = model_from_json( json_str, custom_objects=custom_objects)
if weights_file is not None:
model.load_weights( weights_file )
return model
def convert_sequential_model(model,
num_dims=None,
nonlinear_mxts_mode=\
NonlinearMxtsMode.DeepLIFT_GenomicsDefault,
verbose=True,
dense_mxts_mode=DenseMxtsMode.Linear,
conv_mxts_mode=ConvMxtsMode.Linear,
maxpool_deeplift_mode=default_maxpool_deeplift_mode,
layer_overrides={}):
if (verbose):
print("nonlinear_mxts_mode is set to: "+str(nonlinear_mxts_mode))
converted_layers = []
if (model.layers[0].input_shape is not None):
input_shape = model.layers[0].input_shape
assert input_shape[0] is None #batch axis
num_dims_input = len(input_shape)
assert num_dims is None or num_dims_input==num_dims,\
"num_dims argument of "+str(num_dims)+" is incompatible with"\
+" the number of dims in layers[0].input_shape which is: "\
+str(model.layers[0].input_shape)
num_dims = num_dims_input
else:
input_shape = None
converted_layers.append(
blobs.Input(num_dims=num_dims, shape=input_shape, name="input"))
#converted_layers is actually mutated to be extended with the
#additional layers so the assignment is not strictly necessary,
#but whatever
converted_layers = sequential_container_conversion(
layer=model, name="", verbose=verbose,
nonlinear_mxts_mode=nonlinear_mxts_mode,
dense_mxts_mode=dense_mxts_mode,
conv_mxts_mode=conv_mxts_mode,
maxpool_deeplift_mode=maxpool_deeplift_mode,
converted_layers=converted_layers,
layer_overrides=layer_overrides)
deeplift.util.connect_list_of_layers(converted_layers)
converted_layers[-1].build_fwd_pass_vars()
return models.SequentialModel(converted_layers)
def test_initial_state_LSTM(self):
data = np.random.rand(1, 1, 2)
model = keras.models.Sequential()
model.add(keras.layers.LSTM(5, input_shape=(1, 2), batch_input_shape=[1, 1, 2], stateful=True))
model.get_layer(index=1).reset_states()
coreml_model = keras_converter.convert(model=model, input_names='data', output_names='output')
keras_output_1 = model.predict(data)
coreml_full_output_1 = coreml_model.predict({'data': data})
coreml_output_1 = coreml_full_output_1['output']
coreml_output_1 = np.expand_dims(coreml_output_1, 1)
np.testing.assert_array_almost_equal(coreml_output_1.T, keras_output_1)
hidden_state = (np.random.rand(1, 5), np.random.rand(1, 5))
model.get_layer(index=1).reset_states(states=hidden_state)
coreml_model = keras_converter.convert(model=model, input_names='data', output_names='output')
spec = coreml_model.get_spec()
keras_output_2 = model.predict(data)
coreml_full_output_2 = coreml_model.predict(
{'data': data, spec.description.input[1].name: hidden_state[0][0],
spec.description.input[2].name: hidden_state[1][0]})
coreml_output_2 = coreml_full_output_2['output']
coreml_output_2 = np.expand_dims(coreml_output_2, 1)
np.testing.assert_array_almost_equal(coreml_output_2.T, keras_output_2)
def load(self):
self.model = keras.models.load_model(memoryNetwork.FILE_NAME)
with open(memoryNetwork.VOCAB_FILE_NAME, 'rb') as file:
self.word_id = pickle.load(file)
def train():
print('load lexical dataset...')
Xs, Ys = loader(db='lexical150.ldb')
print('build model...')
model = build_model()
for i in range(100):
model.fit(np.array(Xs), np.array(Ys), batch_size=16, nb_epoch=1 )
if i%1 == 0:
model.save('models/model%05d.model'%i)
def eval():
tag_index = pickle.loads(open('tag_index.pkl', 'rb').read())
index_tag = { index:tag for tag, index in tag_index.items() }
model = build_model()
model = load_model(sorted(glob.glob('models/*.model'))[-1])
Xs, Ys = loader(db='lexical_eval.ldb', th=100)
for i in range(30):
result = model.predict(np.array([Xs[i]]) )
for i,w in sorted(result.items(), key=lambda x:x[1]*-1)[:30]:
print(index_tag[i], i, w)
def __init__(self, folder):
super(EpochCheckpoint, self).__init__()
assert folder is not None, "Err. Please specify a folder where models will be saved"
self.folder = folder
print "[LOG] EpochCheckpoint: folder to save models: "+self.folder
def main():
RUN_TIME = sys.argv[1]
if RUN_TIME == "TRAIN":
image_features = Input(shape=(4096,))
model = build_model(image_features)
print model.summary()
# number of training images
_num_train = get_num_train_images()
# Callbacks
# remote_cb = RemoteMonitor(root='http://localhost:9000')
tensorboard = TensorBoard(log_dir="logs/{}".format(time()))
epoch_cb = EpochCheckpoint(folder="./snapshots/")
valid_cb = ValidCallBack()
# fit generator
steps_per_epoch = math.ceil(_num_train/float(BATCH))
print "Steps per epoch i.e number of iterations: ",steps_per_epoch
train_datagen = data_generator(batch_size=INCORRECT_BATCH, image_class_ranges=TRAINING_CLASS_RANGES)
history = model.fit_generator(
train_datagen,
steps_per_epoch=steps_per_epoch,
epochs=250,
callbacks=[tensorboard, valid_cb]
)
print history.history.keys()
elif RUN_TIME == "TEST":
from keras.models import load_model
model = load_model("snapshots/epoch_49.hdf5", custom_objects={"hinge_rank_loss":hinge_rank_loss})
K.clear_session()
def loadModelFromJson(pathModelJson):
if not os.path.isfile(pathModelJson):
raise Exception('Cant find JSON-file [%s]' % pathModelJson)
tpathBase = os.path.splitext(pathModelJson)[0]
tpathModelWeights = '%s.h5' % tpathBase
if not os.path.isfile(tpathModelWeights):
raise Exception('Cant find h5-Weights-file [%s]' % tpathModelWeights)
with open(pathModelJson, 'r') as f:
tmpStr = f.read()
model = keras.models.model_from_json(tmpStr)
model.load_weights(tpathModelWeights)
return model
def load(basename, **kwargs):
model = ConvModel()
model.impl = keras.models.load_model(basename, **kwargs)
with open(basename + '.labels', 'r') as f:
model.labels = json.load(f)
with open(basename + '.vocab', 'r') as f:
model.vocab = json.load(f)
return model
def create(w2v, labels, **kwargs):
model = ConvModel()
model.labels = labels
model.vocab = w2v.vocab
filtsz = kwargs['filtsz']
pdrop = kwargs.get('dropout', 0.5)
mxlen = int(kwargs.get('mxlen', 100))
cmotsz = kwargs['cmotsz']
finetune = bool(kwargs.get('finetune', True))
nc = len(labels)
x = Input(shape=(mxlen,), dtype='int32', name='input')
vocab_size = w2v.weights.shape[0]
embedding_dim = w2v.dsz
lut = Embedding(input_dim=vocab_size, output_dim=embedding_dim, weights=[w2v.weights], input_length=mxlen, trainable=finetune)
embed = lut(x)
mots = []
for i, fsz in enumerate(filtsz):
conv = Conv1D(cmotsz, fsz, activation='relu')(embed)
gmp = GlobalMaxPooling1D()(conv)
mots.append(gmp)
joined = merge(mots, mode='concat')
cmotsz_all = cmotsz * len(filtsz)
drop1 = Dropout(pdrop)(joined)
input_dim = cmotsz_all
last_layer = drop1
dense = Dense(output_dim=nc, input_dim=input_dim, activation='softmax')(last_layer)
model.impl = keras.models.Model(input=[x], output=[dense])
return model
def get_vocab(self):
return self.vocab
# TODO: Add the other models!
def predict(self, X):
if type(self.model.input_shape) is tuple:
X = np.array(X)
if len(self.model.input_shape) == 2:
X = X.reshape((X.shape[0], -1))
else:
raise LanguageClassifierException('Mult-input models are not supported yet')
predictions = self.model.predict(X, verbose=True, batch_size=32)
if (len(predictions.shape) > 1) and (1 not in predictions.shape):
predictions = predictions.argmax(axis=-1)
else:
predictions = 1 * (predictions > 0.5).ravel()
return predictions
def predict_proba(self, X):
if type(self.model.input_shape) is tuple:
X = np.array(X)
if len(self.model.input_shape) == 2:
X = X.reshape((X.shape[0], -1))
else:
raise LanguageClassifierException('Mult-input models are not supported yet')
return self.model.predict(X, verbose=True, batch_size=32)
def test(self, X, y, verbose=True):
# if we don't need 3d inputs...
if type(self.model.input_shape) is tuple:
X = np.array(X)
if len(self.model.input_shape) == 2:
X = X.reshape((X.shape[0], -1))
else:
raise LanguageClassifierException('Mult-input models are not supported yet')
if verbose:
print("Getting predictions on the test set")
predictions = self.predict(X)
if len(predictions) != len(y):
raise LanguageClassifierException("Non comparable arrays")
if self.binary:
acc = (predictions == y).mean()
prec = np.sum(np.bitwise_and(predictions, y)) * 1.0 / np.sum(predictions)
recall = np.sum(np.bitwise_and(predictions, y)) * 1.0 / np.sum(y)
if verbose:
print("Test set accuracy of {0:.3f}%".format(acc * 100.0))
print("Test set error of {0:.3f}%".format((1 - acc) * 100.0))
print("Precision for class=1: {0:.3f}".format(prec))
print("Recall for class=1: {0:.3f}".format(recall))
return (acc, prec, recall)
else:
# TODO: Obtain more metrics for the multiclass problem
acc = (predictions == y).mean()
if verbose:
print("Test set accuracy of {0:.3f}%".format(acc * 100.0))
print("Test set error of {0:.3f}%".format((1 - acc) * 100.0))
return acc
def _load_model(fn):
from keras.models import model_from_json
with open(fn + '.json') as f:
model = model_from_json(f.read())
model.load_weights(fn + '.h5')
return model
def train():
print('load lexical dataset...')
Ys, Xs, Rs = loader()
print('build model...')
model = build_model()
for i in range(100):
model.fit(np.array(Xs), np.array(Ys), batch_size=16, nb_epoch=1 )
if i%1 == 0:
model.save('models/model%05d.model'%i)
def eval():
item_index = pickle.loads(open("cookpad/item_index.pkl", "rb").read())
index_items = { index:item for item, index in item_index.items()}
model = build_model()
model = load_model(sorted(glob.glob('models/*.model'))[-1])
Ys, Xs, Rs = loader(th=10)
for i in range(len(Xs)):
result = model.predict(np.array([Xs[i]]) )
ares = [(index_items[index], w) for index, w in enumerate(result.tolist()[0]) ]
print(Rs[i])
for en, (item, w) in enumerate(sorted(ares, key=lambda x:x[1]*-1)[:10]):
print(en, item, w)
def pred():
item_index = pickle.loads(open("cookpad/item_index.pkl", "rb").read())
index_items = { index:item for item, index in item_index.items()}
model = build_model()
model = load_model(sorted(glob.glob('models/model00060.model'))[-1])
target_size = (224,224)
dir_path = "to_pred/*"
max_size = len(glob.glob(dir_path))
for i, name in enumerate(glob.glob(dir_path)):
try:
img = Image.open(name)
except OSError as e:
continue
print(i, max_size, name.split('/')[-1])
w, h = img.size
if w > h :
blank = Image.new('RGB', (w, w))
if w <= h :
blank = Image.new('RGB', (h, h))
blank.paste(img, (0, 0) )
blank = blank.resize( target_size )
Xs = np.array([np.asanyarray(blank)])
result = model.predict(Xs)
ares = [(index_items[index], w) for index, w in enumerate(result.tolist()[0]) ]
for en, (item, w) in enumerate(sorted(ares, key=lambda x:x[1]*-1)[:10]):
print(en, item, w)