简单cnn文本分类中的形状错误

时间:2019-03-01 10:20:48

标签: python tensorflow text

我遇到了如下问题:

  

回溯(最近通话最近):       张量(“ add_2:0”,shape =(),dtype = float32)         文件“ C:/Users/397400665/Desktop/Exercise/Exercise1/train.py”,第156行,在       张量(“ accuracy:0”,shape =(),dtype = float32)           train_step(批处理数据,批处理签名)         在train_step中的文件“ C:/Users/397400665/Desktop/Exercise/Exercise1/train.py”第128行           [train_op,global_step,train_summary_op,损失,准确性],feed_back         文件“ E:\ python \ python36 \ lib \ site-packages \ tensorflow \ python \ client \ session.py”,   877行,正在运行           run_metadata_ptr)         文件“ E:\ python \ python36 \ lib \ site-packages \ tensorflow \ python \ client \ session.py”,   _run中的第1076行           str(subfeed_t.get_shape())))       ValueError:无法为形状为((?,384)'的Tensor'dropout / mul:0'输入形状()的值

我试图找出哪个参数导致了这个问题,但实际上我失败了。有人可以帮助我吗? 我认为这是因为我在过滤器中犯了一些错误。但是,当我看这部分时,几乎找不到任何可能导致此错误的错误。我已经调查了sesson.py,但是这里没有任何用处。我不知道鞭打参数是错误的,我也找不到错误。  我的代码如下:

import datetime
import os

import numpy as np
import tensorflow as tf
from tensorflow.contrib import learn

import data_helpers

positive_datafile = "./data/rt-polarity.pos"
negative_datafile = "./data/rt-polarity.neg"
data, sign = data_helpers.load_data_and_labels(positive_datafile, negative_datafile)
# 获取信息中,data是基础数据,sign中是对于数据的标识
max_length = max(len(s.split(" ")) for s in data)
fix_length = learn.preprocessing.VocabularyProcessor(max_length)
fixed_data = np.array(list(fix_length.fit_transform(data)))
# Unified sentence length

np.random.seed(1)
random_index = np.random.permutation(np.arange(len(fixed_data)))
data_random = fixed_data[random_index]
sign_random = sign[random_index]
sample_num = int(0.1 * len(sign))
test_num = int(0.1 * len(sign))
data_sample = data_random[:sample_num]
data_test = data_random[sample_num:sample_num + test_num]
data_train = data_random[sample_num + test_num:]
sign_sample = sign_random[:sample_num]
signal_test = sign_random[sample_num:sample_num + test_num]
signal_train = sign_random[sample_num + test_num:]

# Picture Part
with tf.Graph().as_default():
    x = tf.placeholder(tf.int32, [None, data_train.shape[1]], name="train_data")
    y = tf.placeholder(tf.float32, [None, signal_train.shape[1]], name="y")
    drop = tf.placeholder(tf.float32, name="None")
    l2_loss = tf.constant(0.0)
    sess = tf.Session()

    with tf.device("/cpu:0"):  # 这里如果交给GPU执行会出现错误,因此转交给cpu执行
        embedding_w = tf.Variable(tf.random_uniform([max_length, 128], -1.0, 1.0), name="embedding_w")
        chars = tf.nn.embedding_lookup(embedding_w, x)
        char_expend = tf.expand_dims(chars, -1)  # add the last demision as channel

    pool_outputs = []
    for i, size in enumerate([3, 4, 5]):
        filter_shape = [size, 128, 1, 128]
        filter_w = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="filter_w")
        filter_b = tf.Variable(tf.constant(1.0, shape=[128]))
        conv = tf.nn.conv2d(
            char_expend,
            filter_w,
            strides=[1, 1, 1, 1],
            padding="VALID",
            name="conv"
        )
        h = tf.nn.relu(tf.nn.bias_add(conv, filter_b), name="relu")
        pooled = tf.nn.max_pool(
            h,
            ksize=[1, data_train.shape[1] - size + 1, 1, 1],
            strides=[1, 1, 1, 1],
            padding="VALID",
            name="pooled"
        )
        pool_outputs.append(pooled)
    total_filters = 384  # 128*3
    #total_filters = 384  # 128*3
    h_pool = tf.concat(pool_outputs, 3)
    h_pool_flat = tf.reshape(h_pool, [-1, total_filters])
    drop_ban = tf.nn.dropout(h_pool_flat, drop)
    l2_loss = tf.constant(0.0)

    out_put_w = tf.get_variable("out_put_w", shape=[total_filters, signal_train.shape[1]],
                                initializer=tf.contrib.layers.xavier_initializer())
    out_put_b = tf.Variable(tf.constant(0.1, shape=[signal_train.shape[1]]), name="out_put_b")
    l2_loss += tf.nn.l2_loss(out_put_w)
    l2_loss += tf.nn.l2_loss(out_put_b)

    scores = tf.nn.xw_plus_b(drop_ban, out_put_w, out_put_b, name="scores")
    predictions = tf.argmax(scores, 1, name="predictions")
    l2_reg_lambda = 0.0
    losses = tf.nn.softmax_cross_entropy_with_logits(logits=scores, labels=y)
    loss = tf.reduce_mean(losses) + l2_reg_lambda * l2_loss
    correct_predictions = tf.equal(predictions, tf.argmax(y, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_predictions, "float"), name="accuracy")

    global_step = tf.Variable(0, name="step", trainable=False)
    optimizer = tf.train.AdamOptimizer(1e-3)
    grads_and_vars = optimizer.compute_gradients(l2_loss)
    train_op = optimizer.apply_gradients(grads_and_vars, global_step=global_step)
    grad_summaries = []
    for g, v in grads_and_vars:
        if g is not None:
            grad_hist_summary = tf.summary.histogram("{}/grad/hist".format(v.name), g)
            sparsity_summary = tf.summary.scalar("{}/grad/sparsity".format(v.name), tf.nn.zero_fraction(g))
            grad_summaries.append(grad_hist_summary)
            grad_summaries.append(sparsity_summary)
    grad_summaries_merged = tf.summary.merge(grad_summaries)
    out_dir = os.path.abspath(os.path.join(os.path.curdir, "runs"))
    loss_summary = tf.summary.scalar("loss", loss)
    acc_summary = tf.summary.scalar("accuracy", accuracy)
    train_summary_op = tf.summary.merge([loss_summary, acc_summary, grad_summaries_merged])
    train_summary_dir = os.path.join(out_dir, "summaries", "train")
    train_summary_writer = tf.summary.FileWriter(train_summary_dir, sess.graph)

    dev_summary_op = tf.summary.merge([loss_summary, acc_summary])
    dev_summary_dir = os.path.join(out_dir, "summaries", "train")
    dev_summary_writer = tf.summary.FileWriter(train_summary_dir, sess.graph)

    checkpoint_dir = os.path.abspath(os.path.join(out_dir))
    checkpoint_prefix = os.path.join(checkpoint_dir, "model")
    if not os.path.exists(checkpoint_dir):
        os.makedirs(checkpoint_dir)
    saver = tf.train.Saver(tf.global_variables(), max_to_keep=5)
    fix_length.save(os.path.join(out_dir, "vocab"))
    sess.run(tf.global_variables_initializer())


    def train_step(data_x, data_y):
        feed_back = {
            x: data_x,
            y: data_y,
            drop_ban: 0.5,
        }
        print(loss)
        print(accuracy)
        _, step, summaries, loss_train, accuracy_train = sess.run(
            [train_op, global_step, train_summary_op, loss, accuracy], feed_back
        )
        time_str = datetime.datetime.now().isoformat()
        print("{}:step {},loss {:g},acc {:g}".format(time_str, step, loss, accuracy))
        train_summary_writer.addsummary(summaries, step)


    def dev_step(input_x, input_y, writer=None):
        feed_back = {
            x: input_x,
            y: input_y,
            drop_ban: 1.0
        }
        step, summaries, dev_loss, dev_accuracy = sess.run(
            [global_step, dev_summary_op, loss, accuracy],
            feed_back
        )
        if writer:
            writer.add_summary(summaries, step)


    batches = data_helpers.batch_iter(
        list(zip(data_train, signal_train)),
        64,
        200
    )
    for batch in batches:
        batch_data, batch_sign = zip(*batch)
        train_step(batch_data, batch_sign)
        current_step = tf.train.global_step(sess, global_step)
        if current_step % 100 == 0:
            print("Evaluation:")
            dev_step(data_sample, sign_sample, writer=dev_summary_writer)
            print("")
            path = saver.save(sess, checkpoint_prefix, global_step=current_step)
            print("Saved model checkpoint to {}\n".format(path))

0 个答案:

没有答案