在看过吴恩达CNN 前两周的课,并且完成了课后作业后,对CNN的实现有了具象的了解。整体的实现过程大概分为以下几部分:
1. 数据准备。我将数据组织成多维数组的形式,关于tfrecord是什么还未去了解,这里就按照cousera课后作业的形式,模仿着来实现。
P.S. 自己的图片可能比较大,也可能大小不一,因此,将图片做适当处理,整理成 input [ m, n_H, n_W, n_C ] 。m表示样本总数,n_H, n_W表示图片的高和宽, n_C表示图片的通道数,彩色RGB通道数是3,灰度图则是1(这里的1不确定该如何理解:是三个通道具有相同的值?还是一个通道有值,其他两个通道值都是0?)。调整图片大小的程序如下:
image_raw_data = tf.gfile.GFile(image_list[i],'r').read()
img_data = tf.image.decode_jpeg(image_raw_data)
#第一个参数为原始图像,第二个参数为图像大小,第三个参数给出了指定的算法
resized = tf.image.resize_images(img_data, [64,64],method=0)
resized = np.asarray(resized.eval(),dtype='uint8')
2. 如过你的图片是分好类的,那么读取进来后需要打乱顺序,另外,标签与图片要一一对应。
temp = np.array([class_train,label_train]) # 2*140
temp = temp.transpose() # 140*2
#打乱顺序
np.random.shuffle(temp)
#第一列是image,第二列是label
image_list = list(temp[:,0])
label_list = list(temp[:,1])
或者
permutation = list(np.random.permutation(m)) #生成一个 从0到m打乱的序列
shuffled_X = X[permutation,:,:,:]
shuffled_Y = Y[permutation,:]
3. 准备好数据,划分好训练集和测试集,归一化处理。此时可以打印shape,检查是否是我们需要的维度
X_train = X_train/255.
X_test = X_test/255.
print ("number of training examples = " + str(X_train.shape[0]))
print ("number of test examples = " + str(X_test.shape[0]))
print ("X_train shape: " + str(X_train.shape))
print ("Y_train shape: " + str(Y_train.shape))
print ("X_test shape: " + str(X_test.shape))
print ("Y_test shape: " + str(Y_test.shape))
4. 以下便是仿照Andrew的课后作业来实现CNN的流程,其中需要的根据自己的情况进行修改的地方有:输出向量的维数(即分类数)以及算法的各参数。比如minibatch_size
要根据你的训练集大小来设置,样本数不多的话,size也适当取小一点,另外如果size很小,可适当增加学习的代数。最后代价的曲线如下:
完整代码请移步GitHub 点击打开链接