логиты и надписи в Tensorflow - PullRequest
0 голосов
/ 04 июня 2019

Я довольно новичок в разработке нейронных сетей и пытался создать элементарный классификатор 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 в подгонке модели. Это все размерность основанная на матрицах - просто не знаю, как определить исправление.

Я ожидаю, что модель будет работать правильно, а затем сможет вывести распределение вероятностей для прогнозов трех классов.

Спасибо за время. Пожалуйста, дайте мне знать, какие разъяснения и дополнительная информация вам может понадобиться.

...