lstm维度与十位数不匹配

2024-04-26 11:33:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我构建了一个LSTM网络,输入的维数是100*100*83 ( batch_size=100, steps = 100, char_vector = 83)。我建立了两个LSTM层,有512个隐藏单元。在

# coding: utf-8

from __future__ import print_function
import tensorflow as tf
import numpy as np
import time


class CharRNN:
    def __init__(self, num_classes, batch_size=64, num_steps=50, lstm_size=128, num_layers =2,\
                 learning_rate = 0.001, grad_clip=5, keep_prob=0.001,sampling= False):
        # True for SGD
        if sampling == True:
            self.batch_size, self.num_steps = 1,1
        else:
            self.batch_size, self.num_steps = batch_size, num_steps

        tf.reset_default_graph()

        self.inputs, self.targets, self.keep_prob = self.build_inputs(self.batch_size,self.num_steps)
        self.keep_prob = keep_prob

        self.cell, self.initial_state = self.build_lstm(lstm_size,num_layers,self.batch_size,self.keep_prob)

       # print(self.cell.state_size)
        x_one_hot = tf.one_hot(self.inputs, num_classes)
        print("cell state size: ",self.cell.state_size)
        print("cell initial  state: ",self.initial_state)
        print("this is inputs", self.inputs)

        print("x_one_hot: ",x_one_hot)
        outputs, state = tf.nn.dynamic_rnn(self.cell, x_one_hot, initial_state= self.initial_state)



    def build_inputs(self, num_seqs, num_steps):
        inputs = tf.placeholder(tf.int32, shape=(num_seqs, num_steps), name = "inputs")
        targets = tf.placeholder(tf.int32, shape= (num_seqs, num_steps), name="targets")
        print('inputs shape: ',inputs.shape)
        keep_prob = tf.placeholder(tf.float32, name="keep_prob")
        return inputs, targets, keep_prob

    def build_lstm(self, lstm_size, num_layers, batch_size, keep_prob):

        # construct lstm cell
        lstm = tf.nn.rnn_cell.BasicLSTMCell(lstm_size)
        # add dropout
        drop = tf.nn.rnn_cell.DropoutWrapper(lstm, output_keep_prob= keep_prob)

        # stack multiple rnn cells
        cell = tf.nn.rnn_cell.MultiRNNCell([drop for _ in range(num_layers)])
        initial_state = cell.zero_state(batch_size, tf.float32)

        return cell, initial_state

if __name__ == '__main__':
    len_vocab = 83
    batch_size = 100
    num_steps = 100
    lstm_size = 512
    num_layers = 2
    learning_rate = 0.001
    keep_prob = 0.5

    epochs = 20
    save_every_n = 200

    print("h1")
    model = CharRNN(len_vocab, batch_size = batch_size, num_steps=num_steps, lstm_size = lstm_size,num_layers=num_layers\
                    ,learning_rate=learning_rate,sampling= False,keep_prob = keep_prob

我在tf.nn.dynamic_rnn得到一个dimension not match错误。 错误消息如下:

^{pr2}$

我搜索它,发现tensorflow的lstm单元应该自动调整它的输入大小。但错误信息是这样说的。在

它显示了

input size is [100, 1024] and lstm is [595, 2048].

首先谢谢。在


Tags: selfsizelayerstfbatchcellstepsnum
1条回答
网友
1楼 · 发布于 2024-04-26 11:33:54

cell = tf.nn.rnn_cell.MultiRNNCell([drop for _ in range(num_layers)])

cell = tf.nn.rnn_cell.MultiRNNCell([drop])

因为你给定的输入张量和产生张量是不一样的。在

相关问题 更多 >