Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 具有多个权重的大型数据集导致Tensorflow的训练过程极其缓慢_Python_Tensorflow_Large Data_Large Files - Fatal编程技术网

Python 具有多个权重的大型数据集导致Tensorflow的训练过程极其缓慢

Python 具有多个权重的大型数据集导致Tensorflow的训练过程极其缓慢,python,tensorflow,large-data,large-files,Python,Tensorflow,Large Data,Large Files,我有生物学背景,目前正在进行实验和学习机器学习,以训练我拥有的微阵列数据集,该数据集由140个细胞系组成,每个细胞系有54871个基因表达。基本上,我有140行,每行由54871列组成,代表该细胞系的基因表达水平。基本上是一个140*54871的矩阵。在140个细胞系中,我将每一行(细胞系)标记为第1组或第2组,以便我的代码学会辨别和预测是否输入1*54871矩阵,它将属于哪一组 我将数据集分为两部分进行培训和测试。我的问题来了:由于每个基因表达有54871个权重,我的训练速度非常慢,因为每10

我有生物学背景,目前正在进行实验和学习机器学习,以训练我拥有的微阵列数据集,该数据集由140个细胞系组成,每个细胞系有54871个基因表达。基本上,我有140行,每行由54871列组成,代表该细胞系的基因表达水平。基本上是一个140*54871的矩阵。在140个细胞系中,我将每一行(细胞系)标记为第1组或第2组,以便我的代码学会辨别和预测是否输入1*54871矩阵,它将属于哪一组

我将数据集分为两部分进行培训和测试。我的问题来了:由于每个基因表达有54871个权重,我的训练速度非常慢,因为每1000次迭代,我的成本函数(均方误差)只有0.3057到0.3047,这大约需要2-3分钟。此外,随着迭代次数的增加,您可以看到它有点平稳,似乎需要花费很长时间来训练,直到模型的成本函数大于等于0.1为止。我让它在一夜之间醒来,mse值为0.3014,它以0.3103开始

我能做些什么来加快培训过程吗?或者是我做错了什么。谢谢

这是我的代码,如果有点凌乱,很抱歉:

import pandas as pd
import tensorflow as tf
import numpy

# download csv data sheet of all cell lines
input_data = pd.read_csv(
    'C:/Users/lalalalalalala.csv',
    index_col=[0, 1],
    header=0,
    na_values='---')
matrix_data = input_data.as_matrix()

# user define cell lines of interest for supervised training
group1 = input(
    "Please enter cell lines that makes up the your cluster of interest with spaces in between(case sensitive):")
group_split1 = group1.split(sep=" ")

# assign label of each: input cluster = 1
#                      rest of cluster = 0
# extract data of input group
# split training and test set
# all these if else statement represents split when the input group1 is not a even number
split = len(group_split1)
g1_train = input_data.loc[:, group_split1[0:int(split / 2) if len(group_split1) % 2 == 0 else (int(split / 2) + 1)]]
g1_test = input_data.loc[:,
          group_split1[(int(split / 2) if len(group_split1) % 2 == 0 else (int(split / 2) + 1)):split]]
g2 = input_data.loc[:, [x for x in list(input_data) if x not in group_split1]]
split2 = g2.shape[1]
g2_train = g2.iloc[:, 0:int(split2 / 2) if len(group_split1) % 2 == 0 else (int(split2 / 2) + 1)]
g2_test = g2.iloc[:, (int(split2 / 2) if len(group_split1) % 2 == 0 else (int(split2 / 2) + 1)):split2]

# amplify the input data if the input data is too small:
amp1 = (int((g2_train.shape[1] - split) / int(split / 2))) if g2_train.shape[
                                                                  1] >= split else 1  # if g1 is less than g2 amplify
g1_train = pd.DataFrame(pd.np.tile(g1_train, (1, amp1)), index=g2_train.index)
amp2 = (int((g2_test.shape[1] - split) / int(split / 2))) if g2_test.shape[1] >= split else 1
g1_test = pd.DataFrame(pd.np.tile(g1_test, (1, amp2)), index=g2_test.index)
regroup_train = pd.concat([g1_train, g2_train], axis=1, join_axes=[g1_train.index])
regroup_train = numpy.transpose(regroup_train.as_matrix())

regroup_test = pd.concat([g1_test, g2_test], axis=1, join_axes=[g1_test.index])
regroup_test = numpy.transpose(regroup_test.as_matrix())

# create labels
split3 = g1_train.shape[1]
labels_train = numpy.zeros(shape=[len(regroup_train), 1])
labels_train[0:split3] = 1

split4 = g1_test.shape[1]
labels_test = numpy.zeros(shape=[len(regroup_test), 1])
labels_test[0:split4] = 1

# change all nan to 0
regroup_train = numpy.nan_to_num(regroup_train)
regroup_test = numpy.nan_to_num(regroup_test)
labels_train = numpy.nan_to_num(labels_train)
labels_test = numpy.nan_to_num(labels_test)

#######################################################################################################################
#####################################################NEURAL NETWORK####################################################
#######################################################################################################################

# define variables
trainingtimes = 1000

# create model
x = tf.placeholder(tf.float32, [None, 54781])
w = tf.Variable(tf.zeros([54781, 1]))
b = tf.Variable(tf.zeros([1]))
# define linear regression model, loss function
y = tf.nn.sigmoid((tf.matmul(x, w) + b))

# define correct training group
ytt = tf.placeholder(tf.float32, [None, 1])

# define cross optimizer and cost function
mse = tf.reduce_mean(tf.losses.mean_squared_error(y, ytt))

# train step
train_step = tf.train.GradientDescentOptimizer(learning_rate=0.3).minimize(mse)

sess = tf.InteractiveSession()
tf.global_variables_initializer().run()

for i in range(trainingtimes):
    sess.run(train_step, feed_dict={x: regroup_train, ytt: labels_train})
    if i % 100 == 0:
        print(sess.run(mse, feed_dict={x: regroup_train, ytt: labels_train}))

这里有几个关键问题。您试图定义一个1层神经网络,这听起来很适合这个问题。但是你的隐藏层比它应该的要大得多。用更小的重量尺寸做实验。试试128、256、512这样的数字(不需要二的幂)

而且,您的输入维度相当高。我知道有人正在研究一个非常类似的癌症基因表达问题,大约有60000个基因表达和10000个样本。她使用PCA降低了数据的维数,同时保持了约90%的方差(她用不同的值进行了实验,发现这是最佳的)

这改善了结果。神经网络可以过拟合,PCA降维是有益的。在她的实验中,1层完全连接网络的性能也超过了对数回归和XGA boost

她正在解决这个问题的另外两件事,也可能适用于你:

  • 多任务学习被证明能提高学习效果。她最初有4个不同的神经网络(4个输出给定相同的数据),当她将它们组合成1个具有4个损失函数的神经网络时,它改进了所有4个的结果
  • 代替PCA,您可以使用自动编码器作为另一种降维技术。完全可以将自动编码器连接到此网络,并结合丢失功能对其进行训练。虽然我还没有实际尝试过,所以我只能说我希望它能在理论上改善结果。PCA方法将更快地进行测试,因此我将从这里开始

您能描述一下分类器的体系结构吗?另外,请发布一个示例代码,说明您正在做什么,这不是问题!我会把代码放在上面。谢谢你完成了!请看一看,如果有什么让我困惑的地方,请告诉我。非常感谢。好的,抛开所有与tensorflow无关的预处理代码不谈,您应该真正避免手动实现神经网络的层,而是依赖于预先制作的层。在输入占位符后面有一个
密集的
层,激活了
sigmoid
,然后在
MSE
计算中结束。我的建议是用这些术语重写代码,并在这里进行更新。非常感谢。如果你能给我一个如何使用tf.layers*编码的例子,我不知道这是否可能。谢谢你的帮助!哇,谢谢你的建议。我要查很多你说的东西,但我会看看我能从中得到什么,希望能给你回复!非常感谢。我想知道你什么时候说使用更小的重量尺寸。你是说把我的微阵列数据缩小到一些选定的基因而不是使用整个数据集吗?我实际上是说神经网络的隐藏层。但我现在注意到你实际上只是在做一个线性回归分类器。您没有隐藏层。这样做很可能会有所帮助。另外,如果你使用0/1分类器,你会得到比平方误差更好的交叉熵损失结果(如果回归平方误差是正确的)。在任何情况下,缩小你的输入维度可能是一个合理的开始改进的地方。我也会研究这一点!谢谢你的建议。我想知道。如果我要做PCA并使用PCA dim1和PCA DIM2作为我的两个轴。那样的话,我就只有两个砝码了吗?