微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

自定义Keras模型的评估和可视化存在多个问题,可能只是初学者的错误

如何解决自定义Keras模型的评估和可视化存在多个问题,可能只是初学者的错误

对于这些问题的长度和描述,我事先表示歉意。由于缺乏睡眠和经验,我无法很好地展示它,因此,如果您决定对其进行介绍并提出建议,请多谢。

我想训练一个时间卷积网络进行一些多元时间序列预测(一个变量的144个时间步长取决于其他3个变量,每个变量都是自己的csv文件)。

由于接近危险的截止日期,我不得不将tensorflow时间序列预测教程https://www.tensorflow.org/tutorials/structured_data/time_series中的某些代码与在此存储库https://github.com/malteschilling/temporalConvolutionalNetwork中找到的模型结合起来,而不是从头开始创建自己的代码。 我是一个初学者,尽管该模型现在可以以某种方式起作用并且可以接受训练,但是我仍然在评估和结果可视化方面遇到问题。

我粘贴在一起的代码太长了,无法粘贴,因此可以在http://txt.do/1p0uw

中找到

在tf教程中,使用此功能可以编译各种模型

def compile_and_fit(model,window,patience=2):
  early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss',patience=patience,mode='min')

  model.compile(loss=tf.losses.MeanSquaredError(),optimizer=tf.optimizers.Adam(),metrics=[tf.metrics.MeanAbsoluteError()])

  history = model.fit(window.train,epochs=MAX_EPOCHS,validation_data=window.val,callbacks=[early_stopping])
  return history

从教程到设计模型的示例,显示输入和输出形状并调用

conv_model = tf.keras.Sequential([
    tf.keras.layers.Conv1D(filters=32,kernel_size=(CONV_WIDTH,),activation='relu'),tf.keras.layers.Dense(units=32,tf.keras.layers.Dense(units=1),])

print("Conv model on `conv_window`")
print('Input shape:',conv_window.example[0].shape)
print('Output shape:',conv_model(conv_window.example[0]).shape)

history = compile_and_fit(conv_model,conv_window)

IPython.display.clear_output()
val_performance['Conv'] = conv_model.evaluate(conv_window.val)
performance['Conv'] = conv_model.evaluate(conv_window.test,verbose=0)

我不是使用compile_and_fit函数,而是使用TemporalConvolutionalNetwork类中已经存在的函数来编译和拟合模型

def train_model(self,model,val_X=None,epochs=25,patience=5):    
        epochs = self._epochs if epochs is None else epochs
        early_stopping = tf.keras.callbacks.EarlyStopping(monitor='val_loss',mode='min')
        import time
        Now = time.strftime("%d.%m.%y-%H%M%s")
        # Train the network on the training data.
        history = self.model.fit(window.train,epochs=epochs,batch_size=self._batch_size,verbose=1,callbacks=[TensorBoard(log_dir='.\\logdir\\block\\'+Now)] )
        return history

但要保留其余部分:

CONV_WIDTH = 144
conv_window = WindowGenerator(
    input_width=CONV_WIDTH,label_width=144,shift=1,label_columns=['data'])

tcn_model = TemporalConvolutionalNetwork(input_shape=(train_df.shape[0],train_df.shape[1]),output_number=1,kernel_size=9,filter_number=128,padding='causal',regression=True)

history = TemporalConvolutionalNetwork.train_model(tcn_model,train_df,conv_window,epochs=1)
print('Input shape:',history(conv_window.example[0]).shape)

IPython.display.clear_output()
conv_window.plot(tcn_model)
val_performance['Multi step dense'] = history.evaluate(conv_window.val)
performance['Multi step dense'] = history.evaluate(conv_window.test,verbose=1)
print(val_performance)
print(performance)

输入形状是按计划的(32,144,4),但是问题在于输出形状,而不是(144,1)预测,我得到了这个错误

Traceback (most recent call last):
  File "temporalConvolutionalNetwork-master/train_model.py",line 363,in <module>
    print('Output shape:',history(conv_window.example[0]).shape)
TypeError: 'History' object is not callable

如果我完全跳过,我仍然会遇到相同的问题,即conv_window.plot(tcn_model)无法调用

Traceback (most recent call last):
  File "temporalConvolutionalNetwork-master/train_model.py",line 366,in <module>
    conv_window.plot(tcn_model)
  File "temporalConvolutionalNetwork-master/train_model.py",line 241,in plot
    predictions = model(inputs)
TypeError: 'TemporalConvolutionalNetwork' object is not callable

由于打印val_performance ['多步密集']和performance ['多步密集']绝对不显示任何内容,因此字典也不起作用。

  1. 如何在无法调用TemporalConvolutionalNetwork的情况下解决此问题?有没有其他方法可以使评估和.plot函数正常工作?

一个问题是,我希望能够最佳地改变input_width进行预测,以使其保持与我将要寻找最佳变体的接收字段相同的大小。但是当前,该模型仅在Input与输出大小相同时起作用。本教程中已经解决了这个问题,但是我无法理解。当我尝试其他输入大小时抛出的错误

Traceback (most recent call last):
  File "temporalConvolutionalNetwork-master/train_model.py",line 361,in <module>
    history = TemporalConvolutionalNetwork.train_model(tcn_model,epochs=4)
  File "temporalConvolutionalNetwork-master/train_model.py",line 112,in train_model
    callbacks=[TensorBoard(log_dir='.\\logdir\\block\\'+Now)] )
.
.
.
ValueError: Dimensions must be equal,but are 401 and 144 for '{{node mean_squared_error/SquaredDifference}} = 
SquaredDifference[T=DT_FLOAT](functional_1/dense/BiasAdd,IteratorGetNext:1)' with input shapes: [?,401,1],[?,144,1].

2。我想知道如何更改输入大小而又不必更改输出大小?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。