Python Tensorflow:对文本数据进行分类

Python Tensorflow:对文本数据进行分类,python,tensorflow,Python,Tensorflow,我尝试对文本数据进行分类,其中df['Addr']是X,df['Reg']是y Reg Addr 640022, РОССИЯ, КУРГАНСКАЯ ОБЛ, Г КУРГАН, УЛ ГО... 45 624214, РОССИЯ, СВЕРДЛОВСКАЯ ОБЛ, Г ЛЕСНОЙ

我尝试对文本数据进行分类,其中df['Addr']是X,df['Reg']是y

                                                    Reg
Addr                                                   
640022, РОССИЯ, КУРГАНСКАЯ ОБЛ, Г КУРГАН, УЛ ГО...   45
624214, РОССИЯ, СВЕРДЛОВСКАЯ ОБЛ, Г ЛЕСНОЙ, РП ...   66
454018, РОССИЯ, ЧЕЛЯБИНСКАЯ ОБЛ, Г ЧЕЛЯБИНСК, У...   74
624022, РОССИЯ, СВЕРДЛОВСКАЯ ОБЛ, СЫСЕРТСКИЙ Р-...   66
454047, РОССИЯ, ЧЕЛЯБИНСКАЯ ОБЛ, Г ЧЕЛЯБИНСК, У...   74
456787, РОССИЯ, ЧЕЛЯБИНСКАЯ ОБЛ, Г ОЗЕРСК, УЛ Г...   74
450075, РОССИЯ, БАШКОРТОСТАН РЕСП, Г УФА, ПР-КТ...    3
623854, РОССИЯ, СВЕРДЛОВСКАЯ ОБЛ, Г ИРБИТ, УЛ С...   66
457101, РОССИЯ, ЧЕЛЯБИНСКАЯ ОБЛ, Г ТРОИЦК, УЛ С...   74
640008, РОССИЯ, КУРГАНСКАЯ ОБЛ, Г КУРГАН, ПР-КТ...   45
我尝试使用1层tensorflow对地址进行分类,但它返回所有
0
,而不是相关区域

我使用代码

vectorizer = CountVectorizer()
X = vectorizer.fit_transform(df['Addr'])
X = csr_matrix(X).todense()

X_train, X_test, y_train, y_test = train_test_split(X, df['Reg'].values.reshape(-1, 1), shuffle=True, test_size=0.2)

# tf
def reset_graph(seed=42):
    tf.reset_default_graph()
    tf.set_random_seed(seed)
    np.random.seed(seed)

def random_batch(X_train, y_train, batch_size):
   rnd_indices = np.random.randint(0, X_train.shape[0], batch_size)
   X_batch = X_train[rnd_indices]
   y_batch = y_train[rnd_indices]
   return X_batch, y_batch

reset_graph()

X = tf.placeholder(tf.float32, shape=(None, X_train.shape[1]), name="input")
y = tf.placeholder(tf.float32, shape=(None, y_train.shape[1]), name="y")
y_cls = tf.argmax(y, axis=1)

weights = tf.Variable(tf.truncated_normal([X_train.shape[1], y_train.shape[1]], stddev=0.05), name="weights", trainable=True)
bias = tf.constant(1.0, shape=[y_train.shape[1]], name="bias")

layer_1 = tf.nn.relu_layer(X, weights, bias, name="relu_layer")
outs = tf.nn.softmax(layer_1, name="outs")
y_pred = tf.argmax(outs, axis=1)

cross_entropy = tf.nn.softmax_cross_entropy_with_logits_v2(logits=layer_1, labels=y)
cost = tf.reduce_mean(cross_entropy)
acc = tf.cast(tf.equal(y_pred, y_cls), tf.float16)
predicted = tf.reduce_sum(acc)

learning_rate = 0.01
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate)
training_op = optimizer.minimize(cost)

init = tf.global_variables_initializer()

n_epochs = 100
batch_size = 500
n_batches = int(np.ceil(1000 / batch_size))

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

    for epoch in range(n_epochs):
        for batch_index in range(n_batches):
            X_batch, y_batch = random_batch(X_train, y_train, batch_size)
            sess.run(training_op, feed_dict={X: X_batch, y: y_batch})
        loss_val = cost.eval({X: X_test, y: y_test})
        if epoch % 10 == 0:
            print("Epoch:", epoch, "\tLoss:", loss_val)

    y_proba_val = y_pred.eval(feed_dict={X: X_test, y: y_test})

print(y_test.reshape(1, -1))
print(y_proba_val.reshape(1, -1))
此代码的结果:

Epoch: 0    Loss: 0.0
Epoch: 10   Loss: 0.0
Epoch: 20   Loss: 0.0
Epoch: 30   Loss: 0.0
...
Epoch: 90   Loss: 0.0
[[ 3 66 66 ... 66 66 66]]
[[0 0 0 ... 0 0 0]]
我在程序中找不到错误。 我读过
softmax
通常用于任务分类,但我对自己的行为没有信心。
为什么它返回带有
0
的预测?

我很确定您的网络当前看起来是这样的: (请原谅我的绘画技巧)

如果您不打算自己为不同的地址提供功能,我建议您至少添加一个隐藏层,以便网络可以尝试创建自己的功能。目前,每个连接只有一个要调整的权重,这将导致非常弱的分类器

我相信这是问题的根源,但我不完全确定为什么你的损失总是0.0,我会继续寻找,但这是值得思考的

编辑:logits参数应该表示网络的预测输出(概率分布),因此我将其设置为y_pred

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(logits=outs, labels=y)

仍在查看代码,但您的测试集是否与您的培训集相同?您的意思是指定
cross\u entropy=tf.nn.softmax\u cross\u entropy\u与\u logits\u v2(logits=y\u pred,labels=y)
而不是
logits=layer\u 1
?是的,这正是我的意思。如果我在那里添加
out
而不是
layer\u 1
,如果有效,但是再次返回零,但是
y_pred
给出错误
TypeError:Value传递给参数'features'的数据类型int64不在允许的值列表中:float16,bfloat16,float32,float64
对不起,我输入错误,它应该是“out”,因为这是所有输出节点的输出激活,我要试着弄清楚为什么你的损失现在总是0。然而,我确实认为你应该在网络中添加至少一个带有多个节点的隐藏层,使其成为一个更强大的分类器。你能帮我再问一个问题吗。如果我想得到预测,我应该用什么?我尝试过
y\u pred.eval(feed\u dict={X:X\u test},session=sess)
但是我得到了
ValueError:用序列设置数组元素。