[英]ValueError: Input 0 of layer sequential_32 is incompatible with the layer: : expected min_ndim=3, found ndim=2. Full shape received: [None, 256]
[英]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.