【问题标题】:UFCNN Value Error: when checking model inputUFCNN 值错误:检查模型输入时
【发布时间】:2017-03-27 07:08:00
【问题描述】:

Tensorflow 1.0.1 Keras 2.0 和 Python 3.4

我正在按照 lukovkin/ufcnn-keras 的 ufcnn-keras/notebook/UFCNN.ipynb ("https://github.com/lukovkin/ufcnn-keras/tree/master/notebook") 模型和 keras 功能 API 教程使用 UFCNN 模型进行回归训练。 但错误显示“ValueError:检查模型输入时出错:预期输入具有形状 (None, 64, 1) 但得到的数组具有形状 (6400, 1, 1)”。我希望有人可以帮助我。下面是我的代码:

from __future__ import absolute_import
from __future__ import print_function
import numpy as np
import keras 
from keras.models import Model
from keras.models import Sequential
from keras.layers import Input, merge
from keras.layers.core import Activation
from keras.layers.convolutional import Conv1D
import matplotlib.pyplot as plt
from keras.preprocessing import sequence

## UFCNN function
def ufcnn_regression_model(sequence_length=5000,
                           features=1,
                           nb_filter=150,
                           filter_length=5,
                           output_dim=1,
                           optimizer='adagrad',
                           loss='mse'):
    inputs = Input(shape=(sequence_length, features), name = 'input')

    #########################################################
    conv_1 = Conv1D(filters=nb_filter, kernel_size=filter_length, padding='same')(inputs)
    relu_1 = Activation('relu')(conv_1)
    #########################################################
    conv_2 = Conv1D(filters=nb_filter, kernel_size=filter_length, padding='same')(relu_1)
    relu_2 = Activation('relu')(conv_2)
    #########################################################
    conv_3 = Conv1D(filters=nb_filter, kernel_size=filter_length, padding='same')(relu_2)
    relu_3 = Activation('relu')(conv_3)
    #########################################################
    conv_4 = Conv1D(filters=nb_filter, kernel_size=filter_length, padding='same')(relu_3)
    relu_4 = Activation('relu')(conv_4)
    #########################################################
    merge_1 = keras.layers.add([relu_2, relu_4])
    conv_5 =Conv1D(filters=nb_filter, kernel_size=filter_length, padding='same')(merge_1)
    relu_5 = Activation('relu')(conv_5)
    #########################################################
    merge_2 = keras.layers.add([relu_1, relu_5])
    conv_6 = Conv1D(filters=nb_filter, kernel_size=filter_length, padding='same')(merge_2)
    relu_6 = Activation('relu')(conv_6)
    #########################################################
    conv_7 = Conv1D(filters=nb_filter, kernel_size=filter_length, padding='same')(relu_6)
    #########################################################
    model = Model(inputs = inputs, outputs = conv_7)
    model.compile(optimizer=optimizer, loss=loss)    
    print(model.summary())
    return model

## Input & Output function
def gen_cosine_amp(amp=100, period=25, x0=0, xn=500, step=1, k=0.0001):
    cos = np.zeros(((xn - x0) * step,  1, 1))
    print("Cos. Shape",cos.shape)
    for i in range(len(cos)):
        idx = x0 + i * step
        cos[i, 0, 0] = amp * np.cos(idx / (2 * np.pi * period))
        cos[i, 0, 0] = cos[i, 0, 0] * np.exp(-k * idx)

    lahead = 1
    expected_output = np.zeros((len(cos), 1))
    for i in range(len(cos) - lahead):
        expected_output[i, 0] = np.mean(cos[i + 1:i + lahead + 1])
    return cos, expected_output

##  Parameter
sequence_length = 64  
features = 1               
nb_filter = 150             
filter_length = 5            
output_dim = 1              
epochs = 5
batch_size = 128

##  UFCNN_1 model summary
UFCNN_1 = ufcnn_regression_model(sequence_length=sequence_length)

## Inputs and ouputs to be trained
cos = gen_cosine_amp(xn = sequence_length * 100)[0]
expected_output =  gen_cosine_amp(xn = sequence_length * 100)[1]

## Trainning
for i in range(epochs):
    print('Epoch', i, '/', epochs)
    UFCNN_1.fit(cos, expected_output, verbose=1,epochs=1,shuffle=False, batch_size=batch_size)
    print('Predicting')

## Predicting
predicted_output = model.predict(cos, batch_size=batch_size)

我的错误是:

Epoch 0 / 5

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-8-d49a856b74bd> in <module>()
      1 for i in range(epochs):
      2     print('Epoch', i, '/', epochs)
----> 3     UFCNN_1.fit(cos, expected_output, verbose=1,epochs=1,shuffle=False, batch_size=batch_size)
      4     print('Predicting')
      5 predicted_output = model.predict(cos, batch_size=batch_size)

/usr/local/lib/python3.4/dist-packages/keras/engine/training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, **kwargs)
   1403             class_weight=class_weight,
   1404             check_batch_axis=False,
-> 1405             batch_size=batch_size)
   1406         # prepare validation data
   1407         if validation_data:

/usr/local/lib/python3.4/dist-packages/keras/engine/training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_batch_axis, batch_size)
   1293                                     self._feed_input_shapes,
   1294                                     check_batch_axis=False,
-> 1295                                     exception_prefix='model input')
   1296         y = _standardize_input_data(y, self._feed_output_names,
   1297                                     output_shapes,

/usr/local/lib/python3.4/dist-packages/keras/engine/training.py in _standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    131                             ' to have shape ' + str(shapes[i]) +
    132                             ' but got array with shape ' +
--> 133                             str(array.shape))
    134     return arrays
    135 

ValueError: Error when checking model input: expected input to have shape (None, 64, 1) but got array with shape (6400, 1, 1)

感谢您的帮助!!!!

顺便说一句:这个模型与 lukovkin/ufcnn-keras 的模型几乎相同,只是更新了代码以适应更新版本的 keras 和 tensorflow。

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    Theano 1.0.0、Keras 2.1.3、Python 2.7.10

    输入和输出的形状:根据我对 keras 和 CNN 的(但狭隘的)理解,您需要在形状为 (n_samples, sequence_length, features) 的样本上训练网络。这意味着以rolling window view 扩展您的时间序列,将(6400, 1, 1) 广播形状@ 987654330@。你可以通过as_strided

    ## reshape data
    cos_view = np.lib.stride_tricks.as_strided(
        cos,
        shape=[cos.shape[0] - sequence_length, sequence_length, 1],
        strides=cos.strides
    )
    expected_output_view = np.lib.stride_tricks.as_strided(
        expected_output,
        shape=[expected_output.shape[0] - sequence_length, sequence_length, 1],
        strides=expected_output.strides
    )
    

    但是expected_output 也必须具有更高的维度。在gen_cosine_amp:

    def gen_cosine_amp(amp=100, period=25, x0=0, xn=500, step=1, k=0.0001):
        ...
        expected_output = np.zeros((len(cos), 1, 1))
        for i in range(len(cos) - lahead):
            expected_output[i, 0, 0] = np.mean(cos[i + 1:i + lahead + 1])
    

    现在可以在这些广播视图上训练您的模型:

    UFCNN_1.fit(cos_view, expected_output_view, verbose=1,epochs=1,shuffle=False, batch_size=batch_size)
    

    修复模型错误:但请注意,您的代码中还有另一个错误。 conv_7 层是您的输出层。它的输出/过滤器维度不应该是nb_filter,而是output_dim

    conv_7 = Conv1D(filters=output_dim, kernel_size=filter_length, padding='same')(relu_6)
    

    关注点:尽管通过这些修改对数据进行训练效果很好,但我想这个模型会在时间序列的未来出现问题(假设你的信号是一个时间序列,就像 lukovkin 的ufcnn-keras)。也许带有padding="causal"dilation_rate=x (x > 1) 的Conv1D 层会更好。 (我还在用时间序列预测试验自己)

    此外,请注意模型通过add 合并层,而不是通过concatenate,这类似于Roni Mittelman 的论文中描述的 UFCNN 模型。 下面的代码没有反映这些问题。

    把它们放在一起:

    from __future__ import absolute_import
    from __future__ import print_function
    import numpy as np
    import keras
    from keras.models import Model
    from keras.models import Sequential
    from keras.layers import Input, merge
    from keras.layers.core import Activation
    from keras.layers.convolutional import Conv1D
    import matplotlib.pyplot as plt
    from keras.preprocessing import sequence
    
    def ufcnn_regression_model(sequence_length=5000,
                               features=1,
                               nb_filter=150,
                               filter_length=5,
                               output_dim=1,
                               optimizer='adagrad',
                               loss='mse'):
        inputs = Input(shape=(sequence_length, features), name = 'input')
    
        #########################################################
        conv_1 = Conv1D(filters=nb_filter, kernel_size=filter_length, padding='same')(inputs)
        relu_1 = Activation('relu')(conv_1)
        #########################################################
        conv_2 = Conv1D(filters=nb_filter, kernel_size=filter_length, padding='same')(relu_1)
        relu_2 = Activation('relu')(conv_2)
        #########################################################
        conv_3 = Conv1D(filters=nb_filter, kernel_size=filter_length, padding='same')(relu_2)
        relu_3 = Activation('relu')(conv_3)
        #########################################################
        conv_4 = Conv1D(filters=nb_filter, kernel_size=filter_length, padding='same')(relu_3)
        relu_4 = Activation('relu')(conv_4)
        #########################################################
        merge_1 = keras.layers.add([relu_2, relu_4])
        conv_5 =Conv1D(filters=nb_filter, kernel_size=filter_length, padding='same')(merge_1)
        relu_5 = Activation('relu')(conv_5)
        #########################################################
        merge_2 = keras.layers.add([relu_1, relu_5])
        conv_6 = Conv1D(filters=nb_filter, kernel_size=filter_length, padding='same')(merge_2)
        relu_6 = Activation('relu')(conv_6)
        #########################################################
        conv_7 = Conv1D(filters=output_dim, kernel_size=filter_length, padding='same')(relu_6)
        #########################################################
        model = Model(inputs = inputs, outputs = conv_7)
        model.compile(optimizer=optimizer, loss=loss)
        print(model.summary())
        return model
    
    ## Input & Output function
    def gen_cosine_amp(amp=100, period=25, x0=0, xn=500, step=1, k=0.0001):
        cos = np.zeros(((xn - x0) * step,  1, 1))
        print("Cos. Shape",cos.shape)
        for i in range(len(cos)):
            idx = x0 + i * step
            cos[i, 0, 0] = amp * np.cos(idx / (2 * np.pi * period))
            cos[i, 0, 0] = cos[i, 0, 0] * np.exp(-k * idx)
    
        lahead = 1
        expected_output = np.zeros((len(cos), 1, 1))
        for i in range(len(cos) - lahead):
            expected_output[i, 0, 0] = np.mean(cos[i + 1:i + lahead + 1])
        return cos, expected_output
    
    ##  Parameter
    sequence_length = 64
    features = 1
    nb_filter = 150
    filter_length = 5
    output_dim = 1
    epochs = 5
    batch_size = 128
    
    ##  UFCNN_1 model summary
    UFCNN_1 = ufcnn_regression_model(sequence_length=sequence_length, nb_filter=nb_filter)
    
    ## Inputs and ouputs to be trained
    cos, expected_output = gen_cosine_amp(xn = sequence_length * 100)
    
    ## reshape data
    cos_view = np.lib.stride_tricks.as_strided(
        cos,
        shape=[cos.shape[0] - sequence_length, sequence_length, 1],
        strides=cos.strides
    )
    expected_output_view = np.lib.stride_tricks.as_strided(
        expected_output,
        shape=[expected_output.shape[0] - sequence_length, sequence_length, 1],
        strides=expected_output.strides
    )
    
    print("Cos. Shape Input ",cos_view.shape)
    ## Trainning
    for i in range(epochs):
        print('Epoch', i, '/', epochs)
        UFCNN_1.fit(cos_view, expected_output_view, verbose=1,epochs=1,shuffle=False, batch_size=batch_size)    
    
    print('Predicting')
    predicted_output = UFCNN_1.predict(cos_view, batch_size=batch_size)
    rmse = np.sqrt(((predicted_output - cos_view) ** 2).mean(axis=None))
    print ("RMSE ", rmse)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-07
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 2017-06-10
      • 2012-09-08
      • 2011-11-04
      • 1970-01-01
      相关资源
      最近更新 更多