LSTM神经网络输入/输出尺寸错误

时间:2019-01-11 01:14:25

标签: python tensorflow machine-learning neural-network lstm

我对TensorFlow和LSTM架构还很陌生。我在为数据集计算输入和输出(x_train,x_test,y_train,y_test)时遇到问题。

我最初输入的形状:

  • X_train:(366,4)
  • X_test:(104,4)
  • Y_train:(366,)
  • Y_test:(104,)

Ytrain和Ytest是一系列股票价格。 Xtrain和Xtest是我要学习用来预测股价的四个功能。

# Splitting the training and testing data

train_start_date = '2010-01-08'
train_end_date = '2017-01-06'
test_start_date = '2017-01-13'
test_end_date = '2019-01-04'

train = df.ix[train_start_date : train_end_date]
test = df.ix[test_start_date:test_end_date]


X_test = sentimentScorer(test)
X_train = sentimentScorer(train)

Y_test = test['prices'] 
Y_train = train['prices']

#Conversion in 3D array for LSTM INPUT

X_test = X_test.reshape(1, 104, 4)
X_train = X_train.reshape(1, 366, 4)





model = Sequential()

model.add(LSTM(128, input_shape=(366,4), activation='relu', 
return_sequences=True))
model.add(Dropout(0.2))

model.add(LSTM(128, activation='relu'))
model.add(Dropout(0.1))

model.add(Dense(32, activation='relu'))
model.add(Dropout(0.2))

model.add(Dense(10, activation='softmax'))

opt = tf.keras.optimizers.Adam(lr=0.001, decay=1e-6)

# Compile model
model.compile(
    loss='sparse_categorical_crossentropy',
    optimizer=opt,
    metrics=['accuracy'],
)

model.fit(X_train,
          Y_train,
          epochs=3,
          validation_data=(X_test, Y_test))

这是生成的错误:

  

-------------------------------------------------- ---------------------------- ValueError Traceback(最近的呼叫   最后)        65 Y_train,        66个时代= 3,   ---> 67validation_data =(X_test,Y_test))

     

c:\ users \ talal \ appdata \ local \ programs \ python \ python36 \ lib \ site-packages \ tensorflow \ python \ keras \ engine \ training.py   适合(自我,x,y,batch_size,时代,冗长,回调,   validate_split,validation_data,随机播放,class_weight,   sample_weight,initial_epoch,steps_per_epoch,validation_steps,   ** kwargs)1507 steps_name ='steps_per_epoch',1508 steps = steps_per_epoch,   -> 1509validation_split = validation_split)1510 1511#准备验证数据。

     

c:\ users \ talal \ appdata \ local \ programs \ python \ python36 \ lib \ site-packages \ tensorflow \ python \ keras \ engine \ training.py   在_standardize_user_data(self,x,y,sample_weight,class_weight,   batch_size,check_steps,steps_name,steps,validation_split)       991 x,y = next_element       992 x,y,sample_weights = self._standardize_weights(x,y,sample_weight,   -> 993 class_weight,batch_size)       994返回x,y,sample_weights       995

     

c:\ users \ talal \ appdata \ local \ programs \ python \ python36 \ lib \ site-packages \ tensorflow \ python \ keras \ engine \ training.py   在_standardize_weights(self,x,y,sample_weight,class_weight,   batch_size)1110 feed_input_shapes,1111
  check_batch_axis = False,#不强制执行批量大小。   -> 1112 exception_prefix ='input')1113 1114如果y不为None:

     

c:\ users \ talal \ appdata \ local \ programs \ python \ python36 \ lib \ site-packages \ tensorflow \ python \ keras \ engine \ training_utils.py   在standardize_input_data(数据,名称,形状,check_batch_axis,   exception_prefix)       314':预期的'+名称[i] +'具有'+       315 str(len(shape))+'尺寸,但得到数组'   -> 316'具有形状'+ str(data_shape))       317(如果不是check_batch_axis):       318 data_shape = data_shape [1:]

     

ValueError:检查输入时出错:预期lstm_18_input具有   3个维度,但数组的形状为(366,4)

3 个答案:

答案 0 :(得分:2)

您的尺寸对于X_train是错误的。LSTM仅接受3维输入。您说您有4个功能。假设366是您对一个样本的时间戳数,则您的输入应为(num_samples,366,4)形状 欢呼:-)

答案 1 :(得分:1)

您的代码几乎没问题。

您的y_trainmodel.add(LSTM(128, input_shape=(None,4), activation='relu', return_sequences=True)) 应该是一个元素或形状为(1,1)的数组,没关系。

您的输入形状错误,但第一个LSTM应该是:

None

注意keras.preprocessing.sequence.pad_sequences,由于测试序列和训练序列的长度不同,因此无法指定长度(Keras接受未指定的第一维)。错误是由于长度分别为366和104。如果要对RNN使用批处理,则应使用input_shape进行零填充。

无需批量指定mean squared error,网络的其余部分应该没问题。

如果执行回归而不是分类(可能是这种情况),则应执行@Ankish Bansal编写的最后两个步骤,例如将损耗更改为complete,并使最后一层输出1值而不是10。

答案 2 :(得分:1)

  1. LSTM期望将dims输入为(num_examples,seq_length,input_dims),因此输入中存在一个错误。

  2. 您要预测维度1的输出,模型输出为10。

    model.add(Dense(1, activation='linear'))

  3. 此外,您正在预测价格,那就是回归问题。但是,您正在使用分类设置。试试这个

    model.compile(loss='mse', optimizer='adam', metrics=['mean_squared_error'])