Lstm tensorflow tf.nn.tf.整形后的双向动态误差

Lstm tensorflow tf.nn.tf.整形后的双向动态误差,lstm,flow,tensor,Lstm,Flow,Tensor,我的tensorflow版本是1.3.0 我的python版本是3.5 我执行CNN,然后执行bid LSTM。我在CPU上运行代码 在实现CNN之后,pool2的形状将是[批处理大小(None),None,106,64]。然后tf.reforme(pool2,[-1,tf.shape(pool2)[1],tf.shape(pool2)[2]xtf.shape(pool2)[3]])。我希望tf.reforme可以在pool2上将4D重塑为3D。然后将其输入bid LSTM,但双向动态发生错误

我的tensorflow版本是1.3.0

我的python版本是3.5

我执行CNN,然后执行bid LSTM。我在CPU上运行代码

在实现CNN之后,pool2的形状将是[批处理大小(None),None,106,64]。然后tf.reforme(pool2,[-1,tf.shape(pool2)[1],tf.shape(pool2)[2]xtf.shape(pool2)[3]])。我希望tf.reforme可以在pool2上将4D重塑为3D。然后将其输入bid LSTM,但双向动态发生错误

它说,“输入大小(输入深度)必须可以通过形状推断访问,”ValueError:输入大小(输入深度)必须可以通过形状推断访问,但saw值为None。

我很久没有找到解决这个问题的办法了。也许我在网上搜索时使用了错误的关键字。或者给我一些正确的关键词

    x = tf.placeholder('float', shape=[None, None, 108])
    y = tf.placeholder('float')
    n_steps = tf.placeholder('int64')
    def CNN(x):     
        input_layer = tf.reshape(x, [-1, tf.shape(x)[1], 108, 1])
        conv1 = tf.layers.conv2d(inputs=input_layer, filters=32, kernel_size=[5, 3], padding="same", activation=tf.nn.relu)
        pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=1)
        conv2 = tf.layers.conv2d(inputs=conv1,  filters=64, kernel_size=[3, 3], padding="same", activation=tf.nn.relu)
        pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=1)
        output = tf.reshape(pool2, [-1, tf.shape(pool2)[1], tf.shape(pool2)[2]*tf.shape(pool2)[3]])
        return output

    def recurrent_neural_network(x):
        layer1 = {'weights':tf.Variable(tf.random_normal([rnn_size*2,n_classes])),'biases':tf.Variable(tf.random_normal([n_classes]))}
        lstm_fw_cell = tf.nn.rnn_cell.BasicLSTMCell(rnn_size,state_is_tuple=True)
        lstm_bw_cell = tf.nn.rnn_cell.BasicLSTMCell(rnn_size,state_is_tuple=True)   
        outputs, states = tf.nn.bidirectional_dynamic_rnn(cell_fw=lstm_fw_cell, cell_bw=lstm_bw_cell, inputs=x, dtype=tf.float32)  #[batch_size, max_time, cell_output_size]

        outputs = tf.concat(outputs, 2)
        max_length = tf.shape(outputs)[1]
        outputs = tf.reshape(outputs, [-1, rnn_size*2])
        prediction = tf.matmul(outputs,layer1['weights']) + layer1['biases']
        prediction = tf.reshape(prediction, [-1, max_length, n_classes])
        return prediction


    def train_neural_network(x):
        CNN_result = CNN(x)
        prediction = recurrent_neural_network(CNN_result)
        tf.nn.softmax_cross_entropy_with_logits(logits=prediction,labels=y)
        cost = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(logits=prediction,labels=y) )
        optimizer = tf.train.AdamOptimizer(learning_rate=0.001).minimize(cost)

        with tf.Session() as sess:
            sess.run(tf.global_variables_initializer())

            for epoch in range(hm_epochs):
                epoch_loss = 0
                i=0
                while i < len(train_X):
                    start = i
                    end = i+batch_size

                    batch_x = train_X[start:end]
                    batch_y = train_Y[start:end]
                    batch_sen_len = train_sen_len[start:end]
                    max_batch_sen_len = max(batch_sen_len)
                    #padding zero
                    for j in range(len(batch_x)):
                        k = max_batch_sen_len - len(batch_x[j])
                        for _ in range(k):
                            batch_x[j].append([0]*108)
                            batch_y[j].append([0]*48)

                    _, c = sess.run([optimizer, cost], feed_dict={x: batch_x, y: batch_y, n_steps: batch_sen_len})
                    epoch_loss += c
                    i+=batch_size


                print('Epoch', epoch+1, 'completed out of',hm_epochs,'loss:',epoch_loss)
x=tf.placeholder('float',shape=[None,None,108])
y=tf.占位符('float')
n_steps=tf.placeholder('int64')
美国有线电视新闻网(x):
输入层=tf.重塑(x,[-1,tf.形状(x)[1],108,1])
conv1=tf.layers.conv2d(inputs=input\u layer,filters=32,kernel\u size=[5,3],padding=“same”,activation=tf.nn.relu)
pool1=tf.layers.max_poolg2d(输入=conv1,pool_size=[2,2],步长=1)
conv2=tf.layers.conv2d(输入=conv1,过滤器=64,内核大小=[3,3],padding=“same”,激活=tf.nn.relu)
pool2=tf.layers.max_poolg2d(输入=conv2,pool_size=[2,2],步长=1)
输出=tf.reshape(pool2,[-1,tf.shape(pool2)[1],tf.shape(pool2)[2]*tf.shape(pool2)[3]]
返回输出
def递归神经网络(x):
第1层={'weights':tf.Variable(tf.random_normal([rnn_size*2,n_类]),'bias':tf.Variable(tf.random_normal([n_类])}
lstm\u fw\u cell=tf.nn.rnn\u cell.BasicLSTMCell(rnn\u大小,状态为\u tuple=True)
lstm\u bw\u cell=tf.nn.rnn\u cell.BasicLSTMCell(rnn\u大小,状态为\u tuple=True)
输出,状态=tf.nn.bidirectional_dynamic_rnn(单元fw=lstm_fw_单元,单元bw=lstm_bw_单元,输入=x,数据类型=tf.float32)#[批量大小,最大时间,单元输出大小]
输出=tf.concat(输出,2)
最大长度=tf.形状(输出)[1]
输出=tf.重塑(输出,[-1,rnn_大小*2])
预测=tf.matmul(输出,第1层['权重])+1层['偏差]
预测=tf.重塑(预测,[-1,最大长度,n个类])
收益预测
def系列神经网络(x):
CNN_结果=CNN(x)
预测=递归神经网络(CNN结果)
tf.nn.softmax\u cross\u entropy\u与logits(logits=prediction,labels=y)
成本=tf.reduce\u平均值(tf.nn.softmax\u交叉\u熵\u与logits(logits=prediction,labels=y))
优化器=tf.train.AdamOptimizer(学习率=0.001)。最小化(成本)
使用tf.Session()作为sess:
sess.run(tf.global\u variables\u initializer())
对于范围内的历元(hm_历元):
历元损失=0
i=0
当i
我知道这个话题很长一段时间都不活跃了,只是为未来的谷歌用户发布的。当我尝试将CNN与bi LSTM叠加时,我遇到了类似的问题。在打印张量形状后,很明显CNN
output
以某种方式“忘记”了它的形状信息。(它只是打印[None,None,None],而实际上它知道维度)所以在将输出输入LSTM层之前,我使用
output.set_shape()
设置“形状信息”。我知道这个主题很长一段时间都不活跃,只是为未来的谷歌用户发布。当我尝试将CNN与bi LSTM叠加时,我遇到了类似的问题。在打印张量形状后,很明显CNN
output
以某种方式“忘记”了它的形状信息。(它只打印[None,None,None],而实际上它知道维度)因此在将输出输入LSTM层之前,我使用
output.set_shape()
设置“形状信息”。