TypeError:“等于”运算符的输入“ y”的类型为float32,与参数“ x”的int32类型不匹配

时间:2019-03-23 16:32:47

标签: python numpy tensorflow keras lstm

我对Keras和LSTM非常陌生。我一直在尝试用下面的代码训练序列模型来预测股票的未来价格,但是上面的错误不断出现。

我尝试使用.astype(np.float16)更改x_data和y_data的dtype。但是,每次返回TypeError都表明我具有float32类型。

如果有帮助,这是我的数据形状:

  

xtrain.shape:(32,24,67),ytrain.shape:(32,24,1),xtest.shape   :(38,67),ytest.shape:(38,1)

有人对可能出什么问题有任何想法吗?我已经坚持了一段时间。有人可以给我提示会很好。

y_data = y_data.to_numpy().astype(np.float32)
x_data = main_df.to_numpy().astype(np.float32)

num_x_signals = x_data.shape[1]
num_y_signals = y_data.shape[1]

# SPLIT TRAIN TEST DATA
ratio = 0.85
train_ratio = int(ratio * len(x_data))

x_train = x_data[0:train_ratio]
x_test = x_data[train_ratio:]

y_train = y_data[0:train_ratio]
y_test = y_data[train_ratio:]

# GENERATE RANDOM SEQUENCES
batch_size = 32
sequence_length = 24
EPOCHS = 50

def batch_generator(x_train, y_train, batch_size, sequence_length, num_x_signals, num_y_signals, num_train):
    while True:
        x_shape = (batch_size, sequence_length, num_x_signals)
        x_batch = np.zeros(shape = x_shape).astype(np.float32)

        y_shape = (batch_size, sequence_length, num_y_signals)
        y_batch = np.zeros(shape = y_shape).astype(np.float32)

        for i in range(batch_size):
            idx = np.random.randint(num_train - sequence_length)

            x_batch[i] = x_train[idx:idx+sequence_length]
            y_batch[i] = y_train[idx:idx+sequence_length]

        yield (x_batch, y_batch)

generator = batch_generator(x_train, y_train, batch_size, sequence_length, num_x_signals, num_y_signals, train_ratio)
xtrain, ytrain = next(generator)
xtest, ytest = (np.expand_dims(x_test, axis=0),
                np.expand_dims(y_test, axis=0))

# LSTM MODEL
model = Sequential()
model.add(LSTM(32, input_shape = (None, num_x_signals,), return_sequences = True))
model.add(Dropout(0.2))
model.add(BatchNormalization())

model.add(LSTM(128, return_sequences = True))
model.add(Dropout(0.15))
model.add(BatchNormalization())

model.add(LSTM(128))
model.add(Dropout(0.18))
model.add(BatchNormalization())

model.add(Dense(32, activation = 'relu'))
model.add(Dropout(0.2))

model.add(Dense(1, activation = 'softmax'))

opt = tf.keras.optimizers.Adam(lr = 0.001, decay = 1e-6)

model.compile(
    loss = 'sparse_categorical_crossentropy',
    optimizer = opt,
    metrics = ['accuracy']
)

name_of_file = f"{to_predict}-{sequence_length}-{future_predict}-{int(time.time())}"
tensorboard = TensorBoard(log_dir = "logs/{}".format(name_of_file))

filepath = "LSTM_Final-{epoch:02d}-{val_acc:.3f}"
checkpoint = ModelCheckpoint("models/{}.model".format(filepath, monitor = 'val_acc', verbose = 1, save_best_only = True, mode = 'max')) # saves only the best ones

history = model.fit(
    xtrain, ytrain,
    epochs = EPOCHS,
    validation_data = (xtest, ytest),
    callbacks = [tensorboard, checkpoint]
)

score = model.evaluate(xtest, ytest, verbose = 0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

model.save("models/{}".format(name_of_file))

1 个答案:

答案 0 :(得分:0)

我发现此问题与指定的损失函数有关。

我的代码:

import tensorflow as tf
from tensorflow import keras

model = tf.keras.Sequential([
    keras.layers.Dense(64, activation=tf.nn.relu, input_shape=[3]),
    keras.layers.Dense(64, activation=tf.nn.relu),
    keras.layers.Dense(1)
])

#I changed the loss function from 'sparse_categorical_crossentropy' to 'mean_squared error'
model.compile(optimizer='adam',loss='mean_squared_error',metrics=['accuracy'])

X = train_dataset.to_numpy()
y = train_labels.to_numpy()
model.fit(X,y, epochs=5)

X形状为(920,3),dtype = float64

y的形状为(920,1),dtype = float64

我的问题是在model.fit方法中。我从一个图像识别示例中获取了“ sparse_categorical_crossentropy”函数,而我在这里尝试的是用于房价预测的神经网络。