使用简单的Keras 的序贯模型
大的逻辑结构:model = Sequential() -->model.add() -->model.compile()–>model.fit()–>model.evaluate()
model = Sequtntial()没啥好说的了
model.add():
Conv2D()–>MaxPooling2D()–>Dropout() -->Flatten()–>Dense()
Conv2D():
卷积核数目,kernel_size,activation,input_shape(第一层要)
32,(3,3),‘relu’,input_shape(大段代码: ‘mnist.npz’ (到这步之前以后也要拓展)–>load进来–>reshape–>astype–> /=255–>keras.utils.to_categorical–>得到最终的(x_train, y_train), (x_test, y_test))
input_shape = (img_rows,img_cols,1) if ‘channels last’ (图像的行数,图像的列数,图像的通道数)
**总结:**activation = ‘softmax’ 只用于最后一层全连接层,卷积层一般用relu
送入全连接层之前要加一层Flatten()
model.compile():
loss —>optimizer —>metrics
keras.losses.categroical_crossentropy ,keras.optimizers.Adadleta(),[‘accuracy’]
model.fit():
x_train,y_train -->batch_size—>epoches–>validation_data=(x_test,y_test)
model.evaluate():
x_test,y_test
有了大概的主逻辑框架,下面手动编写代码了
#第一步:
model = model.Senqutial() # mode ?导入
import keras
#第二步:加层
model.add(Conv2D(32,(3,3),activation='relu',input_shape =input_shape)) #input_shape? 看下面
#input_shape = (img_rows,img_clos,1) if "channels last
#model.add(MaxPooling((2,2)))
model.add(Conv2D(64,(3,3),activation='relu'))
model.add(MaxPooling((2,2))) #更正:MaxPooling2D,少了2D
model.add(Faltten())
moldel.add(Dense(128,activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(num_classes,activation='softmax')
#第三步:
model.compile(loss=keras.losses.categorical_crossentropy,
optimizer = keras.optimizer.Adadelta(),
metrics = ['accuracy'])
#第四步:
model.fit(x_train,y_train,batch_size=batch_size,epoches=epoches,verbose=2,validation_data=(x_test,y_test))
#第五步:
model.evaluate(x_test,y_test,verbose=0)
#模型搭建部分弄好了之后,开始加载数据,数据归一化
(x_tain,y_train),(x_test,y_test) = mnist.loda_data('mnist.npz')
if K.image_data_format() == 'channels first':
x_train = x_train.reshape([batch_size,1,img_rows,img_cols])
x_test = x_test.reshape([batch_size,1,img_rows,img_cols])
input_shape = [1,img_rows,img_cols]
else:
x_train = x_train.reshape([batch_size,img_rows,img_cols,1])
x_test = x_test.reshape([batch_size,img_rows,img_cols,1])
input_shape = [img_rows,img_cols,1]
x_train = x_train.astype('float32')
x_test = x_test.astype('float32') #更正,第一遍写的这两块的先后顺序弄反了
x_train /=255
x_test /=255
y_train = keras.utils.to_catagorical(y_train,num_classes)
y_test = keras.utils.to_categorical(y_test,num_classes)
上面那些代码都使用到了哪些包,导入进来
from __future__ import print_function
import keras
from keras.datasets import mnist
from keras.model import Sequential
from keras.layers import Conv2D , Dense , MaxPooling2D,Flatten,Dropout
from keras import backend as K
#定义一些参数
num_classes = 10
epoches = 20
batch_size = 64
完整正确版本:
#导入需要的包
from __future__ import print_function
import keras
from keras.models import Sequential
from keras.layers import Dense , Conv2D,MaxPooling2D,Flatten,Dropout
from keras.datasets import mnist
from keras import backend as K
#定义好一些参数
batch_size = 64
num_classes = 10
epochs = 12
# input image dimensions
img_rows, img_cols = 28, 28
#加载数据
(x_train ,y_train),(x_test,y_test) = mnist.load_data(path='mnist.npz') #选中,go_to_definiation ,把下载#的代码去掉
if K.image_data_format() == 'channels_first':
x_train = x_train.reshape([x_train.shape[0],1,img_rows,img_cols])
x_test = x_test.reshape([x_test.shape[0],1,img_rows,img_cols])
input_shape = [1,img_rows,img_cols]
else:
x_train = x_train.reshape([x_train.shape[0],img_rows,img_cols,1])
x_test = x_test.reshape([x_test.shape[0],img_rows, img_cols,1])
input_shape = [img_rows,img_cols,1]
#单精度的数据类型更利于深度学习的计算
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
#像素值都归一化到0-1之间
x_train /= 255
x_test /= 255
#对标签数据进行独热 编码
y_train = keras.utils.to_categorical(y_train,num_classes)
y_test = keras.utils.to_categorical(y_test , num_classes)
#构造模型了
model = Sequential() #更正:不是model.Sequential()
model.add(Conv2D(32,kernel_size =(3,3),activation='relu',input_shape = input_shape))
model.add(Conv2D(64,kernel_size=(3,3),activation='relu'))
model.add(MaxPooling2D(pool_size=(2,2))) #更正:这里是pool_size 不是kernel_size
model.add(Flatten())
model.add(Dense(128,activation='relu'))
model.add(Dropout(0.25))
model.add(Dense(num_classes,activation='softmax'))
model.compile(loss = keras.losses.categorical_crossentropy,optimizer = keras.optimizers.Adadelta(),metrics=['accuracy']) #这里的optimizers 有s
model.fit(x_train,y_train,batch_size = batch_size ,epochs = epochs,verbose=2,validation_data=(x_test,y_test)) #注意是epochs 不是es
score = model.evaluate(x_test,y_test,verbose=0)
print('Test Loss:', score[0])
print('Test Accuarcy:', score[1])
总结:x_train,y_train 经过reshape好形状后[样本数,通道,img_rows,img_cols]
直接就可以给model.fit()了
神经网络第一层得有input_shape ,即图片加上通道的shape