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

Python UFCNN值错误:检查模型输入时,python,tensorflow,keras,Python,Tensorflow,Keras,Tensorflow 1.0.1 Keras 2.0和Python 3.4 我正在按照lukovkin/UFCNN keras的UFCNN keras/notebook/UFCNN.ipynb(“”)模型和keras函数API教程,使用UFCNN模型进行回归培训。 但一个错误显示“ValueError:检查模型输入时出错:预期输入具有形状(None,64,1),但获得了具有形状(6400,1,1)的数组”。我希望有人能帮我。下面是我的代码: from __future__ import abso

Tensorflow 1.0.1 Keras 2.0和Python 3.4

我正在按照lukovkin/UFCNN keras的UFCNN keras/notebook/UFCNN.ipynb(“”)模型和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)
0/5纪元
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
在()
1表示范围内的i(历元):
2打印('Epoch',i',/',epochs)
---->3 UFCNN_1.fit(cos,预期_输出,verbose=1,epochs=1,shuffle=False,batch_size=batch_size)
4打印(“预测”)
5预测产量=模型。预测(cos,批量大小=批量大小)
/usr/local/lib/python3.4/dist-packages/keras/engine/training.py in-fit(self、x、y、批量大小、历元、冗余、回调、验证拆分、验证数据、无序排列、类权重、样本权重、初始历元、**kwargs)
1403等级重量=等级重量,
1404检查批次轴=假,
->1405批次大小=批次大小)
1406#准备验证数据
1407如果验证数据:
/usr/local/lib/python3.4/dist-packages/keras/engine/training.py标准化用户数据(自身、x、y、样本重量、类别重量、检查批次轴、批次大小)
1293自输入形状,
1294检查批次轴=错误,
->1295异常(前缀为“模型输入”)
1296 y=\u标准化\u输入\u数据(y,自。\u输入\u输出\u名称,
1297个输出_形,
/usr/local/lib/python3.4/dist-packages/keras/engine/training.py输入数据(数据、名称、形状、检查批处理轴、异常前缀)
131'具有形状'+str(形状[i])+
132'但得到了具有形状的数组'+
-->133 str(数组形状))
134返回阵列
135
ValueError:检查模型输入时出错:预期输入具有形状(无,64,1),但获得具有形状(6400,1,1)的数组
谢谢你的帮助,让它工作


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

Theano 1.0.0、keras 2.1.3、Python 2.7.10

输入和输出的形状:根据我对keras和CNN的(但狭窄的)理解,你需要对网络进行形状样本
(n_样本、序列长度、特征)
。这意味着将您的时间序列以一种广播形式扩展到
(6400,1,1)
(6400,64,1)
。您可以通过以下方式执行此操作:

但是,
预期的_输出
也必须具有更高的维度。在
gen\u cosine\u 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\u filter
,而应为
output\u dim

conv_7 = Conv1D(filters=output_dim, kernel_size=filter_length, padding='same')(relu_6)
关注点:尽管经过这些修改,对数据的培训效果相当好,但我认为该模型将深入到时间序列的未来(假设您的信号是一个时间序列,就像卢卡夫金的那样)。也许一个带有
padding=“consular”
膨胀率=x
(x>1)的层会更好。(我还在尝试时间序列预测)

此外,请注意,该模型合并了层通孔,而不是类似于本文中描述的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)
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)