Keras LSTM Dtype в MatMul не тот - PullRequest
0 голосов
/ 29 мая 2020

Итак, я кодирую модель LSTM, чтобы найти следующее число в последовательности. Но когда я подхожу к модели, я получаю эту ошибку:

TypeError: Input 'b' of 'MatMul' Op has type float32 that does not match type int64 of argument 'a'.

Я не понимаю этого вопроса, потому что я проверил, и все данные и метки имеют dtype int64.

Вот мой код:

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, LSTM
import random
import numpy as np

def makeData(total, types=5):
    #PATTERNS:
    #1)going up by 1
    #2)going up by 2
    #3)muliply by 3
    #4)multiple by 2
    #5)square number
    NumPer = int(total/types)
    Labels = []
    Data = []
    print(NumPer)
    for type in range(types):
        for i in range(NumPer):
            preData = []
            if type == 0:
                x = random.random()*100
                x = round(x)
                preData.append(x)
                preData.append(x+1)
                preData.append(x+2)
                Labels.append([x+3])
            if type == 1:
                x = random.random()*100
                x = round(x)
                preData.append(x)
                preData.append(x+2)
                preData.append(x+4)
                Labels.append([x+6])
            if type == 2:
                x = random.random()*100
                x = round(x)
                preData.append(x)
                preData.append(x*3)
                preData.append(x*9)
                Labels.append([x*27])
            if type == 3:
                x = random.random()*100
                x = round(x)
                preData.append(x)
                preData.append(x*2)
                preData.append(x*4)
                Labels.append([x*8])
            if type == 4:
                x = random.random()*100
                x = round(x)
                preData.append(x)
                preData.append(x*x)
                preData.append((x*x)*(x*x))
                Labels.append([(x*x)*(x*x)*((x*x)*(x*x))])
        Data.append(preData)
    return np.array(Data), np.array(Labels)

x, y = makeData(5)

def MakeRNN():
    model = Sequential()
    model.add(LSTM(3, activation='tanh'))
    model.add(Dense(9, activation='relu'))
    model.add(LSTM(9, activation='tanh'))
    model.add(Dense(36, activation='relu'))
    model.add(Dense(1, activation='relu'))
    model.compile(optimizer='Adam', loss="mse", metrics=['accuracy'])
    return model
Model = MakeRNN()
print(x.shape)
x = x.reshape(-1,1,3)
print(y[0].dtype)
print(x.shape)
Model.fit(x,y, epochs=20)

print(Model.predict([[1,2,3]]))

Я не понимаю этого, я был бы признателен вам за любую помощь, ребята. Я не слишком много знаю в области кераса.

1 Ответ

1 голос
/ 29 мая 2020

Следующий код работал у меня. Просто внесены некоторые изменения в x, y из makeData, чтобы преобразовать их в числа с плавающей запятой. Кроме того, аргумент, переданный для прогнозирования, должен быть трехмерным (в настоящее время у вас есть 2-й аргумент), и он должен быть плавающим. Также необходимо добавить сначала LSTM return последовательностей = True, потому что после него еще есть LSTM. Кроме того, ваша модель немного странная. Keras ожидает, что входные данные для последовательной модели будут иметь форму (batch_size, timesteps, input_dim). У вас есть timesteps = 1 и, следовательно, на самом деле нет последовательности. Но это отдельный вопрос о том, чем вы хотите заниматься. Что касается запуска кода, указанные выше настройки сработали.

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, LSTM
import random
import numpy as np

def makeData(total, types=5):
    #PATTERNS:
    #1)going up by 1
    #2)going up by 2
    #3)muliply by 3
    #4)multiple by 2
    #5)square number
    NumPer = int(total/types)
    Labels = []
    Data = []
    print(NumPer)
    for type in range(types):
        for i in range(NumPer):
            preData = []
            if type == 0:
                x = random.random()*100
                x = round(x)
                preData.append(x)
                preData.append(x+1)
                preData.append(x+2)
                Labels.append([x+3])
            if type == 1:
                x = random.random()*100
                x = round(x)
                preData.append(x)
                preData.append(x+2)
                preData.append(x+4)
                Labels.append([x+6])
            if type == 2:
                x = random.random()*100
                x = round(x)
                preData.append(x)
                preData.append(x*3)
                preData.append(x*9)
                Labels.append([x*27])
            if type == 3:
                x = random.random()*100
                x = round(x)
                preData.append(x)
                preData.append(x*2)
                preData.append(x*4)
                Labels.append([x*8])
            if type == 4:
                x = random.random()*100
                x = round(x)
                preData.append(x)
                preData.append(x*x)
                preData.append((x*x)*(x*x))
                Labels.append([(x*x)*(x*x)*((x*x)*(x*x))])
        Data.append(preData)
    return np.array(Data), np.array(Labels)

x, y = makeData(5)
x = x.astype(float)
y = y.astype(float)

def MakeRNN():
    model = Sequential()
    model.add(LSTM(3, activation='tanh', return_sequences=True))
    model.add(Dense(9, activation='relu'))
    model.add(LSTM(9, activation='tanh'))
    model.add(Dense(36, activation='relu'))
    model.add(Dense(1, activation='relu'))
    model.compile(optimizer='Adam', loss="mse", metrics=['accuracy'])
    return model
Model = MakeRNN()
print(x.shape)
x = x.reshape(-1,1,3)
print(y[0].dtype)
print(x.shape)
Model.fit(x,y, epochs=20)

print(Model.predict(np.array([[[1.0,2.0,3.0]]])))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...