2017-04-23 6 views
3

기계 학습에서 one-hot-encoding을 사용하여 범주 형 (구체적으로 : 공칭) 기능을 나타내는 것이 일반적입니다. 저는 분류 문제에서 범주 적 특징을 나타 내기 위해 tensorflow의 임베딩 레이어를 사용하는 법을 배우려고합니다. tensorflow version 1.01이 설치되어 있고 Python 3.6을 사용하고 있습니다.범주 형 기능에 대한 Tensorflow 포함

나는 tensorflow tutorial for word2vec을 알고 있지만 내 경우에는별로 도움이되지 않습니다. tf.Graph을 구축하는 동안 NCE 관련 가중치와 tf.nn.nce_loss을 사용합니다.

다음과 같이 단순한 피드 포워드 네트가 필요하고 입력 레이어가 포함되어야합니다. 나의 시도는 아래에있다. 셰이프 비 호환성으로 인해 숨겨진 레이어를 포함하는 행렬에 행렬을 적용하려고하면 불평합니다. 어떻게하면이 문제를 해결할 수 있을까요?

from __future__ import print_function 
import pandas as pd; 
import tensorflow as tf 
import numpy as np 
from sklearn.preprocessing import LabelEncoder 

if __name__ == '__main__': 

    # 1 categorical input feature and a binary output 
    df = pd.DataFrame({'cat2': np.array(['o', 'm', 'm', 'c', 'c', 'c', 'o', 'm', 'm', 'm']), 
         'label': np.array([0, 0, 1, 1, 0, 0, 1, 0, 1, 1])}) 

    encoder = LabelEncoder() 
    encoder.fit(df.cat2.values) 
    X = encoder.transform(df.cat2.values) 

    Y = np.zeros((len(df), 2)) 
    Y[np.arange(len(df)), df.label.values] = 1 

    # Neural net parameters 
    training_epochs = 5 
    learning_rate = 1e-3 
    cardinality = len(np.unique(X)) 
    embedding_size = 2 
    input_X_size = 1 
    n_labels = len(np.unique(Y)) 
    n_hidden = 10 

    # Placeholders for input, output 
    x = tf.placeholder(tf.int32, [None, 1], name="input_x") 
    y = tf.placeholder(tf.float32, [None, 2], name="input_y") 

    # Neural network weights 
    embeddings = tf.Variable(tf.random_uniform([cardinality, embedding_size], -1.0, 1.0)) 
    h = tf.get_variable(name='h2', shape=[embedding_size, n_hidden], 
         initializer=tf.contrib.layers.xavier_initializer()) 
    W_out = tf.get_variable(name='out_w', shape=[n_hidden, n_labels], 
          initializer=tf.contrib.layers.xavier_initializer()) 

    # Neural network operations 
    embedded_chars = tf.nn.embedding_lookup(embeddings, x) 

    layer_1 = tf.matmul(embedded_chars,h) 
    layer_1 = tf.nn.relu(layer_1) 
    out_layer = tf.matmul(layer_1, W_out) 

    # Define loss and optimizer 
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=out_layer, labels=y)) 
    optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost) 

    # Initializing the variables 
    init = tf.global_variables_initializer() 

    # Launch the graph 
    with tf.Session() as sess: 
     sess.run(init) 

     for epoch in range(training_epochs): 
      avg_cost = 0. 

      # Run optimization op (backprop) and cost op (to get loss value) 
      _, c = sess.run([optimizer, cost], 
          feed_dict={x: X, y: Y}) 
    print("Optimization Finished!") 

편집 :

오류 메시지 아래 참조하십시오

Traceback (most recent call last): 
    File "/home/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/common_shapes.py", line 671, in _call_cpp_shape_fn_impl 
    input_tensors_as_shapes, status) 
    File "/home/anaconda3/lib/python3.6/contextlib.py", line 89, in __exit__ 
    next(self.gen) 
    File "/home/anaconda3/lib/python3.6/site-packages/tensorflow/python/framework/errors_impl.py", line 466, in raise_exception_on_not_ok_status 
    pywrap_tensorflow.TF_GetCode(status)) 
tensorflow.python.framework.errors_impl.InvalidArgumentError: Shape must be rank 2 but is rank 3 for 'MatMul' (op: 'MatMul') with input shapes: [?,1,2], [2,10]. 
+1

정확한 오류 메시지가 무엇입니까 될 수 있도록? – Aaron

+0

@Aaron, 편집을 참조하십시오. Python 및 tensorflow 버전도 포함되어 있습니다. – Rhubarb

답변

2

그냥 x 자리 크기 [None] 대신 [None, 1]