Как использовать Tensorflow на нашем собственном наборе данных - PullRequest
0 голосов
/ 08 июня 2018

Я новичок в Tensor Flow.Я пытаюсь передать свой собственный набор данных, используя тензорные заполнители.Проведя много исследований в Интернете, я понял, что использование tf.data.DataSet - это идеальный способ предоставления наших собственных данных.Но мне просто любопытно, как решить следующую проблему: я использую набор данных идентификации стекла с 10 независимыми переменными и одной зависимой переменной [https://archive.ics.uci.edu/ml/machine-learning-databases/glass/glass.data][1]

. Вот некоторые из моих данных:

    Id  RI  Na  Mg  Al  Si  K   Ca  Ba  Fe  Type
count   213.000000  213.000000  213.000000  213.000000  213.000000  213.000000  213.000000  213.000000  213.000000  213.000000  213.000000
mean    108.000000  1.518353    13.406761   2.676056    1.446526    72.655023   0.499108    8.957934    0.175869    0.057277    2.788732
std 61.631972   0.003039    0.818371    1.440453    0.499882    0.774052    0.653035    1.426435    0.498245    0.097589    2.105130
min 2.000000    1.511150    10.730000   0.000000    0.290000    69.810000   0.000000    5.430000    0.000000    0.000000    1.000000
25% 55.000000   1.516520    12.900000   2.090000    1.190000    72.280000   0.130000    8.240000    0.000000    0.000000    1.000000
50% 108.000000  1.517680    13.300000   3.480000    1.360000    72.790000   0.560000    8.600000    0.000000    0.000000    2.000000
75% 161.000000  1.519150    13.830000   3.600000    1.630000    73.090000   0.610000    9.180000    0.000000    0.100000    3.000000
max 214.000000  1.533930    17.380000   3.980000    3.500000    75.410000   6.210000    16.190000   3.150000    0.510000    7.000000

Вот мой код:

r,c = data.shape

n_inputs = c - 1

n_hidden1 = int(input('No. of nodes in hidden layer 1 \n'))

n_hidden2 = int(input('No. of nodes in hidden layer 2 \n'))

y_new = np.array(data['Type']-1)
y_cat = to_categorical(y_new)


n_outputs = y_cat.shape[1]



#1.1) Using Place holders to define shape of the variables

X = tf.placeholder(tf.float32, shape=(None, n_inputs), name="X") # We don't know no. of rows yet but we know the no. of columns given by n_inputs

y= tf.placeholder(tf.int32, shape=(None), name="y")


# 1.2) Using name scopes and creating each layer
# A dense layer with sequential connections is created

with tf.name_scope("dnn"):

    hidden1 = tf.layers.dense(X, n_hidden1, name="hidden1", activation = tf.nn.relu, reuse= tf.AUTO_REUSE) #First hidden layers takes X as input

    hidden2 = tf.layers.dense(hidden1, n_hidden2, name="hidden2", activation = tf.nn.relu, reuse= tf.AUTO_REUSE) # Second hidden layer takes first hidden layer as input

    logits_out = tf.layers.dense(hidden2,n_outputs,name="outputs",reuse= tf.AUTO_REUSE) # Output layer 



# 1.3) Defining a Loss function with a proper name scope

with tf.name_scope("loss"):
    xentropy = tf.nn.softmax_cross_entropy_with_logits(labels=y, logits=logits_out)
    #softmax_cross_entropy_with_logits(labels=y, logits=logits_out)

    loss = tf.reduce_mean(xentropy, name="loss")



# 1.4) Choose a good optimizer

learning_rate = float(input('Please choose a learning rate \n'))

with tf.name_scope("train"):
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=learning_rate)

    training_op = optimizer.minimize(loss)


# 1.5) Specifying how to evaluate the model

with tf.name_scope("eval"):
    correct = tf.nn.in_top_k(logits_out, y,1)

    accuracy = tf.reduce_mean(tf.cast(correct, tf.float32))



#Create a global initializer

init = tf.global_variables_initializer()

ss = StandardScaler ()

X = data.drop([ 'Type'], axis=1)

ss.fit(X)

X_scaled = ss.transform(X)


n_cols = X_scaled.shape[1]


strt_pos = 0; end_pos = 0

def next_batch(batch_size, iteration):
    '''  Returns batch of feature and target variables   based on index values   '''

    if iteration==0:
        strt_pos = 0; 
        end_pos = batch_size

        X_batch = X_scaled[strt_pos:end_pos]
        y_batch = y_cat[strt_pos:end_pos]    
    else:
        strt_pos = iteration * batch_size
        end_pos = strt_pos + batch_size

        X_batch = X_scaled[strt_pos:end_pos]
        y_batch = y_cat[strt_pos:end_pos]



    return np.array(X_batch), np.array(y_batch)




n_epochs = int(input('Choose no. of epochs \n')) # Choose no. of epochs for training

batch_size = int(input('Choose max batch size \n')) # Choose batch size for training


training_size = float(input('Choose the training size \n'))

total_training_size = int(r * training_size)



with tf.Session() as sess:
    init.run()
    for epoch in range(n_epochs):
        for iteration in range(total_training_size // batch_size):
            X_batch, y_batch = next_batch(batch_size, iteration)
            sess.run(training_op, feed_dict={X: X_batch, y: y_batch})
        acc_train = accuracy.eval(feed_dict={X: X_batch, y: y_batch})
        acc_val = accuracy.eval(feed_dict={X: X_scaled, y: y_cat})
        print(epoch, "Train accuracy: ", acc_train, "Val accuracy: ", acc_val)

Переменная «data» - это мой фрейм данных с 213 строками и 11 столбцами вверхпри выборе всех требуемых значений я получаю следующую ошибку:

Choose no. of epochs 
20
Choose max batch size 
20
Choose the training size 
0.7
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-19-929e743f5882> in <module>()
     17         for iteration in range(total_training_size // batch_size):
     18             X_batch, y_batch = next_batch(batch_size, iteration)
---> 19             sess.run(training_op, feed_dict={X: X_batch, y: y_batch})
     20         acc_train = accuracy.eval(feed_dict={X: X_batch, y: y_batch})
     21         acc_val = accuracy.eval(feed_dict={X: X_scaled, y: data['Type']})

C:\Users\Dell\Anaconda3\lib\site-packages\pandas\core\generic.py in __hash__(self)
   1487     def __hash__(self):
   1488         raise TypeError('{0!r} objects are mutable, thus they cannot be'
-> 1489                         ' hashed'.format(self.__class__.__name__))
   1490 
   1491     def __iter__(self):

TypeError: 'DataFrame' objects are mutable, thus they cannot be hashed

Как вы можете видеть, я реализовал свою собственную версию next_batch, я не уверен, возвращает ли она именно то, что является тензорным потокоможидая.Я не совсем ясно, какой тип данных "feed_data" ожидает.Любая помощь очень ценится.

PS: Спасибо, что прочитали такой длинный пост, но у меня не было другого выбора, кроме как предоставить всю эту информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...