BigDL 运行 LeNet5 on MNIST 发现的 BUG

1. 部署Hadoop 2.8.3, Spark 2.1.0

2. 编译和部署BigDL

    编译command: ./make-dist.sh -P spark_2.x

3. 运行脚本LeNet5-on-MNIST-example.sh:

#!/bin/bash
$SPARK_HOME/bin/spark-submit \
    --master yarn \
    --deploy-mode client \
    --driver-memory 2g \
    --num-executors 6 \
    --executor-cores 1 \
    --executor-memory 10g \
    --driver-class-path ./bigdl-master/lib/bigdl-0.5.0-SNAPSHOT-jar-with-dependencies.jar \
    --class com.intel.analytics.bigdl.models.lenet.Train \
    ./bigdl-master/lib/bigdl-0.5.0-SNAPSHOT-jar-with-dependencies.jar \
    -f hdfs://hadoop1master:8020/BigDL/Dataset/MNIST \
    -b 60000 \
    -e 10 \

    --checkpoint /opt/modules/bigdl-master-angelps/checkpoint-models

4. 出现错误:


5. 发现原因

5.1 

DistriOptimizer.scala: 899 的代码是

val parameters = AllReduceParameter.newParameter(partitionNum, size)

java.lang.ExceptionInInitializerError表示在静态初始化块中出现了异常,这里的静态object就是AllReduceParameter

5.2

静态初始化块异常的代码是AllReduceParameter.scala:47

java.lang.IllegalArgumentException 表示变量出现了异常

再深入代码会发现抛出异常的代码位于 ThreadPoolExecutor.java


说明异常的原因是maximumPoolSize <= 0, 也就是ComputePoolSize <=0

5.3 

ComputePoolSize的计算方法为:

private val computePoolSize: Int = System.getProperty("bigdl.Parameter.computePoolSize",
  (Runtime.getRuntime().availableProcessors() / 2).toString).toInt

可以看出当user没有指定参数  bigdl.Parameter.computePoolSize 

以及机器的core = 1 (core = Runtime.getRuntime().availableProcessors() )

ComputePoolSize = 0

从而导致异常

6. 修改方法

private val computePoolSize: Int = Math.max(System.getProperty("bigdl.Parameter.computePoolSize",
  (Runtime.getRuntime().availableProcessors() / 2).toString).toInt, 1)
 

其他:

之前运行时出现过guava 版本冲突导致的错误

发现default情况下:

Hadoop2.8.3 的 guava 是 11.0.2

Spark2.1.0 的 guava 是 14.0.1

BigDL 的 guava 是 11.0.2

于是后来编译BigDL时把pom.xml 和 spark/dl/pom.xml 中的guava版本改为了14.0.1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是基于Python实现LeNet5MNIST手写字体识别的步骤: 1. 数据准备:下载MNIST数据集,包括训练集和测试集。可以使用Python库`tensorflow_datasets`来下载和加载MNIST数据集。 ```python import tensorflow_datasets as tfds # 加载MNIST数据集 mnist_dataset = tfds.load(name="mnist", split=tfds.Split.TRAIN) mnist_test_dataset = tfds.load(name="mnist", split=tfds.Split.TEST) ``` 2. 数据预处理:对数据进行标准化处理,并将训练集和测试集转换为合适的格式。 ```python def preprocess_data(data): # 将数据转换为浮点数类型 data['image'] = tf.cast(data['image'], tf.float32) # 标准化处理 data['image'] = tf.divide(data['image'], 255.0) # 调整形状 data['image'] = tf.reshape(data['image'], [-1, 28, 28, 1]) # 将标签转换为One-hot编码 data['label'] = tf.one_hot(data['label'], depth=10) return data # 对训练集和测试集进行预处理 mnist_dataset = mnist_dataset.map(preprocess_data) mnist_test_dataset = mnist_test_dataset.map(preprocess_data) # 将训练集转换为可迭代的数据集 batch_size = 32 mnist_dataset = mnist_dataset.batch(batch_size) # 将测试集转换为可迭代的数据集 mnist_test_dataset = mnist_test_dataset.batch(batch_size) ``` 3. 构建LeNet5模型:使用TensorFlow构建LeNet5模型,包括卷积层、池化层和全连接层。 ```python from tensorflow.keras import layers, models # 构建LeNet5模型 model = models.Sequential([ layers.Conv2D(filters=6, kernel_size=(5, 5), activation='relu', input_shape=(28, 28, 1)), layers.MaxPooling2D(pool_size=(2, 2)), layers.Conv2D(filters=16, kernel_size=(5, 5), activation='relu'), layers.MaxPooling2D(pool_size=(2, 2)), layers.Flatten(), layers.Dense(units=120, activation='relu'), layers.Dense(units=84, activation='relu'), layers.Dense(units=10, activation='softmax') ]) ``` 4. 编译模型:定义损失函数、优化器和评估指标。 ```python # 定义损失函数、优化器和评估指标 model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) ``` 5. 训练模型:使用训练训练模型,并在测试集上进行评估。 ```python epochs = 10 history = model.fit(mnist_dataset, epochs=epochs, validation_data=mnist_test_dataset) ``` 6. 可视化训练过程:使用Matplotlib库可视化训练过程。 ```python import matplotlib.pyplot as plt # 可视化训练过程 plt.plot(history.history['accuracy'], label='training accuracy') plt.plot(history.history['val_accuracy'], label='validation accuracy') plt.title('Training and Validation Accuracy') plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.legend() plt.show() ``` 7. 预测结果:使用训练好的模型对新的手写数字进行预测。 ```python import numpy as np # 加载新的手写数字图片 new_image = plt.imread('new_image.png') # 将图片转换为灰度图像 new_image = np.dot(new_image[...,:3], [0.299, 0.587, 0.114]) # 调整形状 new_image = np.reshape(new_image, (1, 28, 28, 1)) # 标准化处理 new_image = new_image / 255.0 # 对新的手写数字进行预测 prediction = model.predict(new_image) # 打印预测结果 print(np.argmax(prediction)) ``` 以上就是基于Python实现LeNet5MNIST手写字体识别的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值