CNN學習之旅[1]
阿新 • • 發佈:2019-02-15
kaggle上有一個一百萬美金的比賽,大概是用CT圖來判斷一個人是否有癌症。資料量( 提取後訓練資料80+G )很大,但是這不能影響參加比賽的熱情。通過修改前一篇部落格的程式碼,構建了一個針對這個比賽的模型(資料的預處理在比賽網站上有一個人分享了一段很好的程式碼,所以基本上在資料提取上不用怎麼花時間。)比賽連結
但是在訓練的時候,總是報錯
E c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\stream_executor\cuda\cuda_blas.cc:372] W c:\tf_jenkins\home\workspace\release-win\device\gpu\os\windows\tensorflow\stream_executor\stream.cc:1390] attempting to perform BLAS operation using StreamExecutor without BLAS support
後來利用google, stackoverflow, github大致判斷為GPU視訊記憶體不足,無法進行計算,後來又不斷刪減資料,結果最後還是無法執行。抱著試一試的心態,用了沒有GPU加速的tensorflow,結果發現,記憶體直接飆升到12G,CPU利用率一直為100%,而且,12G根本不夠,開始往硬碟上寫虛擬記憶體。最後只能不得已而放棄。
比賽今天截止。現把程式碼貼出來,希望有一天能有好的硬體試一下。
# -*- coding: utf-8 -*- from __future__ import absolute_import from __future__ import division from __future__ import print_function import tensorflow as tf from tensorflow.contrib import learn from tensorflow.contrib.learn.python.learn.estimators import model_fn as model_fn_lib import numpy as np import pandas as pd from six.moves import cPickle as pickle PRE_PATH = 'E:\kaggle\club\stage1_sample_submission.csv\submission.csv' TRAIN_PATH = 'E:\kaggle\club\stage1_labels.csv\stage1_labels.csv' Trains = pd.read_csv(TRAIN_PATH) Train_name = np.array(Trains['id'][:30]) Train_labels = np.array(Trains['cancer'][:30]) Test_name = np.array(Trains['id'][30:35]) Test_labels = np.array(Trains['cancer'][30:35]) Pre_name = np.array(pd.read_csv(PRE_PATH)['id'][:20]) def cnn_model_fn(fearures, labels, mode): input_layer = tf.reshape(fearures, [-1, 140, 140, 140, 1]) conv1 = tf.layers.conv3d( inputs=input_layer, filters=1, kernel_size=[50, 50, 50], padding='same', activation=tf.nn.relu) pool1 = tf.layers.max_pooling3d(inputs=conv1, pool_size=[10, 10, 10], strides=6) conv2 = tf.layers.conv3d( inputs=pool1, filters=2, kernel_size=[50, 50, 50], padding='same', activation=tf.nn.relu) pool2 = tf.layers.max_pooling3d(inputs=conv2, pool_size=[10, 10, 10], strides=6) pool2_flat = tf.reshape(pool2, [-1, 54]) dense = tf.layers.dense(inputs=pool2_flat, units=8, activation=tf.nn.relu) dropout = tf.layers.dropout(inputs=dense, rate=0.4, training=mode == learn.ModeKeys.TRAIN) logits = tf.layers.dense(inputs=dropout, units=10) loss = None train_op = None if mode != learn.ModeKeys.INFER: onehot_labels = tf.one_hot(indices=tf.cast(labels, tf.int32), depth=10) loss = tf.losses.softmax_cross_entropy(onehot_labels=onehot_labels, logits=logits) if mode == learn.ModeKeys.TRAIN: train_op = tf.contrib.layers.optimize_loss( loss=loss, global_step=tf.contrib.framework.get_global_step(), learning_rate=0.001, optimizer='SGD' ) predictions = { 'class': tf.argmax(input=logits, axis=1), 'probabilities': tf.nn.softmax(logits, name='softmax_tensor') } return model_fn_lib.ModelFnOps(mode=mode, predictions=predictions, loss=loss, train_op=train_op) def main(unused_argv): # dataload pkl_file = open(r'E:\kaggle\club\pickle_file.pickle', 'rb') p = pickle.load(pkl_file) train_data, eval_data = p['Train_data'].reshape(30, -1)[:1], p['Test_data'].reshape(5, -1)[:1] train_labels = Train_labels[:1] eval_labels = Test_labels[:1] club_classifier = learn.Estimator( model_fn=cnn_model_fn, model_dir='/tmp/club_convnet_model' ) tensors_to_log = {'probabilities': 'softmax_tensor'} logging_hook = tf.train.LoggingTensorHook(tensors=tensors_to_log, every_n_iter=50) culb_classifier.fit(x=train_data, y=train_labels, batch_size=5, steps=5, monitors=[logging_hook]) metrics = { 'accuray': learn.MetricSpec( metric_fn=tf.metrics.accuracy, prediction_key='class' ) } eval_results = club_classifier.evaluate( x=eval_data, y=eval_labels, metrics=metrics ) print(eval_results) print("predict") if __name__ == "__main__": config = tf.ConfigProto() config.gpu_options.allow_growth = True session = tf.Session(config=config) tf.app.run()