def test_sequential_lstm_mxnet_model_saving(): max_features = 1000 maxlen = 80 batch_size = 32 model = Sequential() model.add(Embedding(max_features, 128, input_length=maxlen)) model.add(LSTM(128, unroll=True)) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # Generate random data x = np.random.random((1000, maxlen)) y = np.random.random((1000, 128)) print("X shape - ", x.shape) print("Y shape - ", y.shape) model.fit(x, y, batch_size=batch_size, epochs=2) save_mxnet_model(model, prefix='test_lstm', epoch=0) # Import with MXNet and try to perform inference import mxnet as mx sym, arg_params, aux_params = mx.model.load_checkpoint(prefix='test_lstm', epoch=0) mod = mx.mod.Module(symbol=sym, data_names=['/embedding_1_input1'], context=mx.cpu(), label_names=None) mod.bind(for_training=False, data_shapes=[('/embedding_1_input1', (1, 80))], label_shapes=mod._label_shapes) mod.set_params(arg_params, aux_params, allow_missing=True) data_iter = mx.io.NDArrayIter([mx.nd.random.normal(shape=(1, 80))], label=None, batch_size=1) mod.predict(data_iter) os.remove('test_lstm-symbol.json') os.remove('test_lstm-0000.params')
def test_sequential_mxnet_model_saving_no_compile(): model = Sequential() model.add(Dense(2, input_shape=(3, ))) model.add(RepeatVector(3)) model.add(TimeDistributed(Dense(3))) with pytest.raises(AssertionError): save_mxnet_model(model, prefix='test', epoch=0)
def test_sequential_mxnet_model_not_compiled(): model = Sequential() model.add(Dense(8, input_shape=(32, ))) model.add(Dense(4, input_shape=(8, ))) model_prefix = 'test_dense' with pytest.raises(AssertionError): save_mxnet_model(model, model_prefix, epoch=0)
def test_sequential_mxnet_model_saving(): model = Sequential() model.add(Dense(2, input_shape=(3, ))) model.add(RepeatVector(3)) model.add(TimeDistributed(Dense(3))) model.compile(loss=losses.MSE, optimizer=optimizers.RMSprop(lr=0.0001), metrics=[metrics.categorical_accuracy], sample_weight_mode='temporal') x = np.random.random((1, 3)) y = np.random.random((1, 3, 3)) model.train_on_batch(x, y) data_names, _ = save_mxnet_model(model, prefix='test', epoch=0) # Import with MXNet and try to perform inference import mxnet as mx sym, arg_params, aux_params = mx.model.load_checkpoint(prefix='test', epoch=0) mod = mx.mod.Module(symbol=sym, data_names=data_names, context=mx.cpu(), label_names=None) mod.bind(for_training=False, data_shapes=[(data_names[0], (1, 3))], label_shapes=mod._label_shapes) mod.set_params(arg_params, aux_params, allow_missing=True) data_iter = mx.io.NDArrayIter([mx.nd.random.normal(shape=(1, 3))], label=None, batch_size=1) mod.predict(data_iter) os.remove('test-symbol.json') os.remove('test-0000.params')
def save_model(model, model_dir): prefix = 'mnist_cnn' params_filename = '{}-0000.params'.format(prefix) symbol_filename = '{}-symbol.json'.format(prefix) data_names, data_shapes = save_mxnet_model(model=model, prefix=prefix, epoch=0) shutil.copy(src=str(Path('.', params_filename)), dst=str(Path(model_dir, params_filename))) shutil.copy(src=str(Path('.', symbol_filename)), dst=str(Path(model_dir, symbol_filename)))
def test_sequential_lstm_mxnet_model_saving(): maxlen = 80 model = Sequential() model.add(Embedding(1000, 128, input_length=maxlen)) model.add(LSTM(128, unroll=True)) model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) # Generate data for dummy network X = np.random.random((1000, 80)) Y = np.random.random((1000, 128)) model.fit(X, Y, batch_size=32, nb_epoch=2) model_prefix = 'test_lstm' data_names, data_shapes = save_mxnet_model(model, prefix=model_prefix, epoch=0) # Import with MXNet and try to perform inference import mxnet as mx X_dummy_for_pred = mx.nd.random.normal(shape=(1, 80)) pred_keras = model.predict([X_dummy_for_pred.asnumpy()], batch_size=1) sym, arg_params, aux_params = mx.model.load_checkpoint(model_prefix, epoch=0) mod = mx.mod.Module(symbol=sym, data_names=[data_names[0]], context=mx.cpu(), label_names=None) mod.bind(for_training=False, data_shapes=[(data_names[0], (1, 80))], label_shapes=mod._label_shapes) mod.set_params(arg_params, aux_params, allow_missing=True) data_iter = mx.io.NDArrayIter([X_dummy_for_pred], label=None, batch_size=1) pred_mxnet = mod.predict(data_iter) # Check if predictions made through mxnet and keras model are same assert_allclose(pred_mxnet.asnumpy(), pred_keras, rtol=1e-03) os.remove(model_prefix + "-symbol.json") os.remove(model_prefix + "-0000.params")
def test_sequential_get_mxnet_model_info(): model = Sequential() model.add(Dense(2, input_shape=(3, ))) model.add(RepeatVector(3)) model.add(TimeDistributed(Dense(3))) model.compile(loss=losses.MSE, optimizer=optimizers.RMSprop(lr=0.0001), metrics=[metrics.categorical_accuracy], sample_weight_mode='temporal') x = np.random.random((1, 3)) y = np.random.random((1, 3, 3)) model.train_on_batch(x, y) data_names, data_shapes = K.get_mxnet_model_info(model) data_names_saved_model, data_shapes_saved_model = save_mxnet_model( model, prefix='test', epoch=0) # Only one input assert len(data_names) == 1 # Example data_names = ['/dense_8_input1'] assert data_names[0].startswith('/dense_') # Example data_shape = [DataDesc[/dense_8_input1,(1, 3),float32,NCHW]] assert len(data_shapes) == 1 assert data_shapes[0].name == data_names[0] # In this example, we are passing x as input with shape (1,3) assert data_shapes[0].shape == (1, 3) # Compare with returned values from Save MXNet Model API. They should be the same. assert len(data_names) == len(data_names_saved_model) assert data_names[0] == data_names_saved_model[0] assert len(data_shapes) == len(data_shapes_saved_model) assert data_shapes[0].name == data_shapes_saved_model[0].name assert data_shapes[0].shape == data_shapes_saved_model[0].shape os.remove('test-symbol.json') os.remove('test-0000.params')
def test_sequential_dense_mxnet_model_saving(): model = Sequential() model.add(Dense(8, input_shape=(32, ))) model.add(Dense(4, input_shape=(8, ))) model.compile(loss='mean_squared_error', optimizer='sgd') # Generate data for dummy network X = np.random.random((8, 32)) Y = np.random.random((8, 4)) model.fit(X, Y, batch_size=8, nb_epoch=5) model_prefix = 'test_dense' data_names, data_shapes = save_mxnet_model(model, model_prefix, epoch=1) # Import with MXNet and try to perform inference import mxnet as mx X_dummy_for_pred = mx.nd.random.normal(shape=(4, 32)) pred_keras = model.predict([X_dummy_for_pred.asnumpy()], batch_size=4) sym, arg_params, aux_params = mx.model.load_checkpoint(model_prefix, epoch=1) mod = mx.mod.Module(symbol=sym, data_names=[data_names[0]], context=mx.cpu(), label_names=None) mod.bind(for_training=False, data_shapes=[(data_names[0], (4, 32))], label_shapes=mod._label_shapes) mod.set_params(arg_params, aux_params, allow_missing=True) data_iter = mx.io.NDArrayIter([X_dummy_for_pred], label=None, batch_size=1) pred_mxnet = mod.predict(data_iter) # Check if predictions made through mxnet and keras model are same assert_allclose(pred_mxnet.asnumpy(), pred_keras, rtol=1e-03) os.remove(model_prefix + "-symbol.json") os.remove(model_prefix + "-0001.params")
trainable=False, name="embed")) model.add( Conv1D(filters=128, kernel_size=3, activation='relu', name="conv_1")) model.add(MaxPooling1D(pool_size=5, name="maxpool_1")) model.add(Flatten(name="flat_1")) model.add(Dropout(0.3, name="dropout_1")) model.add(Dense(128, activation='relu', name="dense_1")) model.add(Dense(args.num_classes, activation='softmax', name="out_1")) # compile the model model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc']) model.summary() model.fit(x_train, y_train, batch_size=16, epochs=args.epochs, verbose=2) model.evaluate(x_test, y_test, verbose=2) model_prefix = os.path.join(args.model_dir, 'model') model.save(model_prefix + '.hd5') data_name, data_shapes = save_mxnet_model(model=model, prefix=model_prefix, epoch=0) signature = [{ 'name': data_name[0], 'shape': [dim for dim in data_desc.shape] } for data_desc in data_shapes] with open(os.path.join(args.model_dir, 'model-shapes.json'), 'w') as f: json.dump(signature, f)
model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test)) score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) model_name = 'mnist-cnn-' + str(epochs) model.save(model_path + '/' + model_name + '.hd5') # Keras model print("Saved Keras model") save_mxnet_model(model=model, prefix=model_path + '/' + model_name) # MXNet model print("Saved MXNet model") sys.exit(0) except Exception as e: # Write out an error file. This will be returned as the failureReason in the # DescribeTrainingJob result. trc = traceback.format_exc() with open(os.path.join(output_path, 'failure'), 'w') as s: s.write('Exception during training: ' + str(e) + '\n' + trc) # Printing this causes the exception to be in the training job logs, as well. print('Exception during training: ' + str(e) + '\n' + trc, file=sys.stderr) # A non-zero exit code causes the training job to be marked as Failed. sys.exit(255)
model = Sequential() model.add( Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=input_shape)) model.add(Conv2D(64, (3, 3), activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) model.add(Dropout(0.25)) model.add(Flatten()) model.add(Dense(128, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(num_classes, activation='softmax')) model.compile(loss=keras.losses.categorical_crossentropy, optimizer=keras.optimizers.Adadelta(), metrics=['accuracy']) model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, verbose=1, validation_data=(x_test, y_test)) score = model.evaluate(x_test, y_test, verbose=0) print('Test loss:', score[0]) print('Test accuracy:', score[1]) # Step 2: Save the model in MXNet model format. # data_names and data_shapes are values of the parameters to be used when loading the Model in MXNet. data_names, data_shapes = save_mxnet_model(model=model, prefix='mnist_cnn', epoch=0)
out = new_classification_layer(base_model.layers[-2].output) # create a new network between inp and out model_new = Model(inp, out) model_new.summary() # make all layers untrainable by freezing weights (except for last layer) for layer in model_new.layers[:-1]: layer.trainable = False # ensure the last layer is trainable/not frozen for layer in model_new.layers[-1:]: layer.trainable = True # check to see it is correct: for layer in model_new.layers: print(layer.trainable) model_new.compile(Adam(lr=.0001), loss="categorical_crossentropy", metrics=['accuracy']) model_new.summary() # We train the model, in this case using a low size of epochs, since the model learns the data quite quickly model_new.fit_generator(train_batches, steps_per_epoch=101, validation_data=valid_batches, validation_steps=106, epochs=25, verbose=2) model_new.fit_generator(train_batches, steps_per_epoch=101, validation_data=valid_batches, validation_steps=106, epochs=5, verbose=2) #model_new.save("VGG16signature.h5") data_names, data_shapes = save_mxnet_model(model=model_new, prefix='signature_cnn', epoch=0)