【问题标题】:why I can't set kernel size in 1d convolution?为什么我不能在一维卷积中设置内核大小?
【发布时间】:2018-10-21 05:39:44
【问题描述】:

我使用 keras 构建一维卷积 + LSTM。我尝试像这样image 1D Convoluton 设置内核大小= 5。我有所有 72 个值的数据,并分别用于测试集 6 值。它可以将内核设置为 1。如果我将内核设置为另一个大小,则会显示错误。这是我的data.csv 文件。

这是我的代码。

import pandas as pd
import numpy as np
from keras.layers import LSTM
from keras.layers import Conv1D
from pandas.tseries.offsets import MonthEnd
from sklearn.preprocessing import MinMaxScaler
from keras.models import Sequential
from keras.layers import Dense
import keras.backend as K
from keras.layers import Embedding
from keras.layers import GRU

df = pd.read_csv('D://data.csv',
             engine='python')


df['DATE_'] = pd.to_datetime(df['DATE_']) + MonthEnd(1)
df = df.set_index('DATE_')
df.head()

split_date = pd.Timestamp('03-01-2015')

########## Separate train and test data ##########
train = df.loc[:split_date, ['COLUMN1']]
test = df.loc[split_date:, ['COLUMN1']]

sc = MinMaxScaler()

train_sc = sc.fit_transform(train)
test_sc = sc.transform(test)

X_train = train_sc[:-1]
y_train = train_sc[1:]

X_test = test_sc[:-1]
y_test = test_sc[1:]


###################  Convolution  #######################

X_train_t = X_train[:, None]
X_test_t = X_test[:, None]

K.clear_session()
model = Sequential()

model.add(Conv1D(12, 5, activation='relu', input_shape=(None,1)))
model.add(LSTM(5,return_sequences=True))
model.add(LSTM(3)) 
model.add(Dense(1))

model.compile(loss='mean_squared_error', optimizer='adam' )
model.fit(X_train_t, y_train, epochs=400, batch_size=10, verbose=1)

y_pred = model.predict(X_test_t)

print(y_pred)
print(y_test)

当我运行它时会显示这样的错误。

InvalidArgumentError (see above for traceback): computed output size would be negative

【问题讨论】:

    标签: tensorflow keras deep-learning recurrent-neural-network convolutional-neural-network


    【解决方案1】:

    这一行:

    model.add(Conv1D(12, 5, activation='relu', input_shape=(None,1)))
    

    表示输入的批量大小未知,并且在一个批次中,它的长度为 1,也就是一个数字。 而且您正在尝试对其进行 5 核卷积。如果您使用“相同”填充,这只会产生一个数字的输出(输入数字乘以内核的中间数字),但是使用默认的“有效”填充,这会使输出大小为负数。

    使用input_shape = ( None, 5 ),您将得到一个数字(每个过滤器)作为输出,如果您只有 1 个数字,理论上会使大小 -4 但那没有实际意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 2013-09-29
      • 1970-01-01
      • 1970-01-01
      • 2014-03-08
      • 2022-09-29
      • 2019-03-30
      相关资源
      最近更新 更多