Я довольно новичок в разработке нейронных сетей и пытался создать элементарный классификатор LSTM, но сталкиваюсь с ошибкой: «у логитов и меток должно быть одно и то же первое измерение, они получили форму логитов [125,3] и форму меток [25]».
Я использовал те же функции преобразования данных и формы данных и применил практически идентичную архитектуру нейронной сети к регрессионному LSTM и не сталкивался с этой проблемой. Основным отличием в архитектуре является выход Dense с 1 выходом для модели регрессии.
Вот пример моего кода из предварительной обработки данных и преобразований в архитектуру и подгонку модели.
#scale the input variables
sc = MinMaxScaler(feature_range=(0,1))
#get the data examples
inputs = sc.fit_transform(future[['close', 'bullprice', 'bearprice', 'RSI', 'bullrsi',
'bearrsi', 'bulldiv', 'beardiv', 'com_hedgers',
'bullhedge', 'bearhedge']])
labels = future[['indicator']].values
data = np.concatenate((inputs, labels), axis=1)
data = data[14:] #get rid of first 14 rows because of RSI
#function to convert examples into LSTM input/X (needs to be 3D matrix) and labels (output/Y)
def create_dataset(dataset, look_back): #changed lookback here
dataX, dataY = [], []
for i in range(len(dataset) - look_back - 1):
a = dataset[i:(i + look_back), :-1]
dataX.append(a)
dataY.append(dataset[i + look_back, -1])
return np.array(dataX), np.array(dataY)
look_back = 5 #looking back n days to make a the next days prediction, UNDERSTAND THIS AND EXPLAIN CONCISELY
num_features = 11 #place the number of features that are going in to the model
#apply function to the data
X, Y = create_dataset(data, look_back)
#split into train and test set data
trainX, testX = np.split(X, [int(.7*len(X))])
trainY, testY = np.split(Y, [int(.7*len(Y))])
trainY = trainY+1
testY = testY+1
# one-hot encode the outputs (sell, hold, buy) DOES NOT SEEM TO WORK FOR THE MODEL SO I COMMENTED IT OUT
#onehot_encoder = OneHotEncoder(categories='auto', sparse=False) #'categories=auto' allows the negative categories to work
#trainY = onehot_encoder.fit_transform(trainY.reshape([-1, 1])) #one-hot encoded training set
#testY = onehot_encoder.fit_transform(testY.reshape([-1, 1])) #one-hot encoded test set
'''
Building and fitting the deep learning model
'''
model = tf.keras.Sequential([
tf.keras.layers.LSTM(trainX.shape[0], input_shape=(look_back,num_features), return_sequences=True), #gives 128 units and outputs them to the next layer
tf.keras.layers.Dropout(0.2),
tf.keras.layers.LSTM(128, return_sequences=True),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(3, activation=tf.nn.softmax) #softmax gives us a probability distribution
])
model.compile(optimizer='RMSProp',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
history = model.fit(trainX, trainY, validation_split=0.2, epochs=3, batch_size=25)
#the first dimension of logits shape is a function of the size of the batch_size and look_back
#something is wrong with the shaping of the data
Моя проблема связана с тем, что первая размерность вывода логитов - это продукт, переменная 'look_back' (в первой части кода) и batch_size в подгонке модели. Это все размерность основанная на матрицах - просто не знаю, как определить исправление.
Я ожидаю, что модель будет работать правильно, а затем сможет вывести распределение вероятностей для прогнозов трех классов.
Спасибо за время. Пожалуйста, дайте мне знать, какие разъяснения и дополнительная информация вам может понадобиться.