1. 程式人生 > >CNN學習之旅[1]

CNN學習之旅[1]

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()