Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有三个特征的LSTM训练,但由于输入形状而无法预测_Python_Tensorflow - Fatal编程技术网

Python 具有三个特征的LSTM训练,但由于输入形状而无法预测

Python 具有三个特征的LSTM训练,但由于输入形状而无法预测,python,tensorflow,Python,Tensorflow,训练一个具有三个特性的LSTM模型,但在预测时,我得到一个matmul错误,看起来预测调用的输入只需要一个特性 matmul:In[0]:[2,3],In[1]:[1101] 这看起来有三个输入,但层只需要1,如果层需要3,就像在训练中一样,那么第二个矩阵将是[3101],matmul将工作 简化代码和数据,错误如下 import tensorflow as tf from sklearn.preprocessing import MinMaxScaler from sklearn.metric

训练一个具有三个特性的LSTM模型,但在预测时,我得到一个matmul错误,看起来预测调用的输入只需要一个特性

matmul:In[0]:[2,3],In[1]:[1101]

这看起来有三个输入,但层只需要1,如果层需要3,就像在训练中一样,那么第二个矩阵将是[3101],matmul将工作

简化代码和数据,错误如下

import tensorflow as tf
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
print(tf.__version__)

lag = 1
epochs = 2
learning_rate = 0.001
dropout = 0.2
feature_count = 3
data_raw = np.array([[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1],[1,1,1]])
dataset = pd.DataFrame(data_raw)
times = pd.date_range('1990-01-01', periods=dataset.shape[0], freq='M')
dataset = dataset.set_index(times)

def MakeLayerLSTMInput(units, input_shape, return_sequences=False):
      return tf.keras.layers.RNN(tf.keras.layers.LSTMCell(units=units, dropout=dropout, input_shape=input_shape), 
      return_sequences=return_sequences)
def MakeLayerLSTM(units, return_sequences=False):
      return tf.keras.layers.RNN(tf.keras.layers.LSTMCell(units=units, dropout=dropout), 
      return_sequences=return_sequences)
def MakeLayerDense(units):
    return tf.keras.layers.Dense(units=units)
def MakeModelStart():
    return tf.keras.models.Sequential()
def MakeOptimizer():
    return tf.train.AdamOptimizer(learning_rate=learning_rate)
def MakeModel():
  model_inputs = (1, feature_count)
  print("model_inputs "+str(model_inputs))
  regressor = MakeModelStart()
  regressor.add(MakeLayerLSTMInput(101, model_inputs))
  regressor.add(MakeLayerDense(1))
  regressor.compile(optimizer = MakeOptimizer(), loss = 'mean_squared_error')
  return regressor

train_dataset = dataset.take(range(10))
test_dataset = dataset.take(range(10,12))
normalize = MinMaxScaler(feature_range = (0, 1))
train_dataset = normalize.fit_transform(train_dataset)
print('train shape: '+str(train_dataset.shape))
x_train = []
y_train = []
for i in range(lag, train_dataset.shape[0]):
  x_train.append(train_dataset[i-lag:i, 0:feature_count])
  y_train.append(train_dataset[i, 0])
x_train, y_train = np.array(x_train), np.array(y_train)
x_train = np.reshape(x_train, (train_dataset.shape[0]-lag, feature_count, 1))
print('normalized x train shape: '+str(x_train.shape))
print('normalized y train shape: '+str(y_train.shape))
regressor = MakeModel()
regressor.fit(x_train, y_train, epochs = epochs, batch_size = x_train.shape[0], verbose=1)

p_count=2
print("last years shape "+str(dataset.shape))
inputs = dataset[len(dataset) - len(test_dataset) - p_count :].values
print("inputs shape "+str(inputs.shape))
inputs = normalize.transform(inputs)
X_test = []
for i in range(p_count, len(inputs)):
    X_test.append(inputs[i-p_count:i, 0:feature_count])
X_test = np.array(X_test)
print("X test shape "+str(X_test.shape))
X_test = np.reshape(X_test, (len(inputs) - p_count, X_test.shape[1], feature_count))
print("X test re-shape "+str(X_test.shape))
predicted = regressor.predict(X_test)
predicted = normalize.inverse_transform(predicted)
print("mse: "+str(mean_squared_error(test_dataset.values, predicted)))
输出:

(p36) D:\src\ml\MLPhase2>python ea-simple1.py
1.13.1
d:\apps\Miniconda3\envs\p36\lib\site-packages\sklearn\preprocessing\data.py:323: DataConversionWarning: Data with input dtype int32 were all converted to float64 by MinMaxScaler.
  return self.partial_fit(X, y)
train shape: (10, 3)
normalized x train shape: (9, 3, 1)
normalized y train shape: (9,)
model_inputs (1, 3)
WARNING:tensorflow:From d:\apps\Miniconda3\envs\p36\lib\site-packages\tensorflow\python\ops\resource_variable_ops.py:435: colocate_with (from tensorflow.python.framework.ops) is deprecated and will be removed in a future version.
Instructions for updating:
Colocations handled automatically by placer.
WARNING:tensorflow:From d:\apps\Miniconda3\envs\p36\lib\site-packages\tensorflow\python\keras\backend.py:4010: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.
Instructions for updating:
Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.
WARNING:tensorflow:From d:\apps\Miniconda3\envs\p36\lib\site-packages\tensorflow\python\keras\utils\losses_utils.py:170: to_float (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.cast instead.
WARNING:tensorflow:From d:\apps\Miniconda3\envs\p36\lib\site-packages\tensorflow\python\ops\math_ops.py:3066: to_int32 (from tensorflow.python.ops.math_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.cast instead.
Epoch 1/2
2019-04-24 13:19:13.920954: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2
2019-04-24 13:19:14.192634: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433] Found device 0 with properties:
name: GeForce RTX 2080 Ti major: 7 minor: 5 memoryClockRate(GHz): 1.635
pciBusID: 0000:42:00.0
totalMemory: 11.00GiB freeMemory: 9.03GiB
2019-04-24 13:19:14.204693: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1512] Adding visible gpu devices: 0
2019-04-24 13:19:14.858476: I tensorflow/core/common_runtime/gpu/gpu_device.cc:984] Device interconnect StreamExecutor with strength 1 edge matrix:
2019-04-24 13:19:14.863341: I tensorflow/core/common_runtime/gpu/gpu_device.cc:990]      0
2019-04-24 13:19:14.866858: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003] 0:   N
2019-04-24 13:19:14.872024: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 8698 MB memory) -> physical GPU (device: 0, name: GeForce RTX 2080 Ti, pci bus id: 0000:42:00.0, compute capability: 7.5)
2019-04-24 13:19:15.863877: I tensorflow/stream_executor/dso_loader.cc:152] successfully opened CUDA library cublas64_100.dll locally
9/9 [==============================] - 2s 261ms/sample - loss: 0.0000e+00
Epoch 2/2
9/9 [==============================] - 0s 1ms/sample - loss: 0.0000e+00
last years shape (12, 3)
inputs shape (4, 3)
X test shape (2, 2, 3)
X test re-shape (2, 2, 3)
Traceback (most recent call last):
  File "ea-simple1.py", line 69, in <module>
    predicted = regressor.predict(X_test)
  File "d:\apps\Miniconda3\envs\p36\lib\site-packages\tensorflow\python\keras\engine\training.py", line 1113, in predict
    self, x, batch_size=batch_size, verbose=verbose, steps=steps)
  File "d:\apps\Miniconda3\envs\p36\lib\site-packages\tensorflow\python\keras\engine\training_arrays.py", line 329, in model_iteration
    batch_outs = f(ins_batch)
  File "d:\apps\Miniconda3\envs\p36\lib\site-packages\tensorflow\python\keras\backend.py", line 3076, in __call__
    run_metadata=self.run_metadata)
  File "d:\apps\Miniconda3\envs\p36\lib\site-packages\tensorflow\python\client\session.py", line 1439, in __call__
    run_metadata_ptr)
  File "d:\apps\Miniconda3\envs\p36\lib\site-packages\tensorflow\python\framework\errors_impl.py", line 528, in __exit__
    c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors_impl.InvalidArgumentError: Matrix size-incompatible: In[0]: [2,3], In[1]: [1,101]
         [[{{node while/MatMul_2}}]]
         [[{{node BiasAdd_4}}]]
(p36)D:\src\ml\MLPhase2>python ea-simple1.py
1.13.1
d:\apps\Miniconda3\envs\p36\lib\site packages\sklearn\preprocessing\data.py:323:DataConversionWarning:输入数据类型为int32的数据均由MinMaxScaler转换为float64。
返回自我部分拟合(X,y)
列车外形:(10,3)
标准化x列形状:(9,3,1)
标准化y列形状:(9,)
模型输入(1,3)
警告:tensorflow:From d:\apps\Miniconda3\envs\p36\lib\site packages\tensorflow\python\ops\resource\u variable\u ops.py:435:colocate\u with(From tensorflow.python.framework.ops)已弃用,将在未来版本中删除。
更新说明:
由placer自动处理Colocations。
警告:tensorflow:From d:\apps\Miniconda3\envs\p36\lib\site packages\tensorflow\python\keras\backend.py:4010:不推荐使用keep\u prob调用dropout(来自tensorflow.python.ops.nn\u ops),并将在将来的版本中删除。
更新说明:
请使用'rate'而不是'keep_prob'。速率应设置为“速率=1-保留概率”。
警告:tensorflow:From d:\apps\Miniconda3\envs\p36\lib\site packages\tensorflow\python\keras\utils\loss\u utils.py:170:to\u float(From tensorflow.python.ops.math\u ops)已弃用,将在未来版本中删除。
更新说明:
改用tf.cast。
警告:tensorflow:From d:\apps\Miniconda3\envs\p36\lib\site packages\tensorflow\python\ops\math_ops.py:3066:to_int32(From tensorflow.python.ops.math_ops)已被弃用,并将在未来版本中删除。
更新说明:
改用tf.cast。
纪元1/2
2019-04-24 13:19:13.920954:I tensorflow/core/platform/cpu_feature_guard.cc:141]您的cpu支持该tensorflow二进制文件未编译为使用的指令:AVX AVX2
2019-04-24 13:19:14.192634:I tensorflow/core/common_runtime/gpu/gpu_device.cc:1433]找到了具有以下属性的设备0:
名称:GeForce RTX 2080 Ti大调:7小调:5内存锁定速率(GHz):1.635
pciBusID:0000:42:00.0
总内存:11.00GiB自由内存:9.03GiB
2019-04-24 13:19:14.204693:I tensorflow/core/common_runtime/gpu/gpu_device.cc:1512]添加可见gpu设备:0
2019-04-24 13:19:14.858476:I tensorflow/core/common_runtime/gpu/gpu_设备。cc:984]设备互连拖缆执行器与强度1边缘矩阵:
2019-04-24 13:19:14.863341:I tensorflow/core/common_runtime/gpu/gpu_device.cc:990]0
2019-04-24 13:19:14.866858:I tensorflow/core/common_runtime/gpu/gpu_device.cc:1003]0:N
2019-04-24 13:19:14.872024:I tensorflow/core/common_runtime/gpu/gpu_device.cc:1115]创建tensorflow设备(/job:localhost/replica:0/task:0/device:gpu:0,内存8698 MB)->物理gpu(设备:0,名称:GeForce RTX 2080 Ti,pci总线id:0000:42:00.0,计算能力:7.5)
2019-04-24 13:19:15.863877:I tensorflow/stream_executor/dso_loader.cc:152]在本地成功打开CUDA库cublas64_100.dll
9/9[====================================]-2s 261ms/样本-损耗:0.0000e+00
纪元2/2
9/9[=================================]-0s 1ms/样本-损耗:0.0000e+00
去年形状(12,3)
输入形状(4,3)
X测试形状(2、2、3)
X试验重新成形(2、2、3)
回溯(最近一次呼叫最后一次):
文件“ea-simple1.py”,第69行,在
预测=回归。预测(X_检验)
文件“d:\apps\Miniconda3\envs\p36\lib\site packages\tensorflow\python\keras\engine\training.py”,第1113行,在predict中
self,x,batch\u size=batch\u size,verbose=verbose,steps=steps)
文件“d:\apps\Miniconda3\envs\p36\lib\site packages\tensorflow\python\keras\engine\training\u arrays.py”,第329行,在模型迭代中
批量输出=f(批量输入)
文件“d:\apps\Miniconda3\envs\p36\lib\site packages\tensorflow\python\keras\backend.py”,第3076行,在调用中__
run\u元数据=self.run\u元数据)
文件“d:\apps\Miniconda3\envs\p36\lib\site packages\tensorflow\python\client\session.py”,第1439行,在调用中__
运行_元数据_ptr)
文件“d:\apps\Miniconda3\envs\p36\lib\site packages\tensorflow\python\framework\errors\u impl.py”,第528行,在退出中__
c_api.TF_GetCode(self.status.status))
tensorflow.python.framework.errors\u impl.InvalidArgumentError:矩阵大小不兼容:在[0]:[2,3],在[1]:[1101]
[{{node while/MatMul_2}}]]
[{{node BiasAdd_4}}]]

问题在于x_train.reforme与x_test.reforme分别作为拟合和预测的输入不匹配。我用(-1,3,1)表示列车输入,用(-1,1,3)表示预测输入。这只是我的错误。还有,如果我将特征计数设置为1,并将其用于数据:data_raw=np.array([1],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1],[1]),那么它工作得很好。当存在多个特征时,问题仍然存在(在[0]:[2,2]中,两个特征的错误相同)。谷歌,有什么想法吗?如果我把MakeOptimizer函数改为:def MakeOptimizer():if str(tf.\uu version\uuuu).startswith('2'):return tf.optimizers.Adam(learning\u rate=learning\u rate)其他:return tf.train.AdamOptimizer(learning\u rate=learning\u rate)我可以同时支持1.13和2.0-alpha0。当我运行该命令时,我在同一预测调用期间收到一条不同的错误消息:…errors\u impl.InvalidArgumentError:从一个具有形状[2,3][{{node rnn/TensorArrayUnstack/TensorListFromTensor}]]的张量中指定了一个具有形状[?,1]的列表[Op:\u推断\u keras\u scratch\u图形\u 4019]