深度学习:Keras快速开发入门(一)Mnist手写数字实例,TypeError: softmax() got an unexpected keyword argument ‘axis’

这本书基本抄袭了keras中文文档,建议配合keras中文文档一起使用
github下载keras中文文档中的示例程序mnist_cnn.py,然后自己添加注释。

代码如下

from __future__ import print_function
import keras
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras import backend as K

batch_size = 128 #batch尺寸,一般基于Mini-batch
num_classes = 10
epochs = 12      #训练过程中整个数据集将被循环的次数

# 输入图像的维度
img_rows, img_cols = 28, 28

# Keras中的Mnist数据集已经被划分成60000个训练集,10000个测试集的形式。
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 注意数据组织方式,可通过代码K.image_data_format()返回得到数据组织方式
# 无论是哪种组织方式都是可行的,只要全局保持一致即可
# 对2D数据,“channels_first”假定维度顺序为(channnels,rows,cols)
#          "channels_last"假定维度顺序为(rows,cols,channnels)
# 对3D数据,“channels_first”假定维度顺序为(channnels,dim1,dim2,dim3)
#          "channels_last"假定维度顺序为(dim1,dim2,dim3,channnels)
if K.image_data_format() == 'channels_first':
    # 通道维靠前,表达形式是(60000, 1, 28, 28)
    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:
    # 通道维靠后,表达形式是(60000, 28, 28, 1)
    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_test的数据格式转换为float32存储,并进行归一化处理
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

# 将类别向量(从0到nb_classes的整数向量)映射为二值类别矩阵
# 用于应用到以categorical_crossentropy为目标函数的模型中
# 相当于将向量用one-hot形式重新编码
# 参数1:类别向量;参数2:总共类别数
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

# 利用Keras建立Sequential(序贯)模型
model = Sequential()
# 将一些网络层通过.add()堆叠起来,就构成了一个模型
# Conv2D:二维卷积层,即对图像的空域卷积。该层对二维输入进行滑动窗卷积
# 当使用该层作为第一层时,应提供input_shape参数
# input_shape=(1, 28, 28)代表28*28的灰色图像
model.add(Conv2D(32, kernel_size=(3, 3),
                 activation='relu',
                 input_shape=input_shape))
# 三个参数分别为:卷积核的数目(即输出维度)
# 卷积核的宽度和长度;激活函数
model.add(Conv2D(64, (3, 3), activation='relu'))
# MaxPooling2D:池化层,为空域信号施加最大值池化
# pool_size:整数或长为2的整数tuple(元组(tensor,value)的列表value应是Numpy的数组),
#            代表在两个方向(竖直,水平)上的下采样因子
# 如取(2,2)将使图片在两个维度上均变长为原来的一半
model.add(MaxPooling2D(pool_size=(2, 2)))
# Dropout层:为输入数据施加Dropout。Dropout将在训练过程中每次更新参数时
# 随机断开一定百分比(rate)的输入神经元,Dropout层用于防止过拟合
model.add(Dropout(0.25))
# Flatten层:用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡
# Flatten不影响batch的大小
model.add(Flatten())
# Dense就是常用的全连接层,所实现的运算时output=activation(dot(input,kernel)+bias)
# 其中activation是逐元素计算的激活函数,kernel是本层的权值矩阵
# bias为偏置向量,只有当use_bias=True才会添加
# 如果本层的输入数据的维度大于2,则会先被压成与kernel相匹配的大小
# 其中,第一个参数units:大于0的整数,代表该层的输出维度
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.5))
# 预定义激活函数softmax:对输入数据的最后一维进行softmax
# softmax(x):返回张量的softmax值
# 输入数据应形如(nb_samples, nb_timesteps, nv_dims)或(nb_samples, nb_dims)
model.add(Dense(num_classes, activation='softmax'))

# 完成模型的搭建好,需要使用.compile()方法来编译模型。compile接收三个参数
# 优化器optimizer:指定已预定义的优化器名,如rmsprop,或一个optimizer类的对象
# 损失函数loss:该参数为模型视图最小化的目标函数,它可为预定义的损失函数名
#              如categorical_crossentropy、mse,也可以为一个损失函数
# 指标列表metrics:对分类问题,我们一般将该列表设置为metrics=['accuracy']
#                 指标可以是一个预定义指标的名字,也可以是一个用户定制的函数。
#         指标函数应该返回单个张量,或一个完成metric_name->metric_value映射的字典
model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])

# 完成模型编译后,在训练数据上按batch进行一定次数的迭代来训练网络
# 训练模型时指定的参数如下
# 参数1:输入数据。如果模型只有一个输入,那么参数1的类型是numpy array
#   如果模型有多个输入,那么x的类型应当是list,list元素对应于各个输入的numpy array
# 参数2:标签,numpy array
# batch_size:指定梯度下降时,每个batch包含的样本数
#             训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步
# epochs:训练的轮数,即迭代此数
# verbose:日志显示,0为不在标准输出流输出日志信息,1位输出进度条记录
#                   2为rpoch输出一行记录
# validation_data:形式为(x,y)的tuple,指定的验证集。此参数会覆盖validation_spilt
model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(x_test, y_test))

# 对模型进行评估,看看是否满足要求
# evaluate:按batch计算在某些输入数据上模型的误差
# 参数1:输入数据,与fit一样,是numpy array或numpy array的list
# 参数2:标签,numpy array
# verbose:含义同fit的同名参数,但只能取0或1
# evaluate函数返回一个测试误差的标量值(如果模型没有其他评价指标)
# 或一个标量的list(如果模型有其他的评价指标)。model.metrics_names将给出list各值含义
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

出现问题

然后运行出现了问题:TypeError: softmax() got an unexpected keyword argument ‘axis’
原因应该是tensorflow和keras版本不兼容产生的
在这里插入图片描述
参考:https://www.baidu.com/link?url=ryFxEdP32k9rQGF6dIwmm_b-ic0pCzgcGtUkrJ2RBIAfhoJHz5LCbxlOIF0rtL11lvcUidCJtme0yhtgfa5TbhfuIPcw0uUyStGIgZDbz7_&wd=&eqid=952ffcb80003ea87000000065d08a4dd

解决方法1:

我们的源码并没有用到错误中出现的方法,但是既然出现这个问题,就说明安装的keras库可能跟TensorFlow库不兼容,根据错误找到tensorflow_backend.py中第3231行,发现此处调用了tensorflow的nn中的softmax方法,参数问题就出在这里。
在这里插入图片描述
找到这个方法声明的位置(nn_ops.py的1461行,版本不同,位置可能不同,我使用的是Anaconda Navigator中Home里面的Spyder,ctrl+鼠标左键点击tensorflow_backend.py中第3231行会打开nn_ops.py),发现声明中的参数的确的确没有axis,但是有一个dim是跟axis类型相似的,所以将tensorflow_backend.py中第3231行的axis=axis修改为dim=axis即可解决问题。
在这里插入图片描述
这种不知道以后会不会有啥问题,可能到时候又要改回来

解决方法2:

分别查看tensorflow版本和keras版本
查看keras版本,打开Anaconda Navigator–>Evironments–>tensorflow–>箭头点开选择Open with Python–>终端输入import keras–>继续输入print(keras._ version _),可以看到版本是2.2.4
查看tensorflow版本:继续输入import tensorflow as tf–>tf._version _,版本是1.3.0-rc0
在这里插入图片描述
解决方法当然是升级tensorflow版本

输出结果

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值