Tensorflow на модели SEIR: почему моя модель не обучена? - PullRequest
1 голос
/ 25 мая 2020

Я пытаюсь написать модель SEIR с помощью тензорного потока и сравнить с существующим кодом R.

У меня нет опыта написания моделей временных рядов с помощью tensorflow, поэтому я просто копирую c свой код ANN / CNN. И я обнаружил, что моя модель вообще не обучена.

Может кто-нибудь объяснить, почему это происходит? Коды прилагаются ниже

data=pd.DataFrame({"Infected":[6098,8759,14184,19714,26879,35240,45071,55674,69660,86570,105363,125415,143444],
              "Removed":[147,303,476,646,869,1140,1700,2209,3175,4134,5344,6896,8045]}).astype(float)



def Fit_SEIR(data,learningRate=1000,max_iter=1000):

days=data.shape[0] ## Number of Rows
data_I=pd.DataFrame(data["Infected"]).to_numpy().reshape(days,1)
data_R=pd.DataFrame(data["Removed"]).to_numpy().reshape(days,1)

# Data for the first day
N_data=np.array([328200000.0]).reshape([1,1])
I_data=np.array([6098.0]).reshape([1,1])
E_data=np.array([6098.0]).reshape([1,1])
R_data=np.array([147.0]).reshape([1,1])
S_data=np.array([328187657.0]).reshape([1,1])

# Whole Dataset
IData=tf.placeholder(tf.float32,shape=[days,1],name="IData")
RData=tf.placeholder(tf.float32,shape=[days,1],name="Rdata")

# Define Parameters to be estimated
beta=tf.Variable(initial_value=3.0)
sigma=tf.Variable(initial_value=1/20)
gamma=tf.Variable(initial_value=1/30)

# Define placeholders for the first day
N=tf.placeholder(tf.float32,shape=[1,1],name="N")
E=tf.placeholder(tf.float32,shape=[1,1],name="E")
I=tf.placeholder(tf.float32,shape=[1,1],name="I")
R=tf.placeholder(tf.float32,shape=[1,1],name="R")
S=tf.placeholder(tf.float32,shape=[1,1],name="S")

## Define placeholders for subsequent days
predicted_S=[]
predicted_E=[]
predicted_I=[]
predicted_R=[]
for i in range(0,days):
    predicted_S.append(tf.placeholder(tf.float32, shape=[1,1],name="Susc"+str(i)))
    predicted_E.append(tf.placeholder(tf.float32, shape=[1,1],name="Expo"+str(i)))
    predicted_I.append(tf.placeholder(tf.float32, shape=[1,1],name="Infe"+str(i)))
    predicted_R.append(tf.placeholder(tf.float32, shape=[1,1],name="Remo"+str(i)))

## Assign value for the first day
predicted_I[0]=I
predicted_R[0]=R
predicted_E[0]=E
predicted_S[0]=S

# Define model structure: Use exponential to avoid negative values. Get predicted Value for subsequent days
for i in range(0,days-1):
    predicted_S[i+1]=-tf.exp(beta)*predicted_S[i]*predicted_I[i]/N
    predicted_E[i+1]=tf.exp(beta)*predicted_S[i]*predicted_I[i]/N-tf.exp(sigma)*predicted_E[i]
    predicted_I[i+1]=tf.exp(sigma)*predicted_E[i]-tf.exp(gamma)*predicted_I[i]
    predicted_R[i+1]=tf.exp(gamma)*predicted_I[i]

# Define cost function: The squared difference between observed and predicted value
predicted_I_reshape=tf.reshape(predicted_I, [days,1])
cost=tf.matmul(tf.transpose(predicted_I_reshape-I_data),predicted_I_reshape-I_data)

#Train the model
trainer=tf.train.GradientDescentOptimizer(learningRate).minimize(cost)
sess = tf.Session()
feed_dict={IData:data_I,RData:data_R,N:N_data,I:I_data,E:E_data,R:R_data,S:S_data}
with sess.as_default():
    init=tf.global_variables_initializer()
    sess.run(init)
    for i in range(10):
        sess.run(trainer,feed_dict=feed_dict)
        print(sess.run([cost],feed_dict=feed_dict))

Вот целевая функция (стоимость) для первых 10 прогонов, как видно ... модель вообще не обучается, так как стоимость не меняется. Кроме того, я подумал, что значение стоимости не изменится, если я добавлю к данным несколько строк. Звучит странно.

Fit_SEIR(data)    
[array([[37185604.]], dtype=float32)]
[array([[37185604.]], dtype=float32)]
[array([[37185604.]], dtype=float32)]
[array([[37185604.]], dtype=float32)]
[array([[37185604.]], dtype=float32)]
[array([[37185604.]], dtype=float32)]
[array([[37185604.]], dtype=float32)]
[array([[37185604.]], dtype=float32)]
[array([[37185604.]], dtype=float32)]
[array([[37185604.]], dtype=float32)]
...