首页 文章

UFCNN值错误:检查模型输入时

提问于
浏览
2

Tensorflow 1.0.1 Keras 2.0和Python 3.4

我正在使用UFCNN模型运行回归训练,遵循lukovkin / ufcnn-keras的ufcnn-keras / notebook / UFCNN.ipynb模型(“https://github.com/lukovkin/ufcnn-keras/tree/master/notebook ") and keras funcational API tutorials. But an error shows that " ValueError:检查模型输入时出错:预期输入有形状(无,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)

感谢您的帮助,让它工作!!!!!

BTW:这个模型与lukovkin / ufcnn-keras的模型几乎相同,只是为了更新代码以适应更新版本的keras和tensorflow .

1 回答

  • 2

    Theano 1.0.0,Keras 2.1.3,Python 2.7.10

    Shape of Input and Output: 对于我对keras和CNN的理解,你需要在形状样本上训练网络 (n_samples, sequence_length, features) . 这意味着在rolling window view中扩展您的时间序列,将形状 (6400, 1, 1) 广播到 (6400, 64, 1) . 你这样做是通过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)
    

    Fixing Model Bug: 但请注意,您的代码中还有其他错误 . 图层 conv_7 是您的输出图层 . 其输出/过滤器维度不应为 nb_filter ,而是 output_dim

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

    Concerns: 即使有了这些修改,对数据的训练效果也很好,我想这个模型将会延伸到时间序列的未来(假设你的信号是lukovkin的ufcnn-keras中的时间序列) . 也许Conv1D -layer与 padding="causal"dilation_rate=x (x> 1)会更好 . (我还在尝试时间序列预测)

    此外,请注意,模型通过add合并层,而不是通过concatenate合并层,这类似于Roni Mittelman中描述的UFCNN模型 . The code below doesn't reflect these concerns.

    Putting it all together:

    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)
    

相关问题