更新:正如rvinas 所指出的,我忘记input在Model. 现在修复了,它的工作原理。所以 ConditionalRNN 可以很容易地用来做我想做的事。
我想将时间序列与扩展 LSTM 单元中的非时间序列特征一起处理(这里也讨论了这一要求)。Python 中Tensorflow 的 ConditionalRNN (cond-rnn)似乎允许这样做。
可以在 Keras Functional API 中使用吗(无需急切执行)?也就是说,有没有人知道如何解决我下面失败的方法,或者有一个不同的例子,其中 ConditionalRNN(或替代方案)用于在 LSTM 样式的单元格或任何等效单元中轻松组合 TS 和非 TS 数据?
我在Pilippe Remy 的 ConditionalRNN github 页面上看到了Eager execution-bare tf 示例,但我没有设法将它扩展到 Keras Functional API 中易于安装的版本。
我的代码如下所示;如果我使用标准 LSTM 单元而不是 ConditionalRNN(并相应地调整模型“x”输入),则它会起作用。使用 ConditionalRNN,我没有让它执行;must feed a value for placeholder tensor 'in_aux'尽管尝试注意数据维度兼容性,但我在更改代码时收到了错误(参见下文),或者收到了一些不同类型的输入大小投诉。
(在 Ubuntu 16.04 上使用 Python 3.6、Tensorflow 2.1、cond-rnn 2.1)
import numpy as np
from tensorflow.keras.models import Model …Run Code Online (Sandbox Code Playgroud) 错误值错误:在转换后的代码中:
<ipython-input-63-1e3afece3370>:10 train_step *
loss += loss_func(targ, logits)
<ipython-input-43-44b2a8f6794e>:11 loss_func *
loss_ = loss_object(real, pred)
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/losses.py:124 __call__
losses = self.call(y_true, y_pred)
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/losses.py:216 call
return self.fn(y_true, y_pred, **self._fn_kwargs)
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/losses.py:973 sparse_categorical_crossentropy
y_true, y_pred, from_logits=from_logits, axis=axis)
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/keras/backend.py:4431 sparse_categorical_crossentropy
labels=target, logits=output)
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/nn_ops.py:3477 sparse_softmax_cross_entropy_with_logits_v2
labels=labels, logits=logits, name=name)
/usr/local/lib/python3.6/dist-packages/tensorflow_core/python/ops/nn_ops.py:3393 sparse_softmax_cross_entropy_with_logits
logits.get_shape()))
ValueError: Shape mismatch: The shape of labels (received (128,)) should equal the shape of logits except for the last dimension (received (16, 424)).
Run Code Online (Sandbox Code Playgroud)
我参考的代码使用了 legacyseq2seq.sequence_loss_by_example,现在已弃用。所以我试过 SparseCategoricalCrossentropy 损失方法抛出同样的错误
模型(Keras)
def build_model(training=True):
input_ = tf.keras.layers.Input(shape=(unfold_max,), name='inputs')
embedding …Run Code Online (Sandbox Code Playgroud) 我正在尝试理解 tensorflow keras 中层的连接。下面我画了我认为是 2 个 RNN 层的串联 [为图片清晰度而备] 和输出
在这里,我试图连接两个 RNN 层。一层具有某个时间序列中患者的纵向数据[整数值],另一层具有具有分类输入的其他时间序列的相同患者的详细信息。
我不希望这两个不同的时间序列混淆,因为它是医疗数据。所以我正在尝试这个。但在此之前,我想确定我绘制的是否是连接两层的含义。下面是我的代码。它似乎运行良好,但我想确认我绘制的内容和实施的内容是否正确。
#create simpleRNN with one sequence of input
first_input = Input(shape=(4, 7),dtype='float32')
simpleRNN1 = layers.SimpleRNN(units=25,bias_initializer= initializers.RandomNormal(stddev=0.0001),
activation="relu",kernel_initializer= "random_uniform")(first_input)
#another layer of RNN
second_input = Input(shape=(16,1),dtype='float32')
simpleRNN2 = layers.SimpleRNN(units=25,bias_initializer= initializers.RandomNormal(stddev=0.0001),
activation="relu",kernel_initializer= "random_uniform")(second_input)
#concatenate two layers,stack dense layer on top
concat_lay = tf.keras.layers.Concatenate()([simpleRNN1, simpleRNN2])
dens_lay = layers.Dense(64, activation='relu')(concat_lay)
dens_lay = layers.Dense(32, activation='relu')(dens_lay)
dens_lay = layers.Dense(1, activation='sigmoid')(dens_lay)
model = tf.keras.Model(inputs=[first_input, second_input], outputs= [dens_lay])
model.compile(loss='binary_crossentropy', optimizer='adam',metrics=["accuracy"],lr=0.001)
model.summary()
Run Code Online (Sandbox Code Playgroud) python machine-learning keras tensorflow recurrent-neural-network
我对在 Pytorch 中使用 LSTM 很陌生,我正在尝试创建一个模型,该模型获得一个大小为 42 的张量和一个 62 的序列。(所以每个 62 张量 a 大小为 42)。这意味着我在一个序列中有 62 个张量。每个张量的大小为 42。(形状为 [62,42]。调用此输入张量。
我想用这个来预测一个 1 的张量,序列为 8(所以大小为 1 张量和 8 个序列)。这意味着在大小为 1 的序列中有 8 个张量。称这个标签张量。
这些张量之间的连接是这样的:输入张量由列组成:A1 A2 A3 ...... A42 而标签张量如果更像:A3
我想展示的是,如果需要,标签张量可以在所有地方用零填充,而不是 A3 的值,因此它可以达到 42 的长度。
我怎样才能做到这一点?因为从我从 Pytorch 文档中阅读的内容来看,我只能以相同的比率进行预测(1 点预测为 1),而我想从 42 的张量中进行预测,序列为 62,张量为 1,序列为 8。是可行吗?我是否需要将预测的张量从 1 填充到大小为 42?谢谢!
例如,一个好的解决方案是使用 seq2seq
新tf.keras.preprocessing.timeseries_dataset_from_array函数用于在顺序数据上创建滑动小批量窗口,例如涉及 rnn 网络的任务。
根据文档,它返回一小批输入和目标。但是,此函数返回的目标小批量没有sequence_length(时间步长)维度。例如。
data = timeseries_dataset_from_array(
data=tokens,
targets=targets,
sequence_length=25,
batch_size=32,
)
for minbatch in data:
inputs, targets = minbatch
assert(inputs.shape[1] == targets.shape[1]) # error
Run Code Online (Sandbox Code Playgroud)
该inputs具有[32, 25, 1]形状的情况下,你已经只是有词索引存在和targets容易混淆的具有[32, 1]形状。
所以,我的问题是我应该如何将具有 25 个单位的窗口的输入张量映射到具有 0 个单位的窗口的目标张量?
我总是训练序列模型的方法是将输入张量输入[32, 25, 1],然后将其投影到[32, 25, 100],然后将目标张量输入到大小[32, 25, 1]为损失函数的网络,或者如果您有多类问题,则目标向量为[32, 25, num_of_classes]。
这就是为什么我对来自目标张量的形状及其timeseries_dataset_from_array背后的直觉感到困惑。
我使用 anaconda 提示符创建了环境,conda create -n talkingbot python=3.5然后安装pip install tensorflow==1.0.0(遵循与一个 udemy 课程中使用的命令相同的命令)但是当我尝试使用conda install spyderthen安装 spyder 时,它给了我这个错误:
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
ERROR conda.core.link:_execute(698): An error occurred while installing package 'defaults::icu-58.2-ha925a31_3'.
Rolling back transaction: done
[Errno 13] Permission denied: 'C:\\Users\\Lenovo\\anaconda3\\envs\\talkingbot\\Library\\bin\\icudt58.dll'
()
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用 anaconda navigator 安装 spyder,但从那里也没有安装 spyder。
帮我解决这个问题。
python machine-learning chatbot anaconda recurrent-neural-network
在运行我的模型一个时期后,它崩溃并显示以下错误消息:
InvalidArgumentError:从形状为 [56,9] 的张量中指定了形状为 [60,9] 的列表 [[{{node TensorArrayUnstack/TensorListFromTensor}}]] [[sequential_7/lstm_17/PartitionedCall]] [Op:__inference_train_function_29986]
这发生在我将 LSTM 层更改为stateful=True并且必须传递batch_input_shape参数而不是input_shape
下面是我的代码,我确定它与我的数据形状有关:
test_split = 0.2
history_points = 60
n = int(histories.shape[0] * test_split)
histories_train = histories[:n]
y_train = next_values_normalized[:n]
histories_test = histories[n:]
y_test = next_values_normalized[n:]
next_values_test = next_values[n:]
print(histories_train.shape)
print(y_train.shape)
-->(1421, 60, 9)
-->(1421, 1)
# model architecture
´´´model = Sequential()
model.add(LSTM(units=128, stateful=True,return_sequences=True, batch_input_shape=(60,history_points, 9)))
model.add(LSTM(units=64,stateful=True,return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(units=32))
model.add(Dropout(0.2))
model.add(Dense(20))
ADAM=keras.optimizers.Adam(0.0005, beta_1=0.9, beta_2=0.999, amsgrad=False)
model.compile(loss='mean_squared_error', optimizer=ADAM)
model.fit(x=histories_train, y=y_train, batch_size=batchsize, epochs=50, shuffle=False, validation_split=0.2,verbose=1)
´´´
Run Code Online (Sandbox Code Playgroud) 在下面的代码中,我导入了一个用 python 创建的保存的稀疏 numpy 矩阵,对其进行增密,向多对一的 SimpleRNN 添加掩蔽、batchnorm 和密集输出层。keras 顺序模型工作正常,但是,我无法使用 shap。这是在 Windows 10 桌面上的 Winpython 3830 的 Jupyter 实验室中运行的。X 矩阵的形状为 (4754, 500, 64):4754 个示例,具有 500 个时间步长和 64 个变量。我创建了一个函数来模拟数据,以便可以测试代码。模拟数据返回相同的错误。
from sklearn.model_selection import train_test_split
import tensorflow as tf
from tensorflow.keras.models import Sequential
import tensorflow.keras.backend as Kb
from tensorflow.keras import layers
from tensorflow.keras.layers import BatchNormalization
from tensorflow import keras as K
import numpy as np
import shap
import random
def create_x():
dims = [10,500,64]
data = []
y = []
for i in range(dims[0]): …Run Code Online (Sandbox Code Playgroud) 据我所知和研究,数据集中的序列可以有不同的长度;我们不需要填充或截断它们,前提是训练过程中的每个批次都包含相同长度的序列。
为了实现和应用它,我决定将批量大小设置为 1,并在 IMDB 电影分类数据集上训练我的 RNN 模型。我添加了我在下面编写的代码。
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow.keras.datasets import imdb
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import SimpleRNN
from tensorflow.keras.layers import Embedding
max_features = 10000
batch_size = 1
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=max_features)
model = Sequential()
model.add(Embedding(input_dim=10000, output_dim=32))
model.add(SimpleRNN(units=32, input_shape=(None, 32)))
model.add(Dense(1, activation="sigmoid"))
model.compile(optimizer="rmsprop",
loss="binary_crossentropy", metrics=["acc"])
history = model.fit(x_train, y_train,
batch_size=batch_size, epochs=10,
validation_split=0.2)
Run Code Online (Sandbox Code Playgroud)
acc = history.history["acc"]
loss = history.history["loss"]
val_acc = history.history["val_acc"]
val_loss = history.history["val_loss"]
epochs …Run Code Online (Sandbox Code Playgroud) python deep-learning keras tensorflow recurrent-neural-network
我正在尝试在简单的正弦波上训练seq-to-seq模型。目标是获取数据点Nin并预测Nout下一个数据点。任务看起来很简单,模型对大频率freq(y = sin(freq * x))的预测很好。例如,对于freq=4,损失非常低,预测非常接近目标。然而,对于低频,预测是糟糕的。关于为什么模型失败的任何想法?
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, LSTM, RepeatVector, TimeDistributed, Dense
freq = 0.25
Nin, Nout = 14, 14
# Helper function to convert 1d data to (input, target) samples
def windowed_dataset(y, input_window = 5, output_window = 1, stride = 1, num_features = 1):
L = y.shape[0]
num_samples = (L - input_window - output_window) // stride + 1
X = np.zeros([input_window, num_samples, num_features])
Y …Run Code Online (Sandbox Code Playgroud) tensorflow ×8
python ×7
keras ×6
lstm ×4
anaconda ×1
chatbot ×1
pytorch ×1
shap ×1
time-series ×1