Я пытался делать прогнозы на основе предварительно обученной модели, сохраненной в виде строк json и весов h5 по отдельности, однако, похоже, что другой бэкэнд (Tensorflow и Theano) дал бы мне разные выходные данные, даже если входные данные и модель в точности совпадают.Я обнаружил, что даже на самом первом слое, который является 1D-сверткой, активации разные, вот код для распечатки части активации из 5-го фильтра слоя convolution1D:
Версия Theano:
from keras.models import model_from_json
import numpy as np
import os
os.environ['KERAS_BACKEND'] = 'theano'
model_file = 'model.h5'
x_file = 'x.csv'
model_json = '{"class_name": "Model", "keras_version": "1.2.2", "config": {"layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": [null, 1002, 6], "input_dtype": "float32", "sparse": false, "name": "input_1"}, "inbound_nodes": [], "name": "input_1"}, {"class_name": "Convolution1D", "config": {"batch_input_shape": [null, null, 6], "W_constraint": null, "b_constraint": null, "name": "convolution1d_1", "activity_regularizer": null, "trainable": true, "filter_length": 34, "init": "glorot_uniform", "bias": true, "nb_filter": 128, "input_dtype": "float32", "subsample_length": 1, "border_mode": "valid", "input_dim": 6, "b_regularizer": null, "W_regularizer": null, "activation": "relu", "input_length": null}, "inbound_nodes": [[["input_1", 0, 0]]], "name": "convolution1d_1"}], "input_layers": [["input_1", 0, 0]], "output_layers": [["convolution1d_1", 0, 0]], "name": "model_1"}}'
model = model_from_json(model_json)
model.load_weights(model_file)
x=np.loadtxt(x_file)
x = np.reshape(x,(1,x.shape[0],x.shape[1]))
y = model.predict(x)
y[0,range(230),4]
Вход и выход выглядят следующим образом: Версия Theano
Версия Tensorflow:
from keras.models import model_from_json
import numpy as np
import os
os.environ['KERAS_BACKEND'] = 'tensorflow'
model_file = 'model.h5'
x_file = 'x.csv'
model_json = '{"class_name": "Model", "keras_version": "1.2.2", "config": {"layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": [null, 1002, 6], "input_dtype": "float32", "sparse": false, "name": "input_1"}, "inbound_nodes": [], "name": "input_1"}, {"class_name": "Convolution1D", "config": {"batch_input_shape": [null, null, 6], "W_constraint": null, "b_constraint": null, "name": "convolution1d_1", "activity_regularizer": null, "trainable": true, "filter_length": 34, "init": "glorot_uniform", "bias": true, "nb_filter": 128, "input_dtype": "float32", "subsample_length": 1, "border_mode": "valid", "input_dim": 6, "b_regularizer": null, "W_regularizer": null, "activation": "relu", "input_length": null}, "inbound_nodes": [[["input_1", 0, 0]]], "name": "convolution1d_1"}], "input_layers": [["input_1", 0, 0]], "output_layers": [["convolution1d_1", 0, 0]], "name": "model_1"}}'
model = model_from_json(model_json)
model.load_weights(model_file)
x=np.loadtxt(x_file)
x = np.reshape(x,(1,x.shape[0],x.shape[1]))
y = model.predict(x)
y[0,range(230),4]
Входные и выходные данные выглядят так: Версия Tensorflow
После нескольких экспериментов я обнаружил, что Theano склонны иметь "неправильный" ответ, вот пример для вычисления первого окна5-й фильтр (смещение равно нулю в этой модели, и я проверил это):
l=model.get_layer(index=1)
w1 = l.get_weights()[0]
w2 = l.get_weights()[1]
data1 = w1[:,0,:,4]
data2 = x[0,range(34),:]
ans=0
for i in range(6):
ans += np.sum(np.multiply(data1[:,i],data2[:,i]))
Ans равно 0,08544020017143339 Tensorflow дает 0,08544022, идентично тому, что должно быть из моих расчетов, однако Theano дает 0,0518605.Может ли кто-нибудь придумать объяснение по этому поводу?