我一直很难理解这个错误消息的含义。我看过很多帖子,比如
ValueError: 层顺序的输入 0 与层不兼容: : 预期 min_ndim=4, 发现 ndim=3
ValueError:输入 0 与层 lstm_13 不兼容:预期 ndim=3,发现 ndim=4
层顺序的输入0与期望ndim=3的层不兼容,发现ndim=2。收到完整形状:[无,1]
但他们似乎都没有解决我的问题。
我有
batch_train_dataset = tf.data.Dataset.from_tensor_slices((train_features, train_labels)).shuffle(512).batch(batch_size)
for i,x in enumerate(batch_train_dataset):
print("x[0].ndim: ", x[0].ndim)
print("x[0].shape: ", x[0].shape)
print("x[1].shape: ", x[1].shape)
if i==0:
break
##########OUTPUT###########
x[0].ndim: 3
x[0].shape: (64, 32, 1000)
x[1].shape: (64,)
Run Code Online (Sandbox Code Playgroud)
我的个人数据具有一个形状,(64,32,1000)其中64是batch_size,32是时间步长,1000是许多特征。
这是我的模型。
num_classes = len(index_to_label)
lstm_model = tf.keras.Sequential([
tf.keras.layers.Masking(mask_value=0.0), # DO NOT REMOVE THIS LAYER …Run Code Online (Sandbox Code Playgroud) 我刚刚开始学习 Pytorch 并创建了我的第一个 LSTM。数据集是时间序列数据。下面是训练代码。使用 .double() 并不能修复错误。它在Windows 11环境中运行。
import torch
import torch.nn as nn
from torch.optim import SGD
import math
import numpy as np
class Predictor(nn.Module):
def __init__(self, inputDim, hiddenDim, outputDim):
super(Predictor, self).__init__()
self.rnn = nn.LSTM(input_size = inputDim,
hidden_size = hiddenDim,
batch_first = True)
self.output_layer = nn.Linear(hiddenDim, outputDim)
def forward(self, inputs, hidden0=None):
output, (hidden, cell) = self.rnn(inputs, hidden0)
output = self.output_layer(output[:, -1, :])
return output
def mkDataSet(train_x, train_y=None):
t_train_x = []
t_train_y = []
sequence_length = 50
data_length = train_x.shape[0]
for …Run Code Online (Sandbox Code Playgroud) 我在 Tensorflow 中使用 LSTM 单元。
lstm_cell = tf.contrib.rnn.BasicLSTMCell(lstm_units)
Run Code Online (Sandbox Code Playgroud)
我想知道如何初始化权重和状态,或者更确切地说,Tensorflow 中 LSTM 单元(状态和权重)的默认初始化器是什么?
有没有一种简单的方法来手动设置初始化程序?
注意:tf.get_variable()据我从文档中了解到,使用了 glorot_uniform_initializer 。
我的大部分代码都是基于这篇文章,我所问的问题在那里很明显,而且在我自己的测试中也是如此。它是一个具有 LSTM 层的顺序模型。
下面是对来自模型的真实数据的预测,该模型是使用一个时期的大约 20 个小数据集进行训练的。
这是另一个图,但这次模型使用更多数据训练了 10 个时期。
造成这种情况的原因是什么以及如何解决?另外,我发送的第一个链接在底部显示了相同的结果 - 1 epoch 效果很好,而 3500 epoch 则很糟糕。
此外,当我针对更高的数据计数但只有 1 个时期运行训练课程时,我得到了与第二个图相同的结果。
什么可能导致此问题?
我正在尝试将 LSTM 与 CNN 结合使用,但由于错误而卡住了。这是我试图实现的模型:
model=Sequential()
model.add(Conv2D(32, (3, 3), input_shape=(28, 28,3), activation='relu'))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())
model.add(Dense(32, activation='relu'))
model.add(LSTM(128, return_sequences=True,input_shape=(1,32), activation='relu'))
model.add(LSTM(256))
model.add(Dropout(0.25))
model.add(Dense(37))
model.compile(loss='categorical_crossentropy', optimizer='adam')
Run Code Online (Sandbox Code Playgroud)
错误发生在第一个 LSTM 层:
ERROR: Input 0 is incompatible with layer lstm_12: expected ndim=3, found ndim=2
Run Code Online (Sandbox Code Playgroud) 我正在学习 TensorFlow 和 LSTM,我想知道为什么当我训练它返回一个值时,我的预测输出有多个值。我的目标是在使用数组进行情感分析训练后获得 0 到 1 之间的单个值。
训练输入数据如下所示:
[[59, 21, ... 118, 194], ... [12, 110, ... 231, 127]]
Run Code Online (Sandbox Code Playgroud)
所有输入数组的长度相同,用 0 填充。训练目标数据如下所示:
[1.0, 0.5, 0.0, 1.0, 0.0 ...]
Run Code Online (Sandbox Code Playgroud)
模型:
model = Sequential()
model.add(Embedding(input_length, 64, mask_zero=True))
model.add(LSTM(100))
model.add(Dense(1, activation=tf.nn.sigmoid))
Run Code Online (Sandbox Code Playgroud)
为什么预测似乎一次评估每个单独的值而不是整个数组?
model.predict([192])
# Returns [[0.5491102]]
model.predict([192, 25])
# Returns [[0.5491102, 0.4923803]]
model.predict([192, 25, 651])
# Returns [[0.5491102, 0.4923803, 0.53853387]]
Run Code Online (Sandbox Code Playgroud)
我不想取输出的平均值,因为输入数组中的值之间的关系对于情感分析很重要。如果我正在训练预测单个值,我不明白为什么不输出单个值。我是 TensorFlow、Keras 和分层神经网络的新手,所以我确定我遗漏了一些明显的东西。
在训练时,最好初始化隐藏状态而不是将其设置为 0。但我想知道在验证和测试时初始化隐藏状态是好是坏。谢谢
我是 Keras 的新手,我正在尝试构建一个供个人使用/未来学习的模型。我刚开始使用 python,我想出了这段代码(在视频和教程的帮助下)。我有 16324 个实例的数据,每个实例由 18 个特征和 1 个因变量组成。
import pandas as pd
import os
import time
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, LSTM, BatchNormalization
from tensorflow.keras.callbacks import TensorBoard, ModelCheckpoint
EPOCHS = 10
BATCH_SIZE = 64
NAME = f"-TEST-{int(time.time())}"
df = pd.read_csv("EntryData.csv", names=['1SH5', '1SHA', '1SA5', '1SAA', '1WH5', '1WHA', '2SA5', '2SAA', '2SH5', '2SHA', '2WA5', '2WAA', '3R1', '3R2', '3R3', '3R4', '3R5', '3R6', 'Target'])
df_val = 14554
validation_df = df[df.index > df_val]
df = df[df.index …Run Code Online (Sandbox Code Playgroud) 我正在使用编码器/解码器模式编写德语-> 英语翻译器,其中编码器通过将其最后一个 LSTM 层的状态输出作为解码器的 LSTM 的输入状态传递来连接到解码器。
但是,我被卡住了,因为我不知道如何解释编码器 LSTM 的输出。一个小例子:
tensor = tf.random.normal( shape = [ 2, 2, 2 ])
lstm = tf.keras.layers.LSTM(units=4, return_sequences=True, return_state=True )
result = lstm( ( tensor )
print( "result:\n", result )
Run Code Online (Sandbox Code Playgroud)
在 Tensorflow 2.0.0 中执行这个会产生:
result:
[
<tf.Tensor: id=6423, shape=(2, 2, 3), dtype=float32, numpy=
array([[[ 0.05060377, -0.00500009, -0.10052835],
[ 0.01804499, 0.0022153 , 0.01820258]],
[[ 0.00813384, -0.08705016, 0.06510869],
[-0.00241707, -0.05084776, 0.08321179]]], dtype=float32)>,
<tf.Tensor: id=6410, shape=(2, 3), dtype=float32, numpy=
array([[ 0.01804499, 0.0022153 , 0.01820258],
[-0.00241707, -0.05084776, 0.08321179]], dtype=float32)>, …Run Code Online (Sandbox Code Playgroud)