簡體   English   中英

ValueError: 層“sequential_32”的輸入 0 與層不兼容:預期形狀=(None, 3, 1),發現形狀=(32, 0, 1)

[英]ValueError: Input 0 of layer "sequential_32" is incompatible with the layer: expected shape=(None, 3, 1), found shape=(32, 0, 1)

我收到此錯誤,它告訴我這是預期的 (None, 3, 1),而不是 (32,0,1)。 但我根本無法解決。這是一個股市預測,我將 csv 表更改為一個更小的股市。 如果我在 layer.input 中更改,它會給我“預期 ndim=3,發現 ndim=4”錯誤。 我試着改進更多的層次,我嘗試了很多東西,一旦我在研究它。

from tensorflow.keras.models import Sequential
    from tensorflow.keras.optimizers import Adam
    from tensorflow.keras import layers
    import pandas as pd
    import datetime 
    import matplotlib.pyplot as plt
      numpy as np
     df = pd.read_csv('azul4_treinamento.csv')
     df



    def str_to_datetime(s):
    split = s.split('-')
    year, month, day = int(split[0]), int(split[1]), int(split[2])
    return datetime.datetime(year=year, month=month, day=day)

    datetime_object = str_to_datetime('2019-01-31')
    datetime_object

    datetime.datetime(2019, 1, 31, 0, 0)

    df['Date'] = df['Date'].apply(str_to_datetime)
    df['Date']
    df.index = df.pop('Date')
    df
    plt.plot(df.index, df['Close'])

    def df_to_windowed_df(dataframe, first_date_str, last_date_str, n=3):
    first_date = str_to_datetime(first_date_str)
    last_date  = str_to_datetime(last_date_str)

    target_date = first_date
  
    dates = []
    X, Y = [], []

    last_time = False
    while True:
    df_subset = dataframe.loc[:target_date].tail(n+1)
    
    if len(df_subset) != n+1:
      print(f'Error: Window of size {n} is too large for date {target_date}')
      return

    values = df_subset['Close'].to_numpy()
    x, y = values[:-1], values[-1]

    dates.append(target_date)
    X.append(x)
    Y.append(y)

    next_week = dataframe.loc[target_date:target_date+datetime.timedelta(days=7)]
    next_datetime_str = str(next_week.head(2).tail(1).index.values[0])
    next_date_str = next_datetime_str.split('T')[0]
    year_month_day = next_date_str.split('-')
    year, month, day = year_month_day
    next_date = datetime.datetime(day=int(day), month=int(month), year=int(year))
    
    if last_time:
      break
    
    target_date = next_date

    if target_date == last_date:
      last_time = True
    
  ret_df = pd.DataFrame({})
  ret_df['Target Date'] = dates
  
  X = np.array(X)
  for i in range(0, n):
    X[:, i]
    ret_df[f'Target-{n-i}'] = X[:, i]
  
  ret_df['Target'] = Y

  return ret_df

# Start day second time around: '2021-03-25'
windowed_df = df_to_windowed_df(df, 
                                '2019-01-31', 
                                '2022-02-22', 
                                n=0)
windowed_df


def windowed_df_to_date_X_y(windowed_dataframe):
    df_as_np = windowed_dataframe.to_numpy()
    
    dates = df_as_np[:, 0]
    
    middle_matrix = df_as_np[:, 1:-1]
    X = middle_matrix.reshape((len(dates), middle_matrix.shape[1], 1))
    
    Y = df_as_np [:, -1]
    
    return dates, X.astype(np.float32), Y.astype(np.float32)
dates, X, y = windowed_df_to_date_X_y(windowed_df)

print(dates.shape)
print( X.shape)
print( y.shape)

q_80 = int(len(dates)*.8)
q_90 = int(len(dates)*.9)

dates_train, X_train, y_train = dates[:q_80], X[:q_80], y[:q_80]

dates_val, X_val, y_val = dates[q_80:q_90], X[q_80:q_90], y[q_80:q_90]
dates_test, X_test, y_test = dates[q_90:], X[q_90:], y[q_90:]

plt.plot(dates_train, y_train)
plt.plot(dates_val, y_val)
plt.plot(dates_test, y_test)

plt.legend(['Train', 'Validation', 'Test'])

model = Sequential([layers.Input((3,1)),
                    layers.LSTM(64),
                    layers.Dense(32, activation='relu'),
                    layers.Dense(32, activation='relu'),
                    layers.Dense(1)])
model.compile(loss='mse', 
              optimizer=Adam(learning_rate=0.001),
              metrics=['mean_absolute_error'])
              

    model.fit(X_train, y_train, validation_data=(X_val, y_val), epochs=50 )

請問有什么幫助嗎?

你應該嘗試做這樣的事情:

model = Sequential([layers.Input((X_train[0].shape)),

這樣您的輸入層與您的數據具有相同的形狀

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM